svn commit: r190483 - head/sys/dev/ed

Warner Losh imp at FreeBSD.org
Fri Mar 27 21:56:57 PDT 2009


Author: imp
Date: Sat Mar 28 04:56:56 2009
New Revision: 190483
URL: http://svn.freebsd.org/changeset/base/190483

Log:
  It turns out that the Toshiba LANCT00A PC Card is really like the
  Toshiba PCETC ISA card, and even has the same board type code in the
  card ID (0x14).  So, for this card, call ed_probe_WD80x3_generic after
  setting things up apropriately.  This makes the card attach and kinda
  work (I'm seeing panics in sbdrop).  Since history has shown that the
  WD80x3 probe routine is dangerous, only do it for this card.  Also,
  disable the memory range check to make sure it is an valid ISA memory.
  I think that it is bogus, but I'm not 100% sure, for these cards.
  
  I removed probing for the WD80x3 in 2005 when I added support for the
  AX88x90 and DL100xx cards since none of my cards had ever matched it
  and PAO3 removed it and none of the cards in their database died.
  
  It is possible there are other quirks about this card too, since no
  other open source OS supports it, or even claims to support it.  But
  it was a fun half hour hack...

Modified:
  head/sys/dev/ed/if_ed_pccard.c
  head/sys/dev/ed/if_ed_wd80x3.c
  head/sys/dev/ed/if_edvar.h

Modified: head/sys/dev/ed/if_ed_pccard.c
==============================================================================
--- head/sys/dev/ed/if_ed_pccard.c	Sat Mar 28 04:00:46 2009	(r190482)
+++ head/sys/dev/ed/if_ed_pccard.c	Sat Mar 28 04:56:56 2009	(r190483)
@@ -126,6 +126,7 @@ static const struct ed_product {
 #define	NE2000DVF_DL100XX	0x0001		/* chip is D-Link DL10019/22 */
 #define	NE2000DVF_AX88X90	0x0002		/* chip is ASIX AX88[17]90 */
 #define NE2000DVF_TC5299J	0x0004		/* chip is Tamarack TC5299J */
+#define NE2000DVF_TOSHIBA	0x0008		/* Toshiba DP83902A */
 #define NE2000DVF_ENADDR	0x0100		/* Get MAC from attr mem */
 #define NE2000DVF_ANYFUNC	0x0200		/* Allow any function type */
 #define NE2000DVF_MODEM		0x0400		/* Has a modem/serial */
@@ -226,7 +227,7 @@ static const struct ed_product {
 	{ PCMCIA_CARD(TELECOMDEVICE, LM5LT), 0 },
 	{ PCMCIA_CARD(TELECOMDEVICE, TCD_HPC100), NE2000DVF_AX88X90},
 	{ PCMCIA_CARD(TJ, PTJ_LAN_T), 0 },
-	{ PCMCIA_CARD(TOSHIBA2, LANCT00A), NE2000DVF_ANYFUNC}, /* NG */
+	{ PCMCIA_CARD(TOSHIBA2, LANCT00A), NE2000DVF_ANYFUNC | NE2000DVF_TOSHIBA},
 	{ PCMCIA_CARD(ZONET, ZEN), 0},
 	{ { NULL } }
 };
@@ -434,9 +435,10 @@ ed_pccard_attach(device_t dev)
 	u_char sum;
 	u_char enaddr[ETHER_ADDR_LEN];
 	const struct ed_product *pp;
-	int	error, i;
+	int	error, i, flags;
 	struct ed_softc *sc = device_get_softc(dev);
 	u_long size;
+	static uint16_t *intr_vals[] = {NULL, NULL};
 
 	if ((pp = (const struct ed_product *) pccard_product_lookup(dev, 
 	    (const struct pccard_product *) ed_pccard_products,
@@ -474,6 +476,7 @@ ed_pccard_attach(device_t dev)
 	sc->asic_offset = ED_NOVELL_ASIC_OFFSET;
 	sc->nic_offset  = ED_NOVELL_NIC_OFFSET;
 	error = ENXIO;
+	flags = device_get_flags(dev);
 	if (error != 0)
 		error = ed_pccard_dl100xx(dev, pp);
 	if (error != 0)
@@ -481,7 +484,15 @@ ed_pccard_attach(device_t dev)
 	if (error != 0)
 		error = ed_pccard_tc5299j(dev, pp);
 	if (error != 0)
-		error = ed_probe_Novell_generic(dev, device_get_flags(dev));
+		error = ed_probe_Novell_generic(dev, flags);
+	if (error != 0) {
+		if (pp->flags & NE2000DVF_TOSHIBA)
+			flags |= ED_FLAGS_TOSH_ETHER;
+		flags |= ED_FLAGS_PCCARD;
+		sc->asic_offset = ED_WD_ASIC_OFFSET;
+		sc->nic_offset  = ED_WD_NIC_OFFSET;
+		error = ed_probe_WD80x3_generic(dev, flags, intr_vals);
+	}
 	if (error)
 		goto bad;
 
@@ -502,7 +513,9 @@ ed_pccard_attach(device_t dev)
 	 * default value.  In all fails, we should fail the attach,
 	 * but don't right now.
 	 */
-	if (sc->chip_type == ED_CHIP_TYPE_DP8390) {
+	for (i = 0, sum = 0; i < ETHER_ADDR_LEN; i++)
+		sum |= sc->enaddr[i];
+	if (sc->chip_type == ED_CHIP_TYPE_DP8390 && sum == 0) {
 		pccard_get_ether(dev, enaddr);
 		if (bootverbose)
 			device_printf(dev, "CIS MAC %6D\n", enaddr, ":");

Modified: head/sys/dev/ed/if_ed_wd80x3.c
==============================================================================
--- head/sys/dev/ed/if_ed_wd80x3.c	Sat Mar 28 04:00:46 2009	(r190482)
+++ head/sys/dev/ed/if_ed_wd80x3.c	Sat Mar 28 04:56:56 2009	(r190483)
@@ -119,7 +119,6 @@ ed_probe_WD80x3_generic(device_t dev, in
 		sum += ed_asic_inb(sc, ED_WD_PROM + i);
 
 	if (sum != totalsum) {
-
 		/*
 		 * Checksum is invalid. This often happens with cheap WD8003E
 		 * clones.  In this case, the checksum byte (the eighth byte)
@@ -268,9 +267,11 @@ ed_probe_WD80x3_generic(device_t dev, in
 		printf("%x -> %x\n", i, ed_asic_inb(sc, i));
 #endif
 	pmem = rman_get_start(sc->mem_res);
-	error = ed_isa_mem_ok(dev, pmem, memsize);
-	if (error)
-		return (error);
+	if (!(flags & ED_FLAGS_PCCARD)) {
+		error = ed_isa_mem_ok(dev, pmem, memsize);
+		if (error)
+			return (error);
+	}
 
 	/*
 	 * (note that if the user specifies both of the following flags that

Modified: head/sys/dev/ed/if_edvar.h
==============================================================================
--- head/sys/dev/ed/if_edvar.h	Sat Mar 28 04:00:46 2009	(r190482)
+++ head/sys/dev/ed/if_edvar.h	Sat Mar 28 04:56:56 2009	(r190483)
@@ -267,6 +267,11 @@ extern devclass_t ed_devclass;
 #define ED_FLAGS_FORCE_PIO		0x0010
 
 /*
+ * This forces a PC Card, and disables ISA memory range checks
+ */
+#define ED_FLAGS_PCCARD			0x0020
+
+/*
  * These are flags describing the chip type.
  */
 #define ED_FLAGS_TOSH_ETHER		0x10000


More information about the svn-src-head mailing list