Author: yongari
Date: Mon Mar  9 06:02:55 2009
New Revision: 189555
URL: http://svn.freebsd.org/changeset/base/189555

Log:
  Add a new tunable hw.re.prefer_iomap which disables memory register
  mapping. The tunable is OFF for all controllers except RTL8169SC
  family. RTL8169SC seems to require more magic to use memory
  register mapping. r187483 added a fix for RTL8169SCe controller but
  it does not looke like fix other variants of RTL8169SC.
  
  Tested by:    Gavin Stone-Tolcher g.stone-tolcher <> its dot uq dot edu dot au

Modified:
  head/sys/dev/re/if_re.c

Modified: head/sys/dev/re/if_re.c
==============================================================================
--- head/sys/dev/re/if_re.c     Mon Mar  9 06:02:05 2009        (r189554)
+++ head/sys/dev/re/if_re.c     Mon Mar  9 06:02:55 2009        (r189555)
@@ -158,6 +158,8 @@ MODULE_DEPEND(re, miibus, 1, 1, 1);
 /* Tunables. */
 static int msi_disable = 0;
 TUNABLE_INT("hw.re.msi_disable", &msi_disable);
+static int prefer_iomap = 0;
+TUNABLE_INT("hw.re.prefer_iomap", &prefer_iomap);
 
 #define RE_CSUM_FEATURES    (CSUM_IP | CSUM_TCP | CSUM_UDP)
 
@@ -1118,25 +1120,35 @@ re_attach(device_t dev)
        pci_enable_busmaster(dev);
 
        devid = pci_get_device(dev);
-       /* Prefer memory space register mapping over IO space. */
-       sc->rl_res_id = PCIR_BAR(1);
-       sc->rl_res_type = SYS_RES_MEMORY;
-       /* RTL8168/8101E seems to use different BARs. */
-       if (devid == RT_DEVICEID_8168 || devid == RT_DEVICEID_8101E)
-               sc->rl_res_id = PCIR_BAR(2);
+       /*
+        * Prefer memory space register mapping over IO space.
+        * Because RTL8169SC does not seem to work when memory mapping
+        * is used always activate io mapping. 
+        */
+       if (devid == RT_DEVICEID_8169SC)
+               prefer_iomap = 1;
+       if (prefer_iomap == 0) {
+               sc->rl_res_id = PCIR_BAR(1);
+               sc->rl_res_type = SYS_RES_MEMORY;
+               /* RTL8168/8101E seems to use different BARs. */
+               if (devid == RT_DEVICEID_8168 || devid == RT_DEVICEID_8101E)
+                       sc->rl_res_id = PCIR_BAR(2);
+       } else {
+               sc->rl_res_id = PCIR_BAR(0);
+               sc->rl_res_type = SYS_RES_IOPORT;
+       }
        sc->rl_res = bus_alloc_resource_any(dev, sc->rl_res_type,
            &sc->rl_res_id, RF_ACTIVE);
-
-       if (sc->rl_res == NULL) {
+       if (sc->rl_res == NULL && prefer_iomap == 0) {
                sc->rl_res_id = PCIR_BAR(0);
                sc->rl_res_type = SYS_RES_IOPORT;
                sc->rl_res = bus_alloc_resource_any(dev, sc->rl_res_type,
                    &sc->rl_res_id, RF_ACTIVE);
-               if (sc->rl_res == NULL) {
-                       device_printf(dev, "couldn't map ports/memory\n");
-                       error = ENXIO;
-                       goto fail;
-               }
+       }
+       if (sc->rl_res == NULL) {
+               device_printf(dev, "couldn't map ports/memory\n");
+               error = ENXIO;
+               goto fail;
        }
 
        sc->rl_btag = rman_get_bustag(sc->rl_res);
_______________________________________________
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