qlge: Fix bonding mac address bug.
authorRon Mercer <ron.mercer@qlogic.com>
Wed, 17 Feb 2010 06:41:22 +0000 (06:41 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 Feb 2010 21:35:37 +0000 (13:35 -0800)
Use local copy of current mac address when initializing.  In bonding
testing we saw cases where dev_addr was out of data causing failover
errors.

Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlge/qlge.h
drivers/net/qlge/qlge_main.c

index 57d135e3bfaf5843ba6e22a3c925ffe39ad2dea6..8b742b639ceba5c19d0af01346f82e48fa6c7e8e 100644 (file)
@@ -2139,6 +2139,8 @@ struct ql_adapter {
        u16 device_id;
        struct timer_list timer;
        atomic_t lb_count;
+       /* Keep local copy of current mac address. */
+       char current_mac_addr[6];
 };
 
 /*
index 0541e777694df39e331c19a7d6ebc608d013935d..c170349717c5d4770af5fed1159cdb2b96ccaac6 100644 (file)
@@ -463,7 +463,7 @@ static int ql_set_mac_addr(struct ql_adapter *qdev, int set)
        char *addr;
 
        if (set) {
-               addr = &qdev->ndev->dev_addr[0];
+               addr = &qdev->current_mac_addr[0];
                netif_printk(qdev, ifup, KERN_DEBUG, qdev->ndev,
                             "Set Mac addr %pM\n", addr);
        } else {
@@ -4301,6 +4301,8 @@ static int qlge_set_mac_address(struct net_device *ndev, void *p)
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
        memcpy(ndev->dev_addr, addr->sa_data, ndev->addr_len);
+       /* Update local copy of current mac address. */
+       memcpy(qdev->current_mac_addr, ndev->dev_addr, ndev->addr_len);
 
        status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
        if (status)
@@ -4542,6 +4544,8 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
        }
 
        memcpy(ndev->perm_addr, ndev->dev_addr, ndev->addr_len);
+       /* Keep local copy of current mac address. */
+       memcpy(qdev->current_mac_addr, ndev->dev_addr, ndev->addr_len);
 
        /* Set up the default ring sizes. */
        qdev->tx_ring_size = NUM_TX_RING_ENTRIES;