Commit 923ca6f6 authored by Jakub Kicinski's avatar Jakub Kicinski

ethernet: replace netdev->dev_addr 16bit writes

Commit 406f42fa ("net-next: When a bond have a massive amount
of VLANs...") introduced a rbtree for faster Ethernet address look
up. To maintain netdev->dev_addr in this tree we need to make all
the writes to it got through appropriate helpers.

This patch takes care of drivers which cast netdev->dev_addr to
a 16bit type, often with an explicit byte order.
Acked-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 562ef98a
...@@ -567,6 +567,7 @@ static int corkscrew_setup(struct net_device *dev, int ioaddr, ...@@ -567,6 +567,7 @@ static int corkscrew_setup(struct net_device *dev, int ioaddr,
{ {
struct corkscrew_private *vp = netdev_priv(dev); struct corkscrew_private *vp = netdev_priv(dev);
unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */ unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */
__be16 addr[ETH_ALEN / 2];
int i; int i;
int irq; int irq;
...@@ -619,7 +620,6 @@ static int corkscrew_setup(struct net_device *dev, int ioaddr, ...@@ -619,7 +620,6 @@ static int corkscrew_setup(struct net_device *dev, int ioaddr,
/* Read the station address from the EEPROM. */ /* Read the station address from the EEPROM. */
EL3WINDOW(0); EL3WINDOW(0);
for (i = 0; i < 0x18; i++) { for (i = 0; i < 0x18; i++) {
__be16 *phys_addr = (__be16 *) dev->dev_addr;
int timer; int timer;
outw(EEPROM_Read + i, ioaddr + Wn0EepromCmd); outw(EEPROM_Read + i, ioaddr + Wn0EepromCmd);
/* Pause for at least 162 us. for the read to take place. */ /* Pause for at least 162 us. for the read to take place. */
...@@ -631,8 +631,9 @@ static int corkscrew_setup(struct net_device *dev, int ioaddr, ...@@ -631,8 +631,9 @@ static int corkscrew_setup(struct net_device *dev, int ioaddr,
eeprom[i] = inw(ioaddr + Wn0EepromData); eeprom[i] = inw(ioaddr + Wn0EepromData);
checksum ^= eeprom[i]; checksum ^= eeprom[i];
if (i < 3) if (i < 3)
phys_addr[i] = htons(eeprom[i]); addr[i] = htons(eeprom[i]);
} }
eth_hw_addr_set(dev, (u8 *)addr);
checksum = (checksum ^ (checksum >> 8)) & 0xff; checksum = (checksum ^ (checksum >> 8)) & 0xff;
if (checksum != 0x00) if (checksum != 0x00)
pr_cont(" ***INVALID CHECKSUM %4.4x*** ", checksum); pr_cont(" ***INVALID CHECKSUM %4.4x*** ", checksum);
......
...@@ -305,15 +305,13 @@ static int tc574_config(struct pcmcia_device *link) ...@@ -305,15 +305,13 @@ static int tc574_config(struct pcmcia_device *link)
struct net_device *dev = link->priv; struct net_device *dev = link->priv;
struct el3_private *lp = netdev_priv(dev); struct el3_private *lp = netdev_priv(dev);
int ret, i, j; int ret, i, j;
__be16 addr[ETH_ALEN / 2];
unsigned int ioaddr; unsigned int ioaddr;
__be16 *phys_addr;
char *cardname; char *cardname;
__u32 config; __u32 config;
u8 *buf; u8 *buf;
size_t len; size_t len;
phys_addr = (__be16 *)dev->dev_addr;
dev_dbg(&link->dev, "3c574_config()\n"); dev_dbg(&link->dev, "3c574_config()\n");
link->io_lines = 16; link->io_lines = 16;
...@@ -347,19 +345,20 @@ static int tc574_config(struct pcmcia_device *link) ...@@ -347,19 +345,20 @@ static int tc574_config(struct pcmcia_device *link)
len = pcmcia_get_tuple(link, 0x88, &buf); len = pcmcia_get_tuple(link, 0x88, &buf);
if (buf && len >= 6) { if (buf && len >= 6) {
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
phys_addr[i] = htons(le16_to_cpu(buf[i * 2])); addr[i] = htons(le16_to_cpu(buf[i * 2]));
kfree(buf); kfree(buf);
} else { } else {
kfree(buf); /* 0 < len < 6 */ kfree(buf); /* 0 < len < 6 */
EL3WINDOW(0); EL3WINDOW(0);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
phys_addr[i] = htons(read_eeprom(ioaddr, i + 10)); addr[i] = htons(read_eeprom(ioaddr, i + 10));
if (phys_addr[0] == htons(0x6060)) { if (addr[0] == htons(0x6060)) {
pr_notice("IO port conflict at 0x%03lx-0x%03lx\n", pr_notice("IO port conflict at 0x%03lx-0x%03lx\n",
dev->base_addr, dev->base_addr+15); dev->base_addr, dev->base_addr+15);
goto failed; goto failed;
} }
} }
eth_hw_addr_set(dev, (u8 *)addr);
if (link->prod_id[1]) if (link->prod_id[1])
cardname = link->prod_id[1]; cardname = link->prod_id[1];
else else
......
...@@ -237,8 +237,8 @@ static void tc589_detach(struct pcmcia_device *link) ...@@ -237,8 +237,8 @@ static void tc589_detach(struct pcmcia_device *link)
static int tc589_config(struct pcmcia_device *link) static int tc589_config(struct pcmcia_device *link)
{ {
struct net_device *dev = link->priv; struct net_device *dev = link->priv;
__be16 *phys_addr;
int ret, i, j, multi = 0, fifo; int ret, i, j, multi = 0, fifo;
__be16 addr[ETH_ALEN / 2];
unsigned int ioaddr; unsigned int ioaddr;
static const char * const ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; static const char * const ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
u8 *buf; u8 *buf;
...@@ -246,7 +246,6 @@ static int tc589_config(struct pcmcia_device *link) ...@@ -246,7 +246,6 @@ static int tc589_config(struct pcmcia_device *link)
dev_dbg(&link->dev, "3c589_config\n"); dev_dbg(&link->dev, "3c589_config\n");
phys_addr = (__be16 *)dev->dev_addr;
/* Is this a 3c562? */ /* Is this a 3c562? */
if (link->manf_id != MANFID_3COM) if (link->manf_id != MANFID_3COM)
dev_info(&link->dev, "hmmm, is this really a 3Com card??\n"); dev_info(&link->dev, "hmmm, is this really a 3Com card??\n");
...@@ -285,18 +284,19 @@ static int tc589_config(struct pcmcia_device *link) ...@@ -285,18 +284,19 @@ static int tc589_config(struct pcmcia_device *link)
len = pcmcia_get_tuple(link, 0x88, &buf); len = pcmcia_get_tuple(link, 0x88, &buf);
if (buf && len >= 6) { if (buf && len >= 6) {
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
phys_addr[i] = htons(le16_to_cpu(buf[i*2])); addr[i] = htons(le16_to_cpu(buf[i*2]));
kfree(buf); kfree(buf);
} else { } else {
kfree(buf); /* 0 < len < 6 */ kfree(buf); /* 0 < len < 6 */
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
phys_addr[i] = htons(read_eeprom(ioaddr, i)); addr[i] = htons(read_eeprom(ioaddr, i));
if (phys_addr[0] == htons(0x6060)) { if (addr[0] == htons(0x6060)) {
dev_err(&link->dev, "IO port conflict at 0x%03lx-0x%03lx\n", dev_err(&link->dev, "IO port conflict at 0x%03lx-0x%03lx\n",
dev->base_addr, dev->base_addr+15); dev->base_addr, dev->base_addr+15);
goto failed; goto failed;
} }
} }
eth_hw_addr_set(dev, (u8 *)addr);
/* The address and resource configuration register aren't loaded from /* The address and resource configuration register aren't loaded from
* the EEPROM and *must* be set to 0 and IRQ3 for the PCMCIA version. * the EEPROM and *must* be set to 0 and IRQ3 for the PCMCIA version.
......
...@@ -1091,6 +1091,7 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq, ...@@ -1091,6 +1091,7 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq,
struct vortex_private *vp; struct vortex_private *vp;
int option; int option;
unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */ unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */
__be16 addr[ETH_ALEN / 2];
int i, step; int i, step;
struct net_device *dev; struct net_device *dev;
static int printed_version; static int printed_version;
...@@ -1284,7 +1285,8 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq, ...@@ -1284,7 +1285,8 @@ static int vortex_probe1(struct device *gendev, void __iomem *ioaddr, int irq,
if ((checksum != 0x00) && !(vci->drv_flags & IS_TORNADO)) if ((checksum != 0x00) && !(vci->drv_flags & IS_TORNADO))
pr_cont(" ***INVALID CHECKSUM %4.4x*** ", checksum); pr_cont(" ***INVALID CHECKSUM %4.4x*** ", checksum);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((__be16 *)dev->dev_addr)[i] = htons(eeprom[i + 10]); addr[i] = htons(eeprom[i + 10]);
eth_hw_addr_set(dev, (u8 *)addr);
if (print_info) if (print_info)
pr_cont(" %pM", dev->dev_addr); pr_cont(" %pM", dev->dev_addr);
/* Unfortunately an all zero eeprom passes the checksum and this /* Unfortunately an all zero eeprom passes the checksum and this
......
...@@ -355,6 +355,7 @@ static int w840_probe1(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -355,6 +355,7 @@ static int w840_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
int chip_idx = ent->driver_data; int chip_idx = ent->driver_data;
int irq; int irq;
int i, option = find_cnt < MAX_UNITS ? options[find_cnt] : 0; int i, option = find_cnt < MAX_UNITS ? options[find_cnt] : 0;
__le16 addr[ETH_ALEN / 2];
void __iomem *ioaddr; void __iomem *ioaddr;
i = pcim_enable_device(pdev); i = pcim_enable_device(pdev);
...@@ -382,7 +383,8 @@ static int w840_probe1(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -382,7 +383,8 @@ static int w840_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
goto err_out_netdev; goto err_out_netdev;
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((__le16 *)dev->dev_addr)[i] = cpu_to_le16(eeprom_read(ioaddr, i)); addr[i] = cpu_to_le16(eeprom_read(ioaddr, i));
eth_hw_addr_set(dev, (u8 *)addr);
/* Reset the chip to erase previous misconfiguration. /* Reset the chip to erase previous misconfiguration.
No hold time required! */ No hold time required! */
......
...@@ -508,6 +508,7 @@ static int sundance_probe1(struct pci_dev *pdev, ...@@ -508,6 +508,7 @@ static int sundance_probe1(struct pci_dev *pdev,
int bar = 1; int bar = 1;
#endif #endif
int phy, phy_end, phy_idx = 0; int phy, phy_end, phy_idx = 0;
__le16 addr[ETH_ALEN / 2];
if (pci_enable_device(pdev)) if (pci_enable_device(pdev))
return -EIO; return -EIO;
...@@ -528,8 +529,9 @@ static int sundance_probe1(struct pci_dev *pdev, ...@@ -528,8 +529,9 @@ static int sundance_probe1(struct pci_dev *pdev,
goto err_out_res; goto err_out_res;
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((__le16 *)dev->dev_addr)[i] = addr[i] =
cpu_to_le16(eeprom_read(ioaddr, i + EEPROM_SA_OFFSET)); cpu_to_le16(eeprom_read(ioaddr, i + EEPROM_SA_OFFSET));
eth_hw_addr_set(dev, (u8 *)addr);
np = netdev_priv(dev); np = netdev_priv(dev);
np->ndev = dev; np->ndev = dev;
......
...@@ -508,10 +508,12 @@ static void eeprom_readword(struct ql3_adapter *qdev, ...@@ -508,10 +508,12 @@ static void eeprom_readword(struct ql3_adapter *qdev,
static void ql_set_mac_addr(struct net_device *ndev, u16 *addr) static void ql_set_mac_addr(struct net_device *ndev, u16 *addr)
{ {
__le16 *p = (__le16 *)ndev->dev_addr; __le16 buf[ETH_ALEN / 2];
p[0] = cpu_to_le16(addr[0]);
p[1] = cpu_to_le16(addr[1]); buf[0] = cpu_to_le16(addr[0]);
p[2] = cpu_to_le16(addr[2]); buf[1] = cpu_to_le16(addr[1]);
buf[2] = cpu_to_le16(addr[2]);
eth_hw_addr_set(ndev, (u8 *)buf);
} }
static int ql_get_nvram_params(struct ql3_adapter *qdev) static int ql_get_nvram_params(struct ql3_adapter *qdev)
......
...@@ -1031,8 +1031,8 @@ static int r6040_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1031,8 +1031,8 @@ static int r6040_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
void __iomem *ioaddr; void __iomem *ioaddr;
int err, io_size = R6040_IO_SIZE; int err, io_size = R6040_IO_SIZE;
static int card_idx = -1; static int card_idx = -1;
u16 addr[ETH_ALEN / 2];
int bar = 0; int bar = 0;
u16 *adrp;
pr_info("%s\n", version); pr_info("%s\n", version);
...@@ -1102,14 +1102,14 @@ static int r6040_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1102,14 +1102,14 @@ static int r6040_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
/* Set MAC address */ /* Set MAC address */
card_idx++; card_idx++;
adrp = (u16 *)dev->dev_addr; addr[0] = ioread16(ioaddr + MID_0L);
adrp[0] = ioread16(ioaddr + MID_0L); addr[1] = ioread16(ioaddr + MID_0M);
adrp[1] = ioread16(ioaddr + MID_0M); addr[2] = ioread16(ioaddr + MID_0H);
adrp[2] = ioread16(ioaddr + MID_0H); eth_hw_addr_set(dev, (u8 *)addr);
/* Some bootloader/BIOSes do not initialize /* Some bootloader/BIOSes do not initialize
* MAC address, warn about that */ * MAC address, warn about that */
if (!(adrp[0] || adrp[1] || adrp[2])) { if (!(addr[0] || addr[1] || addr[2])) {
netdev_warn(dev, "MAC address not initialized, " netdev_warn(dev, "MAC address not initialized, "
"generating random\n"); "generating random\n");
eth_hw_addr_random(dev); eth_hw_addr_random(dev);
......
...@@ -1889,6 +1889,7 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1889,6 +1889,7 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
void __iomem *regs; void __iomem *regs;
resource_size_t pciaddr; resource_size_t pciaddr;
unsigned int addr_len, i, pci_using_dac; unsigned int addr_len, i, pci_using_dac;
__le16 addr[ETH_ALEN / 2];
pr_info_once("%s", version); pr_info_once("%s", version);
...@@ -1979,8 +1980,8 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1979,8 +1980,8 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
/* read MAC address from EEPROM */ /* read MAC address from EEPROM */
addr_len = read_eeprom (regs, 0, 8) == 0x8129 ? 8 : 6; addr_len = read_eeprom (regs, 0, 8) == 0x8129 ? 8 : 6;
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((__le16 *) (dev->dev_addr))[i] = addr[i] = cpu_to_le16(read_eeprom (regs, i + 7, addr_len));
cpu_to_le16(read_eeprom (regs, i + 7, addr_len)); eth_hw_addr_set(dev, (u8 *)addr);
dev->netdev_ops = &cp_netdev_ops; dev->netdev_ops = &cp_netdev_ops;
netif_napi_add(dev, &cp->napi, cp_rx_poll, 16); netif_napi_add(dev, &cp->napi, cp_rx_poll, 16);
......
...@@ -945,6 +945,7 @@ static int rtl8139_init_one(struct pci_dev *pdev, ...@@ -945,6 +945,7 @@ static int rtl8139_init_one(struct pci_dev *pdev,
{ {
struct net_device *dev = NULL; struct net_device *dev = NULL;
struct rtl8139_private *tp; struct rtl8139_private *tp;
__le16 addr[ETH_ALEN / 2];
int i, addr_len, option; int i, addr_len, option;
void __iomem *ioaddr; void __iomem *ioaddr;
static int board_idx = -1; static int board_idx = -1;
...@@ -994,8 +995,8 @@ static int rtl8139_init_one(struct pci_dev *pdev, ...@@ -994,8 +995,8 @@ static int rtl8139_init_one(struct pci_dev *pdev,
addr_len = read_eeprom (ioaddr, 0, 8) == 0x8129 ? 8 : 6; addr_len = read_eeprom (ioaddr, 0, 8) == 0x8129 ? 8 : 6;
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((__le16 *) (dev->dev_addr))[i] = addr[i] = cpu_to_le16(read_eeprom (ioaddr, i + 7, addr_len));
cpu_to_le16(read_eeprom (ioaddr, i + 7, addr_len)); eth_hw_addr_set(dev, (u8 *)addr);
/* The Rtl8139-specific entries in the device structure. */ /* The Rtl8139-specific entries in the device structure. */
dev->netdev_ops = &rtl8139_netdev_ops; dev->netdev_ops = &rtl8139_netdev_ops;
......
...@@ -368,6 +368,7 @@ static int __init atp_probe1(long ioaddr) ...@@ -368,6 +368,7 @@ static int __init atp_probe1(long ioaddr)
static void __init get_node_ID(struct net_device *dev) static void __init get_node_ID(struct net_device *dev)
{ {
long ioaddr = dev->base_addr; long ioaddr = dev->base_addr;
__be16 addr[ETH_ALEN / 2];
int sa_offset = 0; int sa_offset = 0;
int i; int i;
...@@ -379,8 +380,9 @@ static void __init get_node_ID(struct net_device *dev) ...@@ -379,8 +380,9 @@ static void __init get_node_ID(struct net_device *dev)
sa_offset = 15; sa_offset = 15;
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((__be16 *)dev->dev_addr)[i] = addr[i] =
cpu_to_be16(eeprom_op(ioaddr, EE_READ(sa_offset + i))); cpu_to_be16(eeprom_op(ioaddr, EE_READ(sa_offset + i)));
eth_hw_addr_set(dev, (u8 *)addr);
write_reg(ioaddr, CMR2, CMR2_NULL); write_reg(ioaddr, CMR2, CMR2_NULL);
} }
......
...@@ -1586,6 +1586,7 @@ static int sis190_get_mac_addr_from_eeprom(struct pci_dev *pdev, ...@@ -1586,6 +1586,7 @@ static int sis190_get_mac_addr_from_eeprom(struct pci_dev *pdev,
{ {
struct sis190_private *tp = netdev_priv(dev); struct sis190_private *tp = netdev_priv(dev);
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
__le16 addr[ETH_ALEN / 2];
u16 sig; u16 sig;
int i; int i;
...@@ -1606,8 +1607,9 @@ static int sis190_get_mac_addr_from_eeprom(struct pci_dev *pdev, ...@@ -1606,8 +1607,9 @@ static int sis190_get_mac_addr_from_eeprom(struct pci_dev *pdev,
for (i = 0; i < ETH_ALEN / 2; i++) { for (i = 0; i < ETH_ALEN / 2; i++) {
u16 w = sis190_read_eeprom(ioaddr, EEPROMMACAddr + i); u16 w = sis190_read_eeprom(ioaddr, EEPROMMACAddr + i);
((__le16 *)dev->dev_addr)[i] = cpu_to_le16(w); addr[i] = cpu_to_le16(w);
} }
eth_hw_addr_set(dev, (u8 *)addr);
sis190_set_rgmii(tp, sis190_read_eeprom(ioaddr, EEPROMInfo)); sis190_set_rgmii(tp, sis190_read_eeprom(ioaddr, EEPROMInfo));
......
...@@ -258,6 +258,7 @@ static int sis900_get_mac_addr(struct pci_dev *pci_dev, ...@@ -258,6 +258,7 @@ static int sis900_get_mac_addr(struct pci_dev *pci_dev,
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
void __iomem *ioaddr = sis_priv->ioaddr; void __iomem *ioaddr = sis_priv->ioaddr;
u16 addr[ETH_ALEN / 2];
u16 signature; u16 signature;
int i; int i;
...@@ -271,7 +272,8 @@ static int sis900_get_mac_addr(struct pci_dev *pci_dev, ...@@ -271,7 +272,8 @@ static int sis900_get_mac_addr(struct pci_dev *pci_dev,
/* get MAC address from EEPROM */ /* get MAC address from EEPROM */
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((u16 *)(net_dev->dev_addr))[i] = read_eeprom(ioaddr, i+EEPROMMACAddr); addr[i] = read_eeprom(ioaddr, i+EEPROMMACAddr);
eth_hw_addr_set(net_dev, (u8 *)addr);
return 1; return 1;
} }
...@@ -331,6 +333,7 @@ static int sis635_get_mac_addr(struct pci_dev *pci_dev, ...@@ -331,6 +333,7 @@ static int sis635_get_mac_addr(struct pci_dev *pci_dev,
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
void __iomem *ioaddr = sis_priv->ioaddr; void __iomem *ioaddr = sis_priv->ioaddr;
u16 addr[ETH_ALEN / 2];
u32 rfcrSave; u32 rfcrSave;
u32 i; u32 i;
...@@ -345,8 +348,9 @@ static int sis635_get_mac_addr(struct pci_dev *pci_dev, ...@@ -345,8 +348,9 @@ static int sis635_get_mac_addr(struct pci_dev *pci_dev,
/* load MAC addr to filter data register */ /* load MAC addr to filter data register */
for (i = 0 ; i < 3 ; i++) { for (i = 0 ; i < 3 ; i++) {
sw32(rfcr, (i << RFADDR_shift)); sw32(rfcr, (i << RFADDR_shift));
*( ((u16 *)net_dev->dev_addr) + i) = sr16(rfdr); addr[i] = sr16(rfdr);
} }
eth_hw_addr_set(net_dev, (u8 *)addr);
/* enable packet filtering */ /* enable packet filtering */
sw32(rfcr, rfcrSave | RFEN); sw32(rfcr, rfcrSave | RFEN);
...@@ -375,17 +379,18 @@ static int sis96x_get_mac_addr(struct pci_dev *pci_dev, ...@@ -375,17 +379,18 @@ static int sis96x_get_mac_addr(struct pci_dev *pci_dev,
{ {
struct sis900_private *sis_priv = netdev_priv(net_dev); struct sis900_private *sis_priv = netdev_priv(net_dev);
void __iomem *ioaddr = sis_priv->ioaddr; void __iomem *ioaddr = sis_priv->ioaddr;
u16 addr[ETH_ALEN / 2];
int wait, rc = 0; int wait, rc = 0;
sw32(mear, EEREQ); sw32(mear, EEREQ);
for (wait = 0; wait < 2000; wait++) { for (wait = 0; wait < 2000; wait++) {
if (sr32(mear) & EEGNT) { if (sr32(mear) & EEGNT) {
u16 *mac = (u16 *)net_dev->dev_addr;
int i; int i;
/* get MAC address from EEPROM */ /* get MAC address from EEPROM */
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
mac[i] = read_eeprom(ioaddr, i + EEPROMMACAddr); addr[i] = read_eeprom(ioaddr, i + EEPROMMACAddr);
eth_hw_addr_set(net_dev, (u8 *)addr);
rc = 1; rc = 1;
break; break;
......
...@@ -325,6 +325,7 @@ static int epic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -325,6 +325,7 @@ static int epic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
struct net_device *dev; struct net_device *dev;
struct epic_private *ep; struct epic_private *ep;
int i, ret, option = 0, duplex = 0; int i, ret, option = 0, duplex = 0;
__le16 addr[ETH_ALEN / 2];
void *ring_space; void *ring_space;
dma_addr_t ring_dma; dma_addr_t ring_dma;
...@@ -416,7 +417,8 @@ static int epic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -416,7 +417,8 @@ static int epic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
/* Note: the '175 does not have a serial EEPROM. */ /* Note: the '175 does not have a serial EEPROM. */
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
((__le16 *)dev->dev_addr)[i] = cpu_to_le16(er16(LAN0 + i*4)); addr[i] = cpu_to_le16(er16(LAN0 + i*4));
eth_hw_addr_set(dev, (u8 *)addr);
if (debug > 2) { if (debug > 2) {
dev_dbg(&pdev->dev, "EEPROM contents:\n"); dev_dbg(&pdev->dev, "EEPROM contents:\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment