Author: yongari
Date: Wed Jan  4 22:53:18 2012
New Revision: 229529
URL: http://svn.freebsd.org/changeset/base/229529

Log:
  MFC r227587,227590-227591,227593,227638-227639:
  r227587:
    Add preliminary support for RTL8402 PCIe FastEthernet with
    integrated card reader.
  
  r227590:
    Add preliminary support for RTL8411 PCIe Gigabit ethernet with
    integrated card reader.
  
  r227591:
    Add missing driver lock in SIOCSIFCAP handler.
  
  r227593:
    Disable PCIe ASPM (Active State Power Management) for all
    controllers.
    More and more RealTek controllers started to implement EEE feature.
    Vendor driver seems to load a kind of firmware for EEE with
    additional PHY fixups.  It is known that the EEE feature may need
    ASPM support.  Unfortunately there is no documentation for EEE of
    the controller so enabling ASPM may cause more problems.
  
  r227638:
    Add preliminary support for second generation RTL8105E PCIe
    FastEthernet.
  
  r227639:
    Add preliminary support for RTL8168/8111F PCIe Gigabit ethernet.

Modified:
  stable/9/sys/dev/re/if_re.c
  stable/9/sys/pci/if_rlreg.h
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/amd64/include/xen/   (props changed)
  stable/9/sys/boot/   (props changed)
  stable/9/sys/boot/i386/efi/   (props changed)
  stable/9/sys/boot/ia64/efi/   (props changed)
  stable/9/sys/boot/ia64/ski/   (props changed)
  stable/9/sys/boot/powerpc/boot1.chrp/   (props changed)
  stable/9/sys/boot/powerpc/ofw/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)
  stable/9/sys/conf/   (props changed)
  stable/9/sys/contrib/dev/acpica/   (props changed)
  stable/9/sys/contrib/octeon-sdk/   (props changed)
  stable/9/sys/contrib/pf/   (props changed)
  stable/9/sys/contrib/x86emu/   (props changed)

Modified: stable/9/sys/dev/re/if_re.c
==============================================================================
--- stable/9/sys/dev/re/if_re.c Wed Jan  4 21:57:11 2012        (r229528)
+++ stable/9/sys/dev/re/if_re.c Wed Jan  4 22:53:18 2012        (r229529)
@@ -181,7 +181,7 @@ static struct rl_type re_devs[] = {
        { RT_VENDORID, RT_DEVICEID_8101E, 0,
            "RealTek 810xE PCIe 10/100baseTX" },
        { RT_VENDORID, RT_DEVICEID_8168, 0,
-           "RealTek 8168/8111 B/C/CP/D/DP/E PCIe Gigabit Ethernet" },
+           "RealTek 8168/8111 B/C/CP/D/DP/E/F PCIe Gigabit Ethernet" },
        { RT_VENDORID, RT_DEVICEID_8169, 0,
            "RealTek 8169/8169S/8169SB(L)/8110S/8110SB(L) Gigabit Ethernet" },
        { RT_VENDORID, RT_DEVICEID_8169SC, 0,
@@ -220,7 +220,9 @@ static struct rl_hwrev re_hwrevs[] = {
        { RL_HWREV_8102EL_SPIN1, RL_8169, "8102EL", RL_MTU },
        { RL_HWREV_8103E, RL_8169, "8103E", RL_MTU },
        { RL_HWREV_8401E, RL_8169, "8401E", RL_MTU },
+       { RL_HWREV_8402, RL_8169, "8402", RL_MTU },
        { RL_HWREV_8105E, RL_8169, "8105E", RL_MTU },
+       { RL_HWREV_8105E_SPIN1, RL_8169, "8105E", RL_MTU },
        { RL_HWREV_8168B_SPIN2, RL_8169, "8168", RL_JUMBO_MTU },
        { RL_HWREV_8168B_SPIN3, RL_8169, "8168", RL_JUMBO_MTU },
        { RL_HWREV_8168C, RL_8169, "8168C/8111C", RL_JUMBO_MTU_6K },
@@ -230,6 +232,8 @@ static struct rl_hwrev re_hwrevs[] = {
        { RL_HWREV_8168DP, RL_8169, "8168DP/8111DP", RL_JUMBO_MTU_9K },
        { RL_HWREV_8168E, RL_8169, "8168E/8111E", RL_JUMBO_MTU_9K},
        { RL_HWREV_8168E_VL, RL_8169, "8168E/8111E-VL", RL_JUMBO_MTU_6K},
+       { RL_HWREV_8168F, RL_8169, "8168F/8111F", RL_JUMBO_MTU_9K},
+       { RL_HWREV_8411, RL_8169, "8411", RL_JUMBO_MTU_9K},
        { 0, 0, NULL, 0 }
 };
 
@@ -1180,6 +1184,7 @@ re_attach(device_t dev)
        struct rl_softc         *sc;
        struct ifnet            *ifp;
        struct rl_hwrev         *hw_rev;
+       u_int32_t               cap, ctl;
        int                     hwrev;
        u_int16_t               devid, re_did = 0;
        int                     error = 0, i, phy, rid;
@@ -1235,8 +1240,10 @@ re_attach(device_t dev)
 
        msic = pci_msi_count(dev);
        msixc = pci_msix_count(dev);
-       if (pci_find_cap(dev, PCIY_EXPRESS, &reg) == 0)
+       if (pci_find_cap(dev, PCIY_EXPRESS, &reg) == 0) {
                sc->rl_flags |= RL_FLAG_PCIE;
+               sc->rl_expcap = reg;
+       }
        if (bootverbose) {
                device_printf(dev, "MSI count : %d\n", msic);
                device_printf(dev, "MSI-X count : %d\n", msixc);
@@ -1328,6 +1335,23 @@ re_attach(device_t dev)
                CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF);
        }
 
+       /* Disable ASPM L0S/L1. */
+       if (sc->rl_expcap != 0) {
+               cap = pci_read_config(dev, sc->rl_expcap +
+                   PCIR_EXPRESS_LINK_CAP, 2);
+               if ((cap & PCIM_LINK_CAP_ASPM) != 0) {
+                       ctl = pci_read_config(dev, sc->rl_expcap +
+                           PCIR_EXPRESS_LINK_CTL, 2);
+                       if ((ctl & 0x0003) != 0) {
+                               ctl &= ~0x0003;
+                               pci_write_config(dev, sc->rl_expcap +
+                                   PCIR_EXPRESS_LINK_CTL, ctl, 2);
+                               device_printf(dev, "ASPM disabled\n");
+                       }
+               } else
+                       device_printf(dev, "no ASPM capability\n");
+       }
+
        hw_rev = re_hwrevs;
        hwrev = CSR_READ_4(sc, RL_TXCFG);
        switch (hwrev & 0x70000000) {
@@ -1377,7 +1401,9 @@ re_attach(device_t dev)
                    RL_FLAG_AUTOPAD | RL_FLAG_MACSLEEP;
                break;
        case RL_HWREV_8401E:
+       case RL_HWREV_8402:
        case RL_HWREV_8105E:
+       case RL_HWREV_8105E_SPIN1:
                sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PHYWAKE_PM |
                    RL_FLAG_PAR | RL_FLAG_DESCV2 | RL_FLAG_MACSTAT |
                    RL_FLAG_FASTETHER | RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD;
@@ -1409,6 +1435,8 @@ re_attach(device_t dev)
                    RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD | RL_FLAG_JUMBOV2;
                break;
        case RL_HWREV_8168E_VL:
+       case RL_HWREV_8168F:
+       case RL_HWREV_8411:
                sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR |
                    RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP |
                    RL_FLAG_AUTOPAD | RL_FLAG_JUMBOV2;
@@ -3304,6 +3332,7 @@ re_ioctl(struct ifnet *ifp, u_long comma
                        }
                }
 #endif /* DEVICE_POLLING */
+               RL_LOCK(sc);
                if ((mask & IFCAP_TXCSUM) != 0 &&
                    (ifp->if_capabilities & IFCAP_TXCSUM) != 0) {
                        ifp->if_capenable ^= IFCAP_TXCSUM;
@@ -3362,8 +3391,9 @@ re_ioctl(struct ifnet *ifp, u_long comma
                }
                if (reinit && ifp->if_drv_flags & IFF_DRV_RUNNING) {
                        ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
-                       re_init(sc);
+                       re_init_locked(sc);
                }
+               RL_UNLOCK(sc);
                VLAN_CAPABILITIES(ifp);
            }
                break;

Modified: stable/9/sys/pci/if_rlreg.h
==============================================================================
--- stable/9/sys/pci/if_rlreg.h Wed Jan  4 21:57:11 2012        (r229528)
+++ stable/9/sys/pci/if_rlreg.h Wed Jan  4 22:53:18 2012        (r229529)
@@ -178,6 +178,10 @@
 #define        RL_HWREV_8168C_SPIN2    0x3C400000
 #define        RL_HWREV_8168CP         0x3C800000
 #define        RL_HWREV_8105E          0x40800000
+#define        RL_HWREV_8105E_SPIN1    0x40C00000
+#define        RL_HWREV_8402           0x44000000
+#define        RL_HWREV_8168F          0x48000000
+#define        RL_HWREV_8411           0x48800000
 #define        RL_HWREV_8139           0x60000000
 #define        RL_HWREV_8139A          0x70000000
 #define        RL_HWREV_8139AG         0x70800000
@@ -866,6 +870,7 @@ struct rl_softc {
        const struct rl_hwrev   *rl_hwrev;
        int                     rl_eecmd_read;
        int                     rl_eewidth;
+       int                     rl_expcap;
        int                     rl_txthresh;
        struct rl_chain_data    rl_cdata;
        struct rl_list_data     rl_ldata;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to