tg3: Refactor __tg3_set_mac_addr()
authorMichael Chan <mchan@broadcom.com>
Fri, 3 Jan 2014 18:09:11 +0000 (10:09 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 4 Jan 2014 01:59:51 +0000 (20:59 -0500)
so that individual MAC address filter entries can be set.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: Nithin Nayak Sujir <nsujir@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/tg3.c

index a8def93f6b6b7a1cf5b02bfa988a6c701a7797d9..80d55bf699baaaecf45de49540c718660e3ceedc 100644 (file)
@@ -3948,32 +3948,41 @@ static int tg3_load_tso_firmware(struct tg3 *tp)
        return 0;
 }
 
+/* tp->lock is held. */
+static void __tg3_set_one_mac_addr(struct tg3 *tp, u8 *mac_addr, int index)
+{
+       u32 addr_high, addr_low;
+
+       addr_high = ((mac_addr[0] << 8) | mac_addr[1]);
+       addr_low = ((mac_addr[2] << 24) | (mac_addr[3] << 16) |
+                   (mac_addr[4] <<  8) | mac_addr[5]);
+
+       if (index < 4) {
+               tw32(MAC_ADDR_0_HIGH + (index * 8), addr_high);
+               tw32(MAC_ADDR_0_LOW + (index * 8), addr_low);
+       } else {
+               index -= 4;
+               tw32(MAC_EXTADDR_0_HIGH + (index * 8), addr_high);
+               tw32(MAC_EXTADDR_0_LOW + (index * 8), addr_low);
+       }
+}
 
 /* tp->lock is held. */
 static void __tg3_set_mac_addr(struct tg3 *tp, bool skip_mac_1)
 {
-       u32 addr_high, addr_low;
+       u32 addr_high;
        int i;
 
-       addr_high = ((tp->dev->dev_addr[0] << 8) |
-                    tp->dev->dev_addr[1]);
-       addr_low = ((tp->dev->dev_addr[2] << 24) |
-                   (tp->dev->dev_addr[3] << 16) |
-                   (tp->dev->dev_addr[4] <<  8) |
-                   (tp->dev->dev_addr[5] <<  0));
        for (i = 0; i < 4; i++) {
                if (i == 1 && skip_mac_1)
                        continue;
-               tw32(MAC_ADDR_0_HIGH + (i * 8), addr_high);
-               tw32(MAC_ADDR_0_LOW + (i * 8), addr_low);
+               __tg3_set_one_mac_addr(tp, tp->dev->dev_addr, i);
        }
 
        if (tg3_asic_rev(tp) == ASIC_REV_5703 ||
            tg3_asic_rev(tp) == ASIC_REV_5704) {
-               for (i = 0; i < 12; i++) {
-                       tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high);
-                       tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low);
-               }
+               for (i = 4; i < 16; i++)
+                       __tg3_set_one_mac_addr(tp, tp->dev->dev_addr, i);
        }
 
        addr_high = (tp->dev->dev_addr[0] +