Return-Path: [email protected]
Received: from deep.thought.net (IDENT:[email protected] [63.87.48.65])
       by cvs.openbsd.org (8.9.3/8.9.1) with ESMTP id SAA08682
       for <[email protected]>; Sun, 2 Jan 2000 18:05:45 -0700 (MST)
Received: from 600mp.thought.net (IDENT:[email protected] [63.87.48.105])
       by deep.thought.net (8.9.3/8.9.3) with ESMTP id UAA02050
       for <[email protected]>; Sun, 2 Jan 2000 20:08:38 -0500 (EST)
Received: (from jason@localhost)
       by 600mp.thought.net (8.9.3/8.9.1) id UAA30116
       for [email protected]; Sun, 2 Jan 2000 20:05:42 -0500 (EST)
Date: Sun, 2 Jan 2000 20:05:41 -0500
From: Jason Wright <[email protected]>
To: [email protected]
Subject: 3c900b-tpo fix
Message-ID: <[email protected]>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
User-Agent: Mutt/1.1.1i


Here's the patch against 2.6-release.


The 3C900B-TPO fails to select the correct media type (it never sees or
sends packets).

Apply by doing:
       cd /usr/src
       patch -p0 < 012_3c900b.patch

And then rebuild your kernel.

--- sys/dev/pci/if_xl.c.orig    Sun Jan  2 15:28:49 2000
+++ sys/dev/pci/if_xl.c Sun Jan  2 15:28:49 2000
@@ -179,7 +179,7 @@
u_int8_t xl_calchash   __P((caddr_t));
void xl_setmulti       __P((struct xl_softc *));
void xl_setmulti_hash  __P((struct xl_softc *));
-void xl_reset          __P((struct xl_softc *));
+void xl_reset          __P((struct xl_softc *, int));
int xl_list_rx_init    __P((struct xl_softc *));
int xl_list_tx_init    __P((struct xl_softc *));
void xl_wait           __P((struct xl_softc *));
@@ -822,13 +822,16 @@
       XL_SEL_WIN(7);
}

-void xl_reset(sc)
+void xl_reset(sc, hard)
       struct xl_softc         *sc;
{
       register int            i;

       XL_SEL_WIN(0);
-       CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_RESET);
+       if (hard)
+               CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_RESET);
+       else
+               CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_RESET | 0x0010);
       xl_wait(sc);

       for (i = 0; i < XL_TIMEOUT; i++) {
@@ -1364,7 +1367,7 @@
               }

               if (status & XL_STAT_ADFAIL) {
-                       xl_reset(sc);
+                       xl_reset(sc, 0);
                       xl_init(sc);
               }

@@ -2014,7 +2017,7 @@
       xl_txeoc(sc);
       xl_txeof(sc);
       xl_rxeof(sc);
-       xl_reset(sc);
+       xl_reset(sc, 0);
       xl_init(sc);

       if (ifp->if_snd.ifq_head != NULL)
@@ -2213,7 +2216,7 @@
       }
       printf(": %s", intrstr);

-       xl_reset(sc);
+       xl_reset(sc, 1);

       /*
        * Get station address from the EEPROM.
@@ -2315,8 +2318,10 @@
        * a 10/100 card of some kind, we need to force the transceiver
        * type to something sane.
        */
-       if (sc->xl_xcvr == XL_XCVR_AUTO)
+       if (sc->xl_xcvr == XL_XCVR_AUTO) {
               xl_choose_xcvr(sc, 0);
+               xl_reset(sc, 0);
+       }

       if (sc->xl_media & XL_MEDIAOPT_BT) {
               ifmedia_add(ifm, IFM_ETHER|IFM_10_T, 0, NULL);
@@ -2414,6 +2419,7 @@
{
       struct xl_softc *sc = (struct xl_softc *)v;

+       xl_reset(sc, 1);
       xl_stop(sc);
}