aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2013-02-05 23:44:58 -0500
committerDavid S. Miller <davem@davemloft.net>2013-02-06 16:06:49 -0500
commit4e209001b86c53f51980292f0efd1933c0e55d66 (patch)
treebef4423945d76e2ae2a078e778ebdd90054bef01 /drivers/net/ethernet/broadcom
parentb5a4c2f3d16790516ccd3b924049bab7ec2e50a2 (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.c33
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
764static 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 */
765static void bgmac_chip_stats_update(struct bgmac *bgmac) 775static void bgmac_chip_stats_update(struct bgmac *bgmac)
766{ 776{
@@ -1006,8 +1016,6 @@ static void bgmac_enable(struct bgmac *bgmac)
1006static void bgmac_chip_init(struct bgmac *bgmac, bool full_init) 1016static 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
1169static 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
1165static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd) 1182static 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