[PATCH] starfire driver always in promisc mode?

Ionut Badulescu (ib42@dnttm.ro)
Sat, 27 Nov 1999 19:45:02 +0200 (EET)


Hello,

The starfire driver available from

ftp://cesdis.gsfc.nasa.gov/pub/linux/drivers/test/starfire.c

has a bug in the perfect filter initialization section. The starfire
expects the MAC's to be entered into the perfect filter in big-endian
order, while the driver enters them in host order. To compensate for this,
the driver also sets the board in AcceptAll (promisc) mode and then does
filtering in software, which is clearly suboptimal.

The attached patch seems to solve the problem. It certainly Works for Me..

-- 
Ionut Badulescu <ib42@dnttm.ro>
System Administrator, Network Operation Center
Dynamic Network Technologies, Timisoara, Romania
Phone: +40-56-204967 Fax: +40-56-220201 Connex GSM: #2212
----------------------
--- starfire.c.old	Sat Nov 27 19:31:36 1999
+++ starfire.c	Sat Nov 27 19:43:48 1999
@@ -711,13 +711,13 @@
 
         /* Fill both the unused Tx SA register and the Rx perfect filter. */
         for (i = 0; i < 6; i++)
-                writeb(dev->dev_addr[i], ioaddr + StationAddr + 6-i);
+                writeb(dev->dev_addr[i], ioaddr + StationAddr + 5 - i);
         for (i = 0; i < 16; i++) {
                 u16 *eaddrs = (u16 *)dev->dev_addr;
                 long setup_frm = ioaddr + 0x56000 + i*16;
-                writew(eaddrs[0], setup_frm); setup_frm += 4;
-                writew(eaddrs[1], setup_frm); setup_frm += 4;
-                writew(eaddrs[2], setup_frm); setup_frm += 4;
+                writew(htons(eaddrs[2]), setup_frm); setup_frm += 4;
+                writew(htons(eaddrs[1]), setup_frm); setup_frm += 4;
+                writew(htons(eaddrs[0]), setup_frm);
         }
 
         /* Initialize other registers. */
@@ -1306,9 +1306,9 @@
                 for (i = 1, mclist = dev->mc_list; mclist  &&  i <= dev->mc_count;
                          i++, mclist = mclist->next) {
                         u16 *eaddrs = (u16 *)mclist->dmi_addr;
-                        writew(*eaddrs++, filter_addr); filter_addr += 4;
-                        writew(*eaddrs++, filter_addr); filter_addr += 4;
-                        writew(*eaddrs++, filter_addr); filter_addr += 8;
+                        writew(htons(eaddrs[2]), filter_addr); filter_addr += 4;
+                        writew(htons(eaddrs[1]), filter_addr); filter_addr += 4;
+                        writew(htons(eaddrs[0]), filter_addr); filter_addr += 8;
                 }
                 while (i++ < 16) {
                         writew(0xffff, filter_addr); filter_addr += 4;
@@ -1337,7 +1337,7 @@
                         writew(mc_filter[i], filter_addr);
                 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
         }
-        writel(rx_mode|AcceptAll, ioaddr + RxFilterMode);
+        writel(rx_mode, ioaddr + RxFilterMode);
 }
 
 static int mii_ioctl(struct device *dev, struct ifreq *rq, int cmd)

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/