Author: yongari
Date: Sat Feb 25 04:54:51 2012
New Revision: 232145
URL: http://svn.freebsd.org/changeset/base/232145

Log:
  Use correct Config registers for RTL8139 family. Unlike RTL8168 and
  RTL810x family , RTL8139 has different register map for Config
  registers.
  
  While here, follow the lead of re(4) in WOL configuration.
   - Disable WOL_UCAST and WOL_MCAST capabilities by default.
   - Config5 register write does not need to unlock EEPROM access
     on RTL8139 family but unlocking EEPROM access does not affect
     its operation and make it consistent with re(4).
  
  Reported by:  Matt Renzelmann  mjr <> cs dot wisc dot edu

Modified:
  head/sys/dev/re/if_re.c
  head/sys/pci/if_rl.c
  head/sys/pci/if_rlreg.h

Modified: head/sys/dev/re/if_re.c
==============================================================================
--- head/sys/dev/re/if_re.c     Sat Feb 25 02:12:17 2012        (r232144)
+++ head/sys/dev/re/if_re.c     Sat Feb 25 04:54:51 2012        (r232145)
@@ -1477,6 +1477,22 @@ re_attach(device_t dev)
                break;
        }
 
+       if (sc->rl_hwrev->rl_rev == RL_HWREV_8139CPLUS) {
+               sc->rl_cfg0 = RL_8139_CFG0;
+               sc->rl_cfg1 = RL_8139_CFG1;
+               sc->rl_cfg2 = 0;
+               sc->rl_cfg3 = RL_8139_CFG3;
+               sc->rl_cfg4 = RL_8139_CFG4;
+               sc->rl_cfg5 = RL_8139_CFG5;
+       } else {
+               sc->rl_cfg0 = RL_CFG0;
+               sc->rl_cfg1 = RL_CFG1;
+               sc->rl_cfg2 = RL_CFG2;
+               sc->rl_cfg3 = RL_CFG3;
+               sc->rl_cfg4 = RL_CFG4;
+               sc->rl_cfg5 = RL_CFG5;
+       }
+
        /* Reset the adapter. */
        RL_LOCK(sc);
        re_reset(sc);
@@ -1484,12 +1500,12 @@ re_attach(device_t dev)
 
        /* Enable PME. */
        CSR_WRITE_1(sc, RL_EECMD, RL_EE_MODE);
-       cfg = CSR_READ_1(sc, RL_CFG1);
+       cfg = CSR_READ_1(sc, sc->rl_cfg1);
        cfg |= RL_CFG1_PME;
-       CSR_WRITE_1(sc, RL_CFG1, cfg);
-       cfg = CSR_READ_1(sc, RL_CFG5);
+       CSR_WRITE_1(sc, sc->rl_cfg1, cfg);
+       cfg = CSR_READ_1(sc, sc->rl_cfg5);
        cfg &= RL_CFG5_PME_STS;
