Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 26 Mar 2002 10:32:09 -0500
From:      Andrew Heybey <ath@niksun.com>
To:        freebsd-stable@freebsd.org
Subject:   if_le crashes 4.5-RELEASE kernel: PR 25650 and PR 18641 [PATCH]
Message-ID:  <200203261532.g2QFW9O02203@celis.niksun.com>

next in thread | raw e-mail | index | archive | help
When you ifconfig an "le" NIC card with an address, it makes
4.5-RELEASE crash.  This problem is discussed in PRs 25650 and PR
18641, though PR 25650 is marked as "closed: fixed".

Presumably, it would also panic a -CURRENT kernel though I do not
currently run CURRENT.

I have fixed the problem (at least it works for me) using the included
patch (against RELENG_4_5_0_RELEASE src/sys/i386/isa/if_le.c).  I
followed-up PR 18641 with the patch, and PR 25650 with a pointer to
18641.

I know this hardware is ancient, but there is no particular reason to
have it not work.  I have tested the patch with:

le0 at port 0x300-0x31f iomem 0xd0000-0xd07ff irq 5 on isa0
le0: DE205-AC ethernet address 08:00:2b:9f:39:d4

andrew

Index: if_le.c
===================================================================
RCS file: /usr/local/repos/fbsdcvs/src/sys/i386/isa/if_le.c,v
retrieving revision 1.56.2.3
diff -u -u -r1.56.2.3 if_le.c
--- if_le.c	2001/11/02 17:48:00	1.56.2.3
+++ if_le.c	2002/03/26 15:29:44
@@ -191,7 +191,6 @@
  */
 struct le_softc {
     struct arpcom le_ac;		/* Common Ethernet/ARP Structure */
-    void (*if_init) __P((le_softc_t *));/* Interface init routine */
     void (*if_reset) __P((le_softc_t *));/* Interface reset routine */
     caddr_t le_membase;			/* Starting memory address (virtual) */
     unsigned le_iobase;			/* Starting I/O base address */
@@ -336,19 +335,23 @@
     struct ifnet *ifp = &sc->le_if;
 
     dvp->id_ointr = le_intr;
-    ifp->if_softc = sc;
-    ifp->if_mtu = ETHERMTU;
+
     printf("%s%d: %s ethernet address %6D\n",
 	   ifp->if_name, ifp->if_unit,
 	   sc->le_prodname,
 	   sc->le_ac.ac_enaddr, ":");
 
+    ifp->if_softc = sc;
+    ifp->if_mtu = ETHERMTU;
     ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+    ifp->if_timer = 0;
     ifp->if_output = ether_output;
     ifp->if_ioctl = le_ioctl;
+    ifp->if_watchdog = 0;
     ifp->if_type = IFT_ETHER;
-    ifp->if_addrlen = 6;
-    ifp->if_hdrlen = 14;
+    ifp->if_addrlen = ETHER_ADDR_LEN;
+    ifp->if_hdrlen = ETHER_HDR_LEN;
+    ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
 
     ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
 
@@ -446,7 +449,7 @@
                 break;
 
 	case SIOCSIFFLAGS: {
-	    sc->if_init(sc);
+	    sc->le_if.if_init(sc);
 	    break;
 	}
 
@@ -455,7 +458,7 @@
 	    /*
 	     * Update multicast listeners
 	     */
-		sc->if_init(sc);
+		sc->le_if.if_init(sc);
 		error = 0;
 		break;
 
@@ -613,7 +616,7 @@
 #define LEMAC_32K_MODE(mbase)	(((mbase) >= 0x14) && ((mbase) <= 0x1F))
 #define LEMAC_2K_MODE(mbase)	( (mbase) >= 0x40)
 
-static void lemac_init(le_softc_t *sc);
+static void lemac_init(void *xsc);
 static void lemac_start(struct ifnet *ifp);
 static void lemac_reset(le_softc_t *sc);
 static void lemac_intr(le_softc_t *sc);
@@ -688,7 +691,7 @@
     /*
      * Try to reset the unit
      */
-    sc->if_init = lemac_init;
+    sc->le_if.if_init = lemac_init;
     sc->le_if.if_start = lemac_start;
     sc->if_reset = lemac_reset;
     sc->lemac_memmode = 2;
@@ -778,8 +781,9 @@
 
 static void
 lemac_init(
-    le_softc_t *sc)
+    void  *xsc)
 {
+    le_softc_t *sc = (le_softc_t *)xsc;
     int s;
 
     if ((sc->le_flags & IFF_UP) == 0)
@@ -1138,7 +1142,7 @@
 static int  lance_init_ring(le_softc_t *sc, ln_ring_t *rp, lance_ring_t *ri,
 			    unsigned ndescs, unsigned bufoffset,
 			    unsigned descoffset);
-static void lance_init(le_softc_t *sc);
+static void lance_init(void *xsc);
 static void lance_reset(le_softc_t *sc);
 static void lance_intr(le_softc_t *sc);
 static int  lance_rx_intr(le_softc_t *sc);
@@ -1360,7 +1364,7 @@
 	return 0;
 
     sc->if_reset = lance_reset;
-    sc->if_init = lance_init;
+    sc->le_if.if_init = lance_init;
     sc->le_if.if_start = lance_start;
     DEPCA_WRNICSR(sc, DEPCA_NICSR_SHE | DEPCA_NICSR_ENABINTR);
     sc->if_reset(sc);
@@ -1580,8 +1584,9 @@
 
 static void
 lance_init(
-    le_softc_t *sc)
+    void *xsc)
 {
+    le_softc_t *sc = (le_softc_t *)xsc;
     lance_ring_t *ri;
     lance_descinfo_t *di;
     ln_desc_t desc;

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203261532.g2QFW9O02203>