aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index a8def93f6b6b..80d55bf699ba 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -3948,32 +3948,41 @@ static int tg3_load_tso_firmware(struct tg3 *tp)
3948 return 0; 3948 return 0;
3949} 3949}
3950 3950
3951/* tp->lock is held. */
3952static void __tg3_set_one_mac_addr(struct tg3 *tp, u8 *mac_addr, int index)
3953{
3954 u32 addr_high, addr_low;
3955
3956 addr_high = ((mac_addr[0] << 8) | mac_addr[1]);
3957 addr_low = ((mac_addr[2] << 24) | (mac_addr[3] << 16) |
3958 (mac_addr[4] << 8) | mac_addr[5]);
3959
3960 if (index < 4) {
3961 tw32(MAC_ADDR_0_HIGH + (index * 8), addr_high);
3962 tw32(MAC_ADDR_0_LOW + (index * 8), addr_low);
3963 } else {
3964 index -= 4;
3965 tw32(MAC_EXTADDR_0_HIGH + (index * 8), addr_high);
3966 tw32(MAC_EXTADDR_0_LOW + (index * 8), addr_low);
3967 }
3968}
3951 3969
3952/* tp->lock is held. */ 3970/* tp->lock is held. */
3953static void __tg3_set_mac_addr(struct tg3 *tp, bool skip_mac_1) 3971static void __tg3_set_mac_addr(struct tg3 *tp, bool skip_mac_1)
3954{ 3972{
3955 u32 addr_high, addr_low; 3973 u32 addr_high;
3956 int i; 3974 int i;
3957 3975
3958 addr_high = ((tp->dev->dev_addr[0] << 8) |
3959 tp->dev->dev_addr[1]);
3960 addr_low = ((tp->dev->dev_addr[2] << 24) |
3961 (tp->dev->dev_addr[3] << 16) |
3962 (tp->dev->dev_addr[4] << 8) |
3963 (tp->dev->dev_addr[5] << 0));
3964 for (i = 0; i < 4; i++) { 3976 for (i = 0; i < 4; i++) {
3965 if (i == 1 && skip_mac_1) 3977 if (i == 1 && skip_mac_1)
3966 continue; 3978 continue;
3967 tw32(MAC_ADDR_0_HIGH + (i * 8), addr_high); 3979 __tg3_set_one_mac_addr(tp, tp->dev->dev_addr, i);
3968 tw32(MAC_ADDR_0_LOW + (i * 8), addr_low);
3969 } 3980 }
3970 3981
3971 if (tg3_asic_rev(tp) == ASIC_REV_5703 || 3982 if (tg3_asic_rev(tp) == ASIC_REV_5703 ||
3972 tg3_asic_rev(tp) == ASIC_REV_5704) { 3983 tg3_asic_rev(tp) == ASIC_REV_5704) {
3973 for (i = 0; i < 12; i++) { 3984 for (i = 4; i < 16; i++)
3974 tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high); 3985 __tg3_set_one_mac_addr(tp, tp->dev->dev_addr, i);
3975 tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low);
3976 }
3977 } 3986 }
3978 3987
3979 addr_high = (tp->dev->dev_addr[0] + 3988 addr_high = (tp->dev->dev_addr[0] +