aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSucheta Chakraborty <sucheta.chakraborty@qlogic.com>2010-03-07 19:14:47 -0500
committerDavid S. Miller <davem@davemloft.net>2010-03-08 13:45:29 -0500
commit9ab17b3968f9521bb4fffd8767953d2b0148aad0 (patch)
tree832ba2be1bd501563f03138e90cd5a84b113293c /drivers
parent8bfe8b91b8b877066c8ac788f59a40324eaac6d8 (diff)
qlcnic: fix multicast handling
For promiscuous mode, driver send request to device for deleting multicast addresses and again it send request for adding them back while exiting from this mode, this is bad for performance. Just setting device in promiscuous mode is enough, no need to del/add multicast addresses. Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com> Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/qlcnic/qlcnic_hw.c31
1 files changed, 6 insertions, 25 deletions
diff --git a/drivers/net/qlcnic/qlcnic_hw.c b/drivers/net/qlcnic/qlcnic_hw.c
index e95646bf7d56..da00e162b6d3 100644
--- a/drivers/net/qlcnic/qlcnic_hw.c
+++ b/drivers/net/qlcnic/qlcnic_hw.c
@@ -398,20 +398,16 @@ qlcnic_sre_macaddr_change(struct qlcnic_adapter *adapter, u8 *addr,
398 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);
399} 399}
400 400
401static int qlcnic_nic_add_mac(struct qlcnic_adapter *adapter, 401static int qlcnic_nic_add_mac(struct qlcnic_adapter *adapter, u8 *addr)
402 u8 *addr, struct list_head *del_list)
403{ 402{
404 struct list_head *head; 403 struct list_head *head;
405 struct qlcnic_mac_list_s *cur; 404 struct qlcnic_mac_list_s *cur;
406 405
407 /* look up if already exists */ 406 /* look up if already exists */
408 list_for_each(head, del_list) { 407 list_for_each(head, &adapter->mac_list) {
409 cur = list_entry(head, struct qlcnic_mac_list_s, list); 408 cur = list_entry(head, struct qlcnic_mac_list_s, list);
410 409 if (memcmp(addr, cur->mac_addr, ETH_ALEN) == 0)
411 if (memcmp(addr, cur->mac_addr, ETH_ALEN) == 0) {
412 list_move_tail(head, &adapter->mac_list);
413 return 0; 410 return 0;
414 }
415 } 411 }
416 412
417 cur = kzalloc(sizeof(struct qlcnic_mac_list_s), GFP_ATOMIC); 413 cur = kzalloc(sizeof(struct qlcnic_mac_list_s), GFP_ATOMIC);
@@ -433,14 +429,9 @@ void qlcnic_set_multi(struct net_device *netdev)
433 struct dev_mc_list *mc_ptr; 429 struct dev_mc_list *mc_ptr;
434 u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; 430 u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
435 u32 mode = VPORT_MISS_MODE_DROP; 431 u32 mode = VPORT_MISS_MODE_DROP;
436 LIST_HEAD(del_list);
437 struct list_head *head;
438 struct qlcnic_mac_list_s *cur;
439 432
440 list_splice_tail_init(&adapter->mac_list, &del_list); 433 qlcnic_nic_add_mac(adapter, adapter->mac_addr);
441 434 qlcnic_nic_add_mac(adapter, bcast_addr);
442 qlcnic_nic_add_mac(adapter, adapter->mac_addr, &del_list);
443 qlcnic_nic_add_mac(adapter, bcast_addr, &del_list);
444 435
445 if (netdev->flags & IFF_PROMISC) { 436 if (netdev->flags & IFF_PROMISC) {
446 mode = VPORT_MISS_MODE_ACCEPT_ALL; 437 mode = VPORT_MISS_MODE_ACCEPT_ALL;
@@ -455,22 +446,12 @@ void qlcnic_set_multi(struct net_device *netdev)
455 446
456 if (!netdev_mc_empty(netdev)) { 447 if (!netdev_mc_empty(netdev)) {
457 netdev_for_each_mc_addr(mc_ptr, netdev) { 448 netdev_for_each_mc_addr(mc_ptr, netdev) {
458 qlcnic_nic_add_mac(adapter, mc_ptr->dmi_addr, 449 qlcnic_nic_add_mac(adapter, mc_ptr->dmi_addr);
459 &del_list);
460 } 450 }
461 } 451 }
462 452
463send_fw_cmd: 453send_fw_cmd:
464 qlcnic_nic_set_promisc(adapter, mode); 454 qlcnic_nic_set_promisc(adapter, mode);
465 head = &del_list;
466 while (!list_empty(head)) {
467 cur = list_entry(head->next, struct qlcnic_mac_list_s, list);
468
469 qlcnic_sre_macaddr_change(adapter,
470 cur->mac_addr, QLCNIC_MAC_DEL);
471 list_del(&cur->list);
472 kfree(cur);
473 }
474} 455}
475 456
476int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter, u32 mode) 457int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter, u32 mode)