-       CSR_WRITE_1(sc, RL_CFG5, cfg);
+       CSR_WRITE_1(sc, sc->rl_cfg5, cfg);
        CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF);
 
        if ((sc->rl_flags & RL_FLAG_PAR) != 0) {
@@ -2951,32 +2967,32 @@ re_set_jumbo(struct rl_softc *sc, int ju
 
        CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_WRITECFG);
        if (jumbo != 0) {
-               CSR_WRITE_1(sc, RL_CFG3, CSR_READ_1(sc, RL_CFG3) |
+               CSR_WRITE_1(sc, sc->rl_cfg3, CSR_READ_1(sc, sc->rl_cfg3) |
                    RL_CFG3_JUMBO_EN0);
                switch (sc->rl_hwrev->rl_rev) {
                case RL_HWREV_8168DP:
                        break;
                case RL_HWREV_8168E:
-                       CSR_WRITE_1(sc, RL_CFG4, CSR_READ_1(sc, RL_CFG4) |
-                           0x01);
+                       CSR_WRITE_1(sc, sc->rl_cfg4,
+                           CSR_READ_1(sc, sc->rl_cfg4) | 0x01);
                        break;
                default:
-                       CSR_WRITE_1(sc, RL_CFG4, CSR_READ_1(sc, RL_CFG4) |
-                           RL_CFG4_JUMBO_EN1);
+                       CSR_WRITE_1(sc, sc->rl_cfg4,
+                           CSR_READ_1(sc, sc->rl_cfg4) | RL_CFG4_JUMBO_EN1);
                }
        } else {
-               CSR_WRITE_1(sc, RL_CFG3, CSR_READ_1(sc, RL_CFG3) &
+               CSR_WRITE_1(sc, sc->rl_cfg3, CSR_READ_1(sc, sc->rl_cfg3) &
                    ~RL_CFG3_JUMBO_EN0);
                switch (sc->rl_hwrev->rl_rev) {
                case RL_HWREV_8168DP:
                        break;
                case RL_HWREV_8168E:
-                       CSR_WRITE_1(sc, RL_CFG4, CSR_READ_1(sc, RL_CFG4) &
-                           ~0x01);
+                       CSR_WRITE_1(sc, sc->rl_cfg4,
+                           CSR_READ_1(sc, sc->rl_cfg4) & ~0x01);
                        break;
                default:
-                       CSR_WRITE_1(sc, RL_CFG4, CSR_READ_1(sc, RL_CFG4) &
-                           ~RL_CFG4_JUMBO_EN1);
+                       CSR_WRITE_1(sc, sc->rl_cfg4,
+                           CSR_READ_1(sc, sc->rl_cfg4) & ~RL_CFG4_JUMBO_EN1);
                }
        }
        CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF);
@@ -3089,7 +3105,7 @@ re_init_locked(struct rl_softc *sc)
        if (sc->rl_hwrev->rl_rev == RL_HWREV_8169_8110SC ||
            sc->rl_hwrev->rl_rev == RL_HWREV_8169_8110SCE) {
                reg = 0x000fff00;
-               if ((CSR_READ_1(sc, RL_CFG2) & RL_CFG2_PCI66MHZ) != 0)
+               if ((CSR_READ_1(sc, sc->rl_cfg2) & RL_CFG2_PCI66MHZ) != 0)
                        reg |= 0x000000ff;
                if (sc->rl_hwrev->rl_rev == RL_HWREV_8169_8110SCE)
                        reg |= 0x00f00000;
@@ -3254,7 +3270,8 @@ re_init_locked(struct rl_softc *sc)
        if (sc->rl_testmode)
                return;
 
-       CSR_WRITE_1(sc, RL_CFG1, CSR_READ_1(sc, RL_CFG1) | RL_CFG1_DRVLOAD);
+       CSR_WRITE_1(sc, sc->rl_cfg1, CSR_READ_1(sc, sc->rl_cfg1) |
+           RL_CFG1_DRVLOAD);
 
        ifp->if_drv_flags |= IFF_DRV_RUNNING;
        ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
@@ -3787,19 +3804,19 @@ re_setwol(struct rl_softc *sc)
        CSR_WRITE_1(sc, RL_EECMD, RL_EE_MODE);
 
        /* Enable PME. */
-       v = CSR_READ_1(sc, RL_CFG1);
+       v = CSR_READ_1(sc, sc->rl_cfg1);
        v &= ~RL_CFG1_PME;
        if ((ifp->if_capenable & IFCAP_WOL) != 0)
                v |= RL_CFG1_PME;
-       CSR_WRITE_1(sc, RL_CFG1, v);
+       CSR_WRITE_1(sc, sc->rl_cfg1, v);
 
-       v = CSR_READ_1(sc, RL_CFG3);
+       v = CSR_READ_1(sc, sc->rl_cfg3);
        v &= ~(RL_CFG3_WOL_LINK | RL_CFG3_WOL_MAGIC);
        if ((ifp->if_capenable & IFCAP_WOL_MAGIC) != 0)
                v |= RL_CFG3_WOL_MAGIC;
-       CSR_WRITE_1(sc, RL_CFG3, v);
+       CSR_WRITE_1(sc, sc->rl_cfg3, v);
 
-       v = CSR_READ_1(sc, RL_CFG5);
+       v = CSR_READ_1(sc, sc->rl_cfg5);
        v &= ~(RL_CFG5_WOL_BCAST | RL_CFG5_WOL_MCAST | RL_CFG5_WOL_UCAST |
            RL_CFG5_WOL_LANWAKE);
        if ((ifp->if_capenable & IFCAP_WOL_UCAST) != 0)
@@ -3808,7 +3825,7 @@ re_setwol(struct rl_softc *sc)
                v |= RL_CFG5_WOL_MCAST | RL_CFG5_WOL_BCAST;
        if ((ifp->if_capenable & IFCAP_WOL) != 0)
                v |= RL_CFG5_WOL_LANWAKE;
-       CSR_WRITE_1(sc, RL_CFG5, v);
+       CSR_WRITE_1(sc, sc->rl_cfg5, v);
 
        /* Config register write done. */
        CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF);
@@ -3844,17 +3861,17 @@ re_clrwol(struct rl_softc *sc)
        /* Enable config register write. */
        CSR_WRITE_1(sc, RL_EECMD, RL_EE_MODE);
 
-       v = CSR_READ_1(sc, RL_CFG3);
+       v = CSR_READ_1(sc, sc->rl_cfg3);
        v &= ~(RL_CFG3_WOL_LINK | RL_CFG3_WOL_MAGIC);
-       CSR_WRITE_1(sc, RL_CFG3, v);
+       CSR_WRITE_1(sc, sc->rl_cfg3, v);
 
        /* Config register write done. */
        CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF);
 
-       v = CSR_READ_1(sc, RL_CFG5);
+       v = CSR_READ_1(sc, sc->rl_cfg5);
        v &= ~(RL_CFG5_WOL_BCAST | RL_CFG5_WOL_MCAST | RL_CFG5_WOL_UCAST);
        v &= ~RL_CFG5_WOL_LANWAKE;
-       CSR_WRITE_1(sc, RL_CFG5, v);
+       CSR_WRITE_1(sc, sc->rl_cfg5, v);
 }
 
 static void

Modified: head/sys/pci/if_rl.c
==============================================================================
--- head/sys/pci/if_rl.c        Sat Feb 25 02:12:17 2012        (r232144)
+++ head/sys/pci/if_rl.c        Sat Feb 25 04:54:51 2012        (r232145)
@@ -717,6 +717,13 @@ rl_attach(device_t dev)
                goto fail;
        }
 
+       sc->rl_cfg0 = RL_8139_CFG0;
+       sc->rl_cfg1 = RL_8139_CFG1;
+       sc->rl_cfg2 = 0;
+       sc->rl_cfg3 = RL_8139_CFG3;
+       sc->rl_cfg4 = RL_8139_CFG4;
+       sc->rl_cfg5 = RL_8139_CFG5;
+
        /*
         * Reset the adapter. Only take the lock here as it's needed in
         * order to call rl_reset().
@@ -818,6 +825,7 @@ rl_attach(device_t dev)
                }
        }
        ifp->if_capenable = ifp->if_capabilities;
+       ifp->if_capenable &= ~(IFCAP_WOL_UCAST | IFCAP_WOL_MCAST);
 #ifdef DEVICE_POLLING
        ifp->if_capabilities |= IFCAP_POLLING;
 #endif
@@ -1754,7 +1762,7 @@ rl_init_locked(struct rl_softc *sc)
        sc->rl_flags &= ~RL_FLAG_LINK;
        mii_mediachg(mii);
 
-       CSR_WRITE_1(sc, RL_CFG1, RL_CFG1_DRVLOAD|RL_CFG1_FULLDUPLEX);
+       CSR_WRITE_1(sc, sc->rl_cfg1, RL_CFG1_DRVLOAD|RL_CFG1_FULLDUPLEX);
 
        ifp->if_drv_flags |= IFF_DRV_RUNNING;
        ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
@@ -2055,22 +2063,19 @@ rl_setwol(struct rl_softc *sc)
        CSR_WRITE_1(sc, RL_EECMD, RL_EE_MODE);
 
        /* Enable PME. */
-       v = CSR_READ_1(sc, RL_CFG1);
+       v = CSR_READ_1(sc, sc->rl_cfg1);
        v &= ~RL_CFG1_PME;
        if ((ifp->if_capenable & IFCAP_WOL) != 0)
                v |= RL_CFG1_PME;
-       CSR_WRITE_1(sc, RL_CFG1, v);
+       CSR_WRITE_1(sc, sc->rl_cfg1, v);
 
-       v = CSR_READ_1(sc, RL_CFG3);
+       v = CSR_READ_1(sc, sc->rl_cfg3);
        v &= ~(RL_CFG3_WOL_LINK | RL_CFG3_WOL_MAGIC);
        if ((ifp->if_capenable & IFCAP_WOL_MAGIC) != 0)
                v |= RL_CFG3_WOL_MAGIC;
