qlcnic: fix set mac addr
[deliverable/linux.git] / drivers / net / qlcnic / qlcnic_hw.c
index 99a4d1379d005e45d556e2fd456091d6dc4831b2..b1753138ac987ce0ce4174cffee4ded14933945e 100644 (file)
@@ -349,6 +349,7 @@ qlcnic_send_cmd_descs(struct qlcnic_adapter *adapter,
        if (nr_desc >= qlcnic_tx_avail(tx_ring)) {
                netif_tx_stop_queue(tx_ring->txq);
                __netif_tx_unlock_bh(tx_ring->txq);
+               adapter->stats.xmit_off++;
                return -EBUSY;
        }
 
@@ -397,20 +398,16 @@ qlcnic_sre_macaddr_change(struct qlcnic_adapter *adapter, u8 *addr,
        return qlcnic_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1);
 }
 
-static int qlcnic_nic_add_mac(struct qlcnic_adapter *adapter,
-               u8 *addr, struct list_head *del_list)
+static int qlcnic_nic_add_mac(struct qlcnic_adapter *adapter, u8 *addr)
 {
        struct list_head *head;
        struct qlcnic_mac_list_s *cur;
 
        /* look up if already exists */
-       list_for_each(head, del_list) {
+       list_for_each(head, &adapter->mac_list) {
                cur = list_entry(head, struct qlcnic_mac_list_s, list);
-
-               if (memcmp(addr, cur->mac_addr, ETH_ALEN) == 0) {
-                       list_move_tail(head, &adapter->mac_list);
+               if (memcmp(addr, cur->mac_addr, ETH_ALEN) == 0)
                        return 0;
-               }
        }
 
        cur = kzalloc(sizeof(struct qlcnic_mac_list_s), GFP_ATOMIC);
@@ -432,14 +429,12 @@ void qlcnic_set_multi(struct net_device *netdev)
        struct dev_mc_list *mc_ptr;
        u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
        u32 mode = VPORT_MISS_MODE_DROP;
-       LIST_HEAD(del_list);
-       struct list_head *head;
-       struct qlcnic_mac_list_s *cur;
 
-       list_splice_tail_init(&adapter->mac_list, &del_list);
+       if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
+               return;
 
-       qlcnic_nic_add_mac(adapter, adapter->mac_addr, &del_list);
-       qlcnic_nic_add_mac(adapter, bcast_addr, &del_list);
+       qlcnic_nic_add_mac(adapter, adapter->mac_addr);
+       qlcnic_nic_add_mac(adapter, bcast_addr);
 
        if (netdev->flags & IFF_PROMISC) {
                mode = VPORT_MISS_MODE_ACCEPT_ALL;
@@ -454,22 +449,12 @@ void qlcnic_set_multi(struct net_device *netdev)
 
        if (!netdev_mc_empty(netdev)) {
                netdev_for_each_mc_addr(mc_ptr, netdev) {
-                       qlcnic_nic_add_mac(adapter, mc_ptr->dmi_addr,
-                                                       &del_list);
+                       qlcnic_nic_add_mac(adapter, mc_ptr->dmi_addr);
                }
        }
 
 send_fw_cmd:
        qlcnic_nic_set_promisc(adapter, mode);
-       head = &del_list;
-       while (!list_empty(head)) {
-               cur = list_entry(head->next, struct qlcnic_mac_list_s, list);
-
-               qlcnic_sre_macaddr_change(adapter,
-                               cur->mac_addr, QLCNIC_MAC_DEL);
-               list_del(&cur->list);
-               kfree(cur);
-       }
 }
 
 int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter, u32 mode)
This page took 0.025223 seconds and 5 git commands to generate.