diff options
author | Hauke Mehrtens <hauke@hauke-m.de> | 2013-02-05 23:44:58 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-02-06 16:06:49 -0500 |
commit | 4e209001b86c53f51980292f0efd1933c0e55d66 (patch) | |
tree | bef4423945d76e2ae2a078e778ebdd90054bef01 /drivers/net/ethernet/broadcom | |
parent | b5a4c2f3d16790516ccd3b924049bab7ec2e50a2 (diff) |
bgmac: write mac address to hardware in ndo_set_mac_address
The generic implementation just changes the netdev struct and does not
write the new mac address to the hardware or issues some command to do
so.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom')
-rw-r--r-- | drivers/net/ethernet/broadcom/bgmac.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c index 58e0c708e253..c015239600a1 100644 --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c | |||
@@ -761,6 +761,16 @@ static void bgmac_cmdcfg_maskset(struct bgmac *bgmac, u32 mask, u32 set, | |||
761 | udelay(2); | 761 | udelay(2); |
762 | } | 762 | } |
763 | 763 | ||
764 | static void bgmac_write_mac_address(struct bgmac *bgmac, u8 *addr) | ||
765 | { | ||
766 | u32 tmp; | ||
767 | |||
768 | tmp = (addr[0] << 24) | (addr[1] << 16) | (addr[2] << 8) | addr[3]; | ||
769 | bgmac_write(bgmac, BGMAC_MACADDR_HIGH, tmp); | ||
770 | tmp = (addr[4] << 8) | addr[5]; | ||
771 | bgmac_write(bgmac, BGMAC_MACADDR_LOW, tmp); | ||
772 | } | ||
773 | |||
764 | #if 0 /* We don't use that regs yet */ | 774 | #if 0 /* We don't use that regs yet */ |
765 | static void bgmac_chip_stats_update(struct bgmac *bgmac) | 775 | static void bgmac_chip_stats_update(struct bgmac *bgmac) |
766 | { | 776 | { |
@@ -1006,8 +1016,6 @@ static void bgmac_enable(struct bgmac *bgmac) | |||
1006 | static void bgmac_chip_init(struct bgmac *bgmac, bool full_init) | 1016 | static void bgmac_chip_init(struct bgmac *bgmac, bool full_init) |
1007 | { | 1017 | { |
1008 | struct bgmac_dma_ring *ring; | 1018 | struct bgmac_dma_ring *ring; |
1009 | u8 *mac = bgmac->net_dev->dev_addr; | ||
1010 | u32 tmp; | ||
1011 | int i; | 1019 | int i; |
1012 | 1020 | ||
1013 | /* 1 interrupt per received frame */ | 1021 | /* 1 interrupt per received frame */ |
@@ -1021,11 +1029,7 @@ static void bgmac_chip_init(struct bgmac *bgmac, bool full_init) | |||
1021 | else | 1029 | else |
1022 | bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_PROM, 0, false); | 1030 | bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_PROM, 0, false); |
1023 | 1031 | ||
1024 | /* Set MAC addr */ | 1032 | bgmac_write_mac_address(bgmac, bgmac->net_dev->dev_addr); |
1025 | tmp = (mac[0] << 24) | (mac[1] << 16) | (mac[2] << 8) | mac[3]; | ||
1026 | bgmac_write(bgmac, BGMAC_MACADDR_HIGH, tmp); | ||
1027 | tmp = (mac[4] << 8) | mac[5]; | ||
1028 | bgmac_write(bgmac, BGMAC_MACADDR_LOW, tmp); | ||
1029 | 1033 | ||
1030 | if (bgmac->loopback) | 1034 | if (bgmac->loopback) |
1031 | bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_ML, true); | 1035 | bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_ML, true); |
@@ -1162,6 +1166,19 @@ static netdev_tx_t bgmac_start_xmit(struct sk_buff *skb, | |||
1162 | return bgmac_dma_tx_add(bgmac, ring, skb); | 1166 | return bgmac_dma_tx_add(bgmac, ring, skb); |
1163 | } | 1167 | } |
1164 | 1168 | ||
1169 | static int bgmac_set_mac_address(struct net_device *net_dev, void *addr) | ||
1170 | { | ||
1171 | struct bgmac *bgmac = netdev_priv(net_dev); | ||
1172 | int ret; | ||
1173 | |||
1174 | ret = eth_prepare_mac_addr_change(net_dev, addr); | ||
1175 | if (ret < 0) | ||
1176 | return ret; | ||
1177 | bgmac_write_mac_address(bgmac, (u8 *)addr); | ||
1178 | eth_commit_mac_addr_change(net_dev, addr); | ||
1179 | return 0; | ||
1180 | } | ||
1181 | |||
1165 | static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd) | 1182 | static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd) |
1166 | { | 1183 | { |
1167 | struct bgmac *bgmac = netdev_priv(net_dev); | 1184 | struct bgmac *bgmac = netdev_priv(net_dev); |
@@ -1192,7 +1209,7 @@ static const struct net_device_ops bgmac_netdev_ops = { | |||
1192 | .ndo_open = bgmac_open, | 1209 | .ndo_open = bgmac_open, |
1193 | .ndo_stop = bgmac_stop, | 1210 | .ndo_stop = bgmac_stop, |
1194 | .ndo_start_xmit = bgmac_start_xmit, | 1211 | .ndo_start_xmit = bgmac_start_xmit, |
1195 | .ndo_set_mac_address = eth_mac_addr, /* generic, sets dev_addr */ | 1212 | .ndo_set_mac_address = bgmac_set_mac_address, |
1196 | .ndo_do_ioctl = bgmac_ioctl, | 1213 | .ndo_do_ioctl = bgmac_ioctl, |
1197 | }; | 1214 | }; |
1198 | 1215 | ||