-       CSR_WRITE_1(sc, RL_CFG3, v);
-
-       /* Config register write done. */
-       CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF);
+       CSR_WRITE_1(sc, sc->rl_cfg3, v);
 
-       v = CSR_READ_1(sc, RL_CFG5);
+       v = CSR_READ_1(sc, sc->rl_cfg5);
        v &= ~(RL_CFG5_WOL_BCAST | RL_CFG5_WOL_MCAST | RL_CFG5_WOL_UCAST);
        v &= ~RL_CFG5_WOL_LANWAKE;
        if ((ifp->if_capenable & IFCAP_WOL_UCAST) != 0)
@@ -2079,7 +2084,11 @@ rl_setwol(struct rl_softc *sc)
                v |= RL_CFG5_WOL_MCAST | RL_CFG5_WOL_BCAST;
        if ((ifp->if_capenable & IFCAP_WOL) != 0)
                v |= RL_CFG5_WOL_LANWAKE;
-       CSR_WRITE_1(sc, RL_CFG5, v);
+       CSR_WRITE_1(sc, sc->rl_cfg5, v);
+
+       /* Config register write done. */
+       CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF);
+
        /* Request PME if WOL is requested. */
        pmstat = pci_read_config(sc->rl_dev, pmc + PCIR_POWER_STATUS, 2);
        pmstat &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE);
@@ -2101,15 +2110,15 @@ rl_clrwol(struct rl_softc *sc)
        /* Enable config register write. */
        CSR_WRITE_1(sc, RL_EECMD, RL_EE_MODE);
 
-       v = CSR_READ_1(sc, RL_CFG3);
+       v = CSR_READ_1(sc, sc->rl_cfg3);
        v &= ~(RL_CFG3_WOL_LINK | RL_CFG3_WOL_MAGIC);
-       CSR_WRITE_1(sc, RL_CFG3, v);
+       CSR_WRITE_1(sc, sc->rl_cfg3, v);
 
        /* Config register write done. */
        CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF);
 
-       v = CSR_READ_1(sc, RL_CFG5);
+       v = CSR_READ_1(sc, sc->rl_cfg5);
        v &= ~(RL_CFG5_WOL_BCAST | RL_CFG5_WOL_MCAST | RL_CFG5_WOL_UCAST);
        v &= ~RL_CFG5_WOL_LANWAKE;
-       CSR_WRITE_1(sc, RL_CFG5, v);
+       CSR_WRITE_1(sc, sc->rl_cfg5, v);
 }

Modified: head/sys/pci/if_rlreg.h
==============================================================================
--- head/sys/pci/if_rlreg.h     Sat Feb 25 02:12:17 2012        (r232144)
+++ head/sys/pci/if_rlreg.h     Sat Feb 25 04:54:51 2012        (r232145)
@@ -74,6 +74,14 @@
 #define        RL_TIMERCNT     0x0048          /* timer count register */
 #define        RL_MISSEDPKT    0x004C          /* missed packet counter */
 #define        RL_EECMD        0x0050          /* EEPROM command register */
+
+/* RTL8139/RTL8139C+ only */
+#define        RL_8139_CFG0    0x0051          /* config register #0 */
+#define        RL_8139_CFG1    0x0052          /* config register #1 */
+#define        RL_8139_CFG3    0x0059          /* config register #3 */
+#define        RL_8139_CFG4    0x005A          /* config register #4 */
+#define        RL_8139_CFG5    0x00D8          /* config register #5 */
+
 #define        RL_CFG0         0x0051          /* config register #0 */
 #define        RL_CFG1         0x0052          /* config register #1 */
 #define        RL_CFG2         0x0053          /* config register #2 */
@@ -873,6 +881,12 @@ struct rl_softc {
        int                     rl_eewidth;
        int                     rl_expcap;
        int                     rl_txthresh;
+       bus_size_t              rl_cfg0;
+       bus_size_t              rl_cfg1;
+       bus_size_t              rl_cfg2;
+       bus_size_t              rl_cfg3;
+       bus_size_t              rl_cfg4;
+       bus_size_t              rl_cfg5;
        struct rl_chain_data    rl_cdata;
        struct rl_list_data     rl_ldata;
        struct callout          rl_stat_callout;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to