]> Zhao Yanbai Git Server - minix.git/commitdiff
fix multiport support in ethernet drivers
authorDavid van Moolenbroek <david@minix3.org>
Mon, 10 May 2010 20:19:55 +0000 (20:19 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Mon, 10 May 2010 20:19:55 +0000 (20:19 +0000)
drivers/dec21140A/dec21140A.c
drivers/dp8390/dp8390.c
drivers/dp8390/local.h
drivers/dp8390/rtl8029.c
drivers/e1000/e1000.c
drivers/fxp/fxp.c
drivers/lance/lance.c
drivers/orinoco/orinoco.c
drivers/rtl8139/rtl8139.c
drivers/rtl8169/rtl8169.c

index 1ac73f2e34d190d4ef51c09c9a5f35e21d06ec3a..8943003a695fe12c86024ef1aa049e0b2cbf2de9 100644 (file)
@@ -37,7 +37,7 @@ _PROTOTYPE( PRIVATE void  do_vread_s,        (const message *, int);         );
 _PROTOTYPE( PRIVATE void  do_watchdog,       (void *);                       );
 
 _PROTOTYPE( PRIVATE void  de_update_conf,    (dpeth_t *);                    );
-_PROTOTYPE( PRIVATE int   de_probe,          (dpeth_t *);                    );
+_PROTOTYPE( PRIVATE int   de_probe,          (dpeth_t *, int skip);          );
 _PROTOTYPE( PRIVATE void  de_conf_addr,      (dpeth_t *);                    );
 _PROTOTYPE( PRIVATE void  de_first_init,     (dpeth_t *);                    );
 _PROTOTYPE( PRIVATE void  de_reset,          (const dpeth_t *);              );
@@ -213,7 +213,7 @@ PRIVATE void do_conf(const message * mp)
     if (dep->de_mode == DEM_DISABLED) {
       de_update_conf(dep); 
       pci_init();
-      if (dep->de_mode == DEM_ENABLED && !de_probe(dep)) {
+      if (dep->de_mode == DEM_ENABLED && !de_probe(dep, port)) {
        printf("%s: warning no ethernet card found at 0x%04X\n",
               dep->de_name, dep->de_base_port);
        dep->de_mode = DEM_DISABLED;
@@ -320,7 +320,7 @@ PRIVATE void do_watchdog(void *UNUSED(message))
   return;
 }
 
-PRIVATE int de_probe(dpeth_t *dep){
+PRIVATE int de_probe(dpeth_t *dep, int skip){
   int i, r, devind;
   u16_t vid, did, temp16;
 
@@ -334,7 +334,11 @@ PRIVATE int de_probe(dpeth_t *dep){
     {
       if ( DEC21140A_VID == vid && 
           DEC21140A_DID == did)
-       break;
+       {
+         if (!skip)
+           break;
+         skip--;
+       }
 
       r= pci_next_dev(&devind, &vid, &did);
       if (!r)
index ad15fe05419a066a429481fc7e1bdfaa924c136b..2700b348ca9cfe6a6900a73c9990b58107b3d525 100644 (file)
@@ -466,7 +466,7 @@ static void pci_conf()
                        {
                                continue;
                        }
-                       if (!rtl_probe(dep))
+                       if (!rtl_probe(dep, i))
                                dep->de_pci= -1;
                }
        }
index 21b1596c418f7e320d0f588980086ef5bc3f3a5c..0e1e1c5f12a01afcd1b2ddc0ffb88ac1a41d026e 100644 (file)
@@ -23,7 +23,7 @@ _PROTOTYPE( int ne_probe, (struct dpeth *dep)                         );
 _PROTOTYPE( void ne_init, (struct dpeth *dep)                          );
 
 /* rtl8029.c */
-_PROTOTYPE( int rtl_probe, (struct dpeth *dep)                         );
+_PROTOTYPE( int rtl_probe, (struct dpeth *dep, int skip)               );
 
 /* wdeth.c */
 _PROTOTYPE( int wdeth_probe, (struct dpeth* dep)                               );
index d2ff930ec27d208239c224e4bcebd0eb3f29d869..b3b47e37b37075f29f560b13d9871f901a8cb9a1 100644 (file)
@@ -42,8 +42,9 @@ _PROTOTYPE( static void set_ee_word, (dpeth_t *dep, int a, u16_t w)   );
 _PROTOTYPE( static void ee_wds, (dpeth_t *dep)                         );
 #endif
 
-PUBLIC int rtl_probe(dep)
+PUBLIC int rtl_probe(dep, skip)
 struct dpeth *dep;
+int skip;
 {
        int i, r, devind, just_one;
        u16_t vid, did;
@@ -89,8 +90,11 @@ struct dpeth *dep;
                        }
                        break;
                }
-               if (pcitab[i].vid != 0 || pcitab[i].did != 0)
-                       break;
+               if (pcitab[i].vid != 0 || pcitab[i].did != 0) {
+                       if (just_one || !skip)
+                               break;
+                       skip--;
+               }
 
                if (just_one)
                {
index 214ef69fd0a104fe9b1cf4a01f7e13cef4cd3188..4cec31d92e64b3a4539b47da1300c3b8f60d5814 100644 (file)
@@ -33,7 +33,7 @@ PRIVATE e1000_t e1000_table[E1000_PORT_NR];
 
 _PROTOTYPE( PRIVATE void e1000_init, (message *mp)                     );
 _PROTOTYPE( PRIVATE void e1000_init_pci, (void)                                );
-_PROTOTYPE( PRIVATE int  e1000_probe, (e1000_t *e)                     );
+_PROTOTYPE( PRIVATE int  e1000_probe, (e1000_t *e, int skip)           );
 _PROTOTYPE( PRIVATE int  e1000_init_hw, (e1000_t *e)                   );
 _PROTOTYPE( PRIVATE void e1000_init_addr, (e1000_t *e)                 );
 _PROTOTYPE( PRIVATE void e1000_init_buf,  (e1000_t *e)                 );
@@ -236,14 +236,14 @@ PRIVATE void e1000_init_pci()
     {
        strcpy(e->name, "e1000#0");
        e->name[6] += i;        
-       e1000_probe(e);
+       e1000_probe(e, i);
     }
 }
 
 /*===========================================================================*
  *                             e1000_probe                                  *
  *===========================================================================*/
-PRIVATE int e1000_probe(e1000_t *e)
+PRIVATE int e1000_probe(e1000_t *e, int skip)
 {
     int i, r, devind;
     u16_t vid, did;
@@ -274,7 +274,11 @@ PRIVATE int e1000_probe(e1000_t *e)
                break;
        }
        if (pcitab_e1000[i] != 0)
-           break;
+       {
+           if (!skip)
+               break;
+           skip--;
+       }
 
        if (!(r = pci_next_dev(&devind, &vid, &did)))
        {
index e38063f1f8087b9f0cb6919b2e09e94a3469d6ef..3a61d3451abcb498ed4aff36d08e98badcd02bf8 100644 (file)
@@ -224,7 +224,7 @@ PRIVATE u32_t system_hz;
 
 _PROTOTYPE( static void fxp_init, (message *mp)                                );
 _PROTOTYPE( static void fxp_pci_conf, (void)                           );
-_PROTOTYPE( static int fxp_probe, (fxp_t *fp)                          );
+_PROTOTYPE( static int fxp_probe, (fxp_t *fp, int skip)                        );
 _PROTOTYPE( static void fxp_conf_hw, (fxp_t *fp)                       );
 _PROTOTYPE( static void fxp_init_hw, (fxp_t *fp)                       );
 _PROTOTYPE( static void fxp_init_buf, (fxp_t *fp)                      );
@@ -567,7 +567,7 @@ static void fxp_pci_conf()
                        {
                                continue;
                        }
-                       if (fxp_probe(fp))
+                       if (fxp_probe(fp, i))
                                fp->fxp_seen= TRUE;
                }
        }
@@ -576,7 +576,7 @@ static void fxp_pci_conf()
 /*===========================================================================*
  *                             fxp_probe                                    *
  *===========================================================================*/
-static int fxp_probe(fxp_t *fp)
+static int fxp_probe(fxp_t *fp, int skip)
 {
        int i, r, devind, just_one;
        u16_t vid, did;
@@ -621,7 +621,11 @@ static int fxp_probe(fxp_t *fp)
                        break;
                }
                if (pcitab_fxp[i].vid != 0)
-                       break;
+               {
+                       if (just_one || !skip)
+                               break;
+                       skip--;
+               }
 
                if (just_one)
                {
index 10ef1e4dc358c8381c2715989026c2ca11ec4720..2ad63d23cbacf6bcf637ab8a45519ed66f62e97c 100644 (file)
@@ -125,7 +125,7 @@ _PROTOTYPE( static void lance_dump, (void)            );
 _PROTOTYPE( static void getAddressing, (int devind, ether_card_t *ec)   );
 
 /* probe+init LANCE cards */
-_PROTOTYPE( static int lance_probe, (ether_card_t *ec)                  );
+_PROTOTYPE( static int lance_probe, (ether_card_t *ec, int skip)        );
 _PROTOTYPE( static void lance_init_card, (ether_card_t *ec)             );
 
 /* Accesses Lance Control and Status Registers */
@@ -622,7 +622,7 @@ ether_card_t *ec;
    if (ec->mode != EC_ENABLED)
       return;
 
-   if (!lance_probe(ec))
+   if (!lance_probe(ec, ifnr))
    {
       printf("%s: No ethernet card found on PCI-BIOS info.\n", 
              ec->port_name);
@@ -1463,8 +1463,9 @@ ether_card_t *ec;
 /*===========================================================================*
  *                              lance_probe                                  *
  *===========================================================================*/
-static int lance_probe(ec)
+static int lance_probe(ec, skip)
 ether_card_t *ec;
+int skip;
 {
    unsigned short    pci_cmd;
    unsigned short    ioaddr;
@@ -1510,7 +1511,11 @@ ether_card_t *ec;
          break;
       }
       if (pcitab[i].vid != 0)
-         break;
+      {
+        if (just_one || !skip)
+            break;
+        skip--;
+      }
 
       if (just_one)
       {
index eb58bfb4a8d551e4a3f067d31d9a1a69e05a8f56..768be268a094830ec8ea360f5e64f0f033ec63ac 100644 (file)
@@ -190,7 +190,7 @@ _PROTOTYPE (static void or_readv, (message * mp, int from_int, int vectored));
 _PROTOTYPE (static void or_writev_s, (message * mp, int from_int));
 _PROTOTYPE (static void or_readv_s, (message * mp, int from_int));
 _PROTOTYPE (static void reply, (t_or * orp, int err, int may_block));
-_PROTOTYPE (static int  or_probe, (t_or *));
+_PROTOTYPE (static int  or_probe, (t_or *, int skip));
 _PROTOTYPE (static void or_ev_info, (t_or *));
 _PROTOTYPE (static void or_init, (message *));
 _PROTOTYPE (static void or_pci_conf, (void));
@@ -636,7 +636,7 @@ static void or_pci_conf () {
                              orp->or_pci_func) != 0) != h)     {
                                continue;
                        }
-                       if (or_probe (orp))
+                       if (or_probe (orp, i))
                                orp->or_seen = TRUE;
                }
 }
@@ -647,7 +647,7 @@ static void or_pci_conf () {
  * Try to find the card based on information provided by pci and get irq and *
  * bar                                                                       *
  *****************************************************************************/
-static int or_probe (t_or * orp)
+static int or_probe (t_or * orp, int skip)
 {
        u8_t ilr;
        u32_t bar;
@@ -694,8 +694,15 @@ static int or_probe (t_or * orp)
                        /* we have found the card in the pci bus */
                        break;
                }
-               if (pcitab[i].vid != 0)
-                       break;
+
+               /* unless we are looking for a specific device, we may have to
+                * skip a number of cards because they are already reserved for
+                * other (lower) ports of this driver */
+               if (pcitab[i].vid != 0) {
+                       if (just_one || !skip)
+                               break;
+                       skip--;
+               }
 
                if (just_one) {
                        printf ("%s: wrong PCI device", orp->or_name);
index 6ae4bc4dda10d726a9daaba8541cea8295b958f2..61c9619c15a806b5082d5f3301b3598b1c790644 100644 (file)
@@ -140,7 +140,7 @@ static void my_outl(u16_t port, u32_t value) {
 
 _PROTOTYPE( static void rl_init, (message *mp)                         );
 _PROTOTYPE( static void rl_pci_conf, (void)                            );
-_PROTOTYPE( static int rl_probe, (re_t *rep)                           );
+_PROTOTYPE( static int rl_probe, (re_t *rep, int skip)                 );
 _PROTOTYPE( static void rl_conf_hw, (re_t *rep)                                );
 _PROTOTYPE( static void rl_init_buf, (re_t *rep)                               );
 _PROTOTYPE( static void rl_init_hw, (re_t *rep)                                );
@@ -542,7 +542,7 @@ static void rl_pci_conf()
                        {
                                continue;
                        }
-                       if (rl_probe(rep))
+                       if (rl_probe(rep, i))
                                rep->re_seen= TRUE;
                }
        }
@@ -551,8 +551,9 @@ static void rl_pci_conf()
 /*===========================================================================*
  *                             rl_probe                                     *
  *===========================================================================*/
-static int rl_probe(rep)
+static int rl_probe(rep, skip)
 re_t *rep;
+int skip;
 {
        int i, r, devind, just_one;
        u16_t vid, did;
@@ -597,7 +598,11 @@ re_t *rep;
                        break;
                }
                if (pcitab[i].vid != 0)
-                       break;
+               {
+                       if (just_one || !skip)
+                               break;
+                       skip--;
+               }
 
                if (just_one)
                {
index 0676428d4d58e7d8e8b2cb8af5db5cafbece3fd6..b7b073f328b67c80c1939e3e91183f1d00e1f3dd 100644 (file)
@@ -237,7 +237,7 @@ static void my_outl(u16_t port, u32_t value)
 
 _PROTOTYPE( static void rl_init, (message *mp)                         );
 _PROTOTYPE( static void rl_pci_conf, (void)                            );
-_PROTOTYPE( static int rl_probe, (re_t *rep)                           );
+_PROTOTYPE( static int rl_probe, (re_t *rep, int skip)                 );
 _PROTOTYPE( static void rl_conf_hw, (re_t *rep)                                );
 _PROTOTYPE( static void rl_init_buf, (re_t *rep)                       );
 _PROTOTYPE( static void rl_init_hw, (re_t *rep)                                );
@@ -686,7 +686,7 @@ static void rl_pci_conf()
                                rep->re_pcifunc) != 0) != h) {
                                continue;
                        }
-                       if (rl_probe(rep))
+                       if (rl_probe(rep, i))
                                rep->re_seen = TRUE;
                }
        }
@@ -695,8 +695,9 @@ static void rl_pci_conf()
 /*===========================================================================*
  *                             rl_probe                                     *
  *===========================================================================*/
-static int rl_probe(rep)
+static int rl_probe(rep, skip)
 re_t *rep;
+int skip;
 {
        int i, r, devind, just_one;
        u16_t vid, did;
@@ -734,8 +735,11 @@ re_t *rep;
                        }
                        break;
                }
-               if (pcitab[i].vid != 0)
-                       break;
+               if (pcitab[i].vid != 0) {
+                       if (just_one || !skip)
+                               break;
+                       skip--;
+               }
 
                if (just_one) {
                        printf("%s: wrong PCI device (%04x/%04x) found at %d.%d.%d\n",