Date: Wed, 25 Aug 2010 02:03:48 +0000 (UTC) From: Warner Losh <imp@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r211792 - head/sys/dev/ed Message-ID: <201008250203.o7P23m2Z096117@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: imp Date: Wed Aug 25 02:03:48 2010 New Revision: 211792 URL: http://svn.freebsd.org/changeset/base/211792 Log: Prodded by Yongari, add support for Holtek HT80232. Add the device ID, plus the ability to force '16-bit mode' which really means NE-2000 mode. Other open source drivers suggest that the Holtek misbehaves if you allow the 8-bit probe. Also, all of the PCI chips emulate NE-2000ish cards, so always force 16-bit mode for memory transfers. PR: 84202 (patch not used) Modified: head/sys/dev/ed/if_ed_novell.c head/sys/dev/ed/if_ed_pci.c Modified: head/sys/dev/ed/if_ed_novell.c ============================================================================== --- head/sys/dev/ed/if_ed_novell.c Wed Aug 25 01:50:12 2010 (r211791) +++ head/sys/dev/ed/if_ed_novell.c Wed Aug 25 02:03:48 2010 (r211792) @@ -123,39 +123,50 @@ ed_probe_Novell_generic(device_t dev, in ed_nic_outb(sc, ED_P0_PSTART, 8192 / ED_PAGE_SIZE); ed_nic_outb(sc, ED_P0_PSTOP, 16384 / ED_PAGE_SIZE); - sc->isa16bit = 0; - /* - * Write a test pattern in byte mode. If this fails, then there - * probably isn't any memory at 8k - which likely means that the board - * is an NE2000. + * Some devices identify themselves. Some of those devices + * can't handle being probed, so we allow forcing a mode. If + * these flags are set, force it, otherwise probe. */ - ed_pio_writemem(sc, test_pattern, 8192, sizeof(test_pattern)); - ed_pio_readmem(sc, 8192, test_buffer, sizeof(test_pattern)); - - if (bcmp(test_pattern, test_buffer, sizeof(test_pattern)) == 0) { + if (flags & ED_FLAGS_FORCE_8BIT_MODE) { + sc->isa16bit = 0; sc->type = ED_TYPE_NE1000; sc->type_str = "NE1000"; - } else { - - /* Not an NE1000 - try NE2000 */ - ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS); - ed_nic_outb(sc, ED_P0_PSTART, 16384 / ED_PAGE_SIZE); - ed_nic_outb(sc, ED_P0_PSTOP, 32768 / ED_PAGE_SIZE); - + } else if (flags & ED_FLAGS_FORCE_16BIT_MODE) { sc->isa16bit = 1; - + sc->type = ED_TYPE_NE2000; + sc->type_str = "NE2000"; + } else { /* - * Write a test pattern in word mode. If this also fails, then - * we don't know what this board is. + * Write a test pattern in byte mode. If this fails, then there + * probably isn't any memory at 8k - which likely means that the board + * is an NE2000. */ - ed_pio_writemem(sc, test_pattern, 16384, sizeof(test_pattern)); - ed_pio_readmem(sc, 16384, test_buffer, sizeof(test_pattern)); + ed_pio_writemem(sc, test_pattern, 8192, sizeof(test_pattern)); + ed_pio_readmem(sc, 8192, test_buffer, sizeof(test_pattern)); + if (bcmp(test_pattern, test_buffer, sizeof(test_pattern)) == 0) { - sc->type = ED_TYPE_NE2000; - sc->type_str = "NE2000"; + sc->type = ED_TYPE_NE1000; + sc->type_str = "NE1000"; + sc->isa16bit = 0; } else { - return (ENXIO); + /* Not an NE1000 - try NE2000 */ + sc->isa16bit = 1; + ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS); + ed_nic_outb(sc, ED_P0_PSTART, 16384 / ED_PAGE_SIZE); + ed_nic_outb(sc, ED_P0_PSTOP, 32768 / ED_PAGE_SIZE); + /* + * Write a test pattern in word mode. If this also fails, then + * we don't know what this board is. + */ + ed_pio_writemem(sc, test_pattern, 16384, sizeof(test_pattern)); + ed_pio_readmem(sc, 16384, test_buffer, sizeof(test_pattern)); + if (bcmp(test_pattern, test_buffer, sizeof(test_pattern)) == 0) { + sc->type = ED_TYPE_NE2000; + sc->type_str = "NE2000"; + } else { + return (ENXIO); + } } } sc->chip_type = ED_CHIP_TYPE_DP8390; Modified: head/sys/dev/ed/if_ed_pci.c ============================================================================== --- head/sys/dev/ed/if_ed_pci.c Wed Aug 25 01:50:12 2010 (r211791) +++ head/sys/dev/ed/if_ed_pci.c Wed Aug 25 02:03:48 2010 (r211792) @@ -49,18 +49,19 @@ static struct _pcsid const char *desc; } pci_ids[] = { - { ED_RTL8029_PCI_ID, "RealTek 8029" }, /* Needs realtek full duplex */ - { 0x50004a14, "NetVin NV5000SC" }, - { 0x09401050, "ProLAN" }, { 0x140111f6, "Compex RL2000" }, + { 0x005812c3, "Holtek HT80232" }, { 0x30008e2e, "KTI ET32P2" }, - { 0x19808c4a, "Winbond W89C940" }, + { 0x50004a14, "NetVin NV5000SC" }, + { 0x09401050, "ProLAN" }, + { ED_RTL8029_PCI_ID, "RealTek 8029" }, /* Needs realtek full duplex */ { 0x0e3410bd, "Surecom NE-34" }, - { 0x09261106, "VIA VT86C926" }, /* only do 16-bit */ + { 0x09261106, "VIA VT86C926" }, + { 0x19808c4a, "Winbond W89C940" }, { 0x5a5a1050, "Winbond W89C940F" }, #if 0 - /* Holtek needs special lovin', disabled by default */ - { 0x005812c3, "Holtek HT80232" }, /* Only 16-bit I/O, Holtek fdx */ + /* some Holtek needs special lovin', disabled by default */ + /* The Holtek can report/do full duplex, but that's unimplemented */ { 0x559812c3, "Holtek HT80229" }, /* Only 32-bit I/O, Holtek fdx, STOP_PG_60? */ #endif { 0x00000000, NULL } @@ -87,7 +88,6 @@ static int ed_pci_attach(device_t dev) { struct ed_softc *sc = device_get_softc(dev); - int flags = 0; int error = ENXIO; /* @@ -96,9 +96,10 @@ ed_pci_attach(device_t dev) * are areally just generic ne-2000 cards. */ if (pci_get_devid(dev) == ED_RTL8029_PCI_ID) - error = ed_probe_RTL80x9(dev, PCIR_BAR(0), flags); + error = ed_probe_RTL80x9(dev, PCIR_BAR(0), 0); if (error) - error = ed_probe_Novell(dev, PCIR_BAR(0), flags); + error = ed_probe_Novell(dev, PCIR_BAR(0), + ED_FLAGS_FORCE_16BIT_MODE); if (error) { ed_release_resources(dev); return (error);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008250203.o7P23m2Z096117>