diff options
Diffstat (limited to 'drivers/net/qlcnic/qlcnic_hw.c')
| -rw-r--r-- | drivers/net/qlcnic/qlcnic_hw.c | 32 |
1 files changed, 7 insertions, 25 deletions
diff --git a/drivers/net/qlcnic/qlcnic_hw.c b/drivers/net/qlcnic/qlcnic_hw.c index 99a4d1379d00..da00e162b6d3 100644 --- a/drivers/net/qlcnic/qlcnic_hw.c +++ b/drivers/net/qlcnic/qlcnic_hw.c | |||
| @@ -349,6 +349,7 @@ qlcnic_send_cmd_descs(struct qlcnic_adapter *adapter, | |||
| 349 | if (nr_desc >= qlcnic_tx_avail(tx_ring)) { | 349 | if (nr_desc >= qlcnic_tx_avail(tx_ring)) { |
| 350 | netif_tx_stop_queue(tx_ring->txq); | 350 | netif_tx_stop_queue(tx_ring->txq); |
| 351 | __netif_tx_unlock_bh(tx_ring->txq); | 351 | __netif_tx_unlock_bh(tx_ring->txq); |
| 352 | adapter->stats.xmit_off++; | ||
| 352 | return -EBUSY; | 353 | return -EBUSY; |
| 353 | } | 354 | } |
| 354 | 355 | ||
| @@ -397,20 +398,16 @@ qlcnic_sre_macaddr_change(struct qlcnic_adapter *adapter, u8 *addr, | |||
| 397 | return qlcnic_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1); | 398 | return qlcnic_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1); |
| 398 | } | 399 | } |
| 399 | 400 | ||
| 400 | static int qlcnic_nic_add_mac(struct qlcnic_adapter *adapter, | 401 | static int qlcnic_nic_add_mac(struct qlcnic_adapter *adapter, u8 *addr) |
| 401 | u8 *addr, struct list_head *del_list) | ||
| 402 | { | 402 | { |
| 403 | struct list_head *head; | 403 | struct list_head *head; |
| 404 | struct qlcnic_mac_list_s *cur; | 404 | struct qlcnic_mac_list_s *cur; |
| 405 | 405 | ||
| 406 | /* look up if already exists */ | 406 | /* look up if already exists */ |
| 407 | list_for_each(head, del_list) { | 407 | list_for_each(head, &adapter->mac_list) { |
| 408 | cur = list_entry(head, struct qlcnic_mac_list_s, list); | 408 | cur = list_entry(head, struct qlcnic_mac_list_s, list); |
| 409 | 409 | if (memcmp(addr, cur->mac_addr, ETH_ALEN) == 0) | |
| 410 | if (memcmp(addr, cur->mac_addr, ETH_ALEN) == 0) { | ||
| 411 | list_move_tail(head, &adapter->mac_list); | ||
| 412 | return 0; | 410 | return 0; |
| 413 | } | ||
| 414 | } | 411 | } |
| 415 | 412 | ||
| 416 | cur = kzalloc(sizeof(struct qlcnic_mac_list_s), GFP_ATOMIC); | 413 | cur = kzalloc(sizeof(struct qlcnic_mac_list_s), GFP_ATOMIC); |
| @@ -432,14 +429,9 @@ void qlcnic_set_multi(struct net_device *netdev) | |||
| 432 | struct dev_mc_list *mc_ptr; | 429 | struct dev_mc_list *mc_ptr; |
| 433 | u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; | 430 | u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; |
| 434 | u32 mode = VPORT_MISS_MODE_DROP; | 431 | u32 mode = VPORT_MISS_MODE_DROP; |
| 435 | LIST_HEAD(del_list); | ||
| 436 | struct list_head *head; | ||
| 437 | struct qlcnic_mac_list_s *cur; | ||
| 438 | 432 | ||
| 439 | list_splice_tail_init(&adapter->mac_list, &del_list); | 433 | qlcnic_nic_add_mac(adapter, adapter->mac_addr); |
| 440 | 434 | qlcnic_nic_add_mac(adapter, bcast_addr); | |
| 441 | qlcnic_nic_add_mac(adapter, adapter->mac_addr, &del_list); | ||
| 442 | qlcnic_nic_add_mac(adapter, bcast_addr, &del_list); | ||
| 443 | 435 | ||
| 444 | if (netdev->flags & IFF_PROMISC) { | 436 | if (netdev->flags & IFF_PROMISC) { |
| 445 | mode = VPORT_MISS_MODE_ACCEPT_ALL; | 437 | mode = VPORT_MISS_MODE_ACCEPT_ALL; |
| @@ -454,22 +446,12 @@ void qlcnic_set_multi(struct net_device *netdev) | |||
| 454 | 446 | ||
| 455 | if (!netdev_mc_empty(netdev)) { | 447 | if (!netdev_mc_empty(netdev)) { |
| 456 | netdev_for_each_mc_addr(mc_ptr, netdev) { | 448 | netdev_for_each_mc_addr(mc_ptr, netdev) { |
| 457 | qlcnic_nic_add_mac(adapter, mc_ptr->dmi_addr, | 449 | qlcnic_nic_add_mac(adapter, mc_ptr->dmi_addr); |
| 458 | &del_list); | ||
| 459 | } | 450 | } |
| 460 | } | 451 | } |
| 461 | 452 | ||
| 462 | send_fw_cmd: | 453 | send_fw_cmd: |
| 463 | qlcnic_nic_set_promisc(adapter, mode); | 454 | qlcnic_nic_set_promisc(adapter, mode); |
| 464 | head = &del_list; | ||
| 465 | while (!list_empty(head)) { | ||
| 466 | cur = list_entry(head->next, struct qlcnic_mac_list_s, list); | ||
| 467 | |||
| 468 | qlcnic_sre_macaddr_change(adapter, | ||
| 469 | cur->mac_addr, QLCNIC_MAC_DEL); | ||
| 470 | list_del(&cur->list); | ||
| 471 | kfree(cur); | ||
| 472 | } | ||
| 473 | } | 455 | } |
| 474 | 456 | ||
| 475 | int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter, u32 mode) | 457 | int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter, u32 mode) |
