diff options
author | Amit Kumar Salecha <amit.salecha@qlogic.com> | 2010-08-31 13:17:52 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-09-01 13:41:57 -0400 |
commit | 03c5d770c24cd673d105fbf1a9706ae838272091 (patch) | |
tree | 420344c7cd203c648c4747293f1a41ae3b3d8ee1 /drivers/net/qlcnic/qlcnic_hw.c | |
parent | b5e5492c0d49e2fd6f51961d03b8533435e5e7f5 (diff) |
qlcnic: mac vlan learning support
Hypervisor allows, two VM's interfaces to have same mac address.
These VM's interfaces get differentiate with Vlan tag.
This patch add support to learn and configure mac+vlan filter on device.
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/qlcnic/qlcnic_hw.c')
-rw-r--r-- | drivers/net/qlcnic/qlcnic_hw.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/net/qlcnic/qlcnic_hw.c b/drivers/net/qlcnic/qlcnic_hw.c index 5b2bce59498d..c198df90ff3c 100644 --- a/drivers/net/qlcnic/qlcnic_hw.c +++ b/drivers/net/qlcnic/qlcnic_hw.c | |||
@@ -375,7 +375,7 @@ qlcnic_send_cmd_descs(struct qlcnic_adapter *adapter, | |||
375 | 375 | ||
376 | static int | 376 | static int |
377 | qlcnic_sre_macaddr_change(struct qlcnic_adapter *adapter, u8 *addr, | 377 | qlcnic_sre_macaddr_change(struct qlcnic_adapter *adapter, u8 *addr, |
378 | unsigned op) | 378 | u16 vlan_id, unsigned op) |
379 | { | 379 | { |
380 | struct qlcnic_nic_req req; | 380 | struct qlcnic_nic_req req; |
381 | struct qlcnic_mac_req *mac_req; | 381 | struct qlcnic_mac_req *mac_req; |
@@ -391,6 +391,8 @@ qlcnic_sre_macaddr_change(struct qlcnic_adapter *adapter, u8 *addr, | |||
391 | mac_req->op = op; | 391 | mac_req->op = op; |
392 | memcpy(mac_req->mac_addr, addr, 6); | 392 | memcpy(mac_req->mac_addr, addr, 6); |
393 | 393 | ||
394 | req.words[1] = cpu_to_le64(vlan_id); | ||
395 | |||
394 | return qlcnic_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1); | 396 | return qlcnic_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1); |
395 | } | 397 | } |
396 | 398 | ||
@@ -415,7 +417,7 @@ static int qlcnic_nic_add_mac(struct qlcnic_adapter *adapter, u8 *addr) | |||
415 | memcpy(cur->mac_addr, addr, ETH_ALEN); | 417 | memcpy(cur->mac_addr, addr, ETH_ALEN); |
416 | 418 | ||
417 | if (qlcnic_sre_macaddr_change(adapter, | 419 | if (qlcnic_sre_macaddr_change(adapter, |
418 | cur->mac_addr, QLCNIC_MAC_ADD)) { | 420 | cur->mac_addr, 0, QLCNIC_MAC_ADD)) { |
419 | kfree(cur); | 421 | kfree(cur); |
420 | return -EIO; | 422 | return -EIO; |
421 | } | 423 | } |
@@ -485,7 +487,7 @@ void qlcnic_free_mac_list(struct qlcnic_adapter *adapter) | |||
485 | while (!list_empty(head)) { | 487 | while (!list_empty(head)) { |
486 | cur = list_entry(head->next, struct qlcnic_mac_list_s, list); | 488 | cur = list_entry(head->next, struct qlcnic_mac_list_s, list); |
487 | qlcnic_sre_macaddr_change(adapter, | 489 | qlcnic_sre_macaddr_change(adapter, |
488 | cur->mac_addr, QLCNIC_MAC_DEL); | 490 | cur->mac_addr, 0, QLCNIC_MAC_DEL); |
489 | list_del(&cur->list); | 491 | list_del(&cur->list); |
490 | kfree(cur); | 492 | kfree(cur); |
491 | } | 493 | } |
@@ -506,7 +508,9 @@ void qlcnic_prune_lb_filters(struct qlcnic_adapter *adapter) | |||
506 | if (jiffies > | 508 | if (jiffies > |
507 | (QLCNIC_FILTER_AGE * HZ + tmp_fil->ftime)) { | 509 | (QLCNIC_FILTER_AGE * HZ + tmp_fil->ftime)) { |
508 | qlcnic_sre_macaddr_change(adapter, | 510 | qlcnic_sre_macaddr_change(adapter, |
509 | tmp_fil->faddr, QLCNIC_MAC_DEL); | 511 | tmp_fil->faddr, tmp_fil->vlan_id, |
512 | tmp_fil->vlan_id ? QLCNIC_MAC_VLAN_DEL : | ||
513 | QLCNIC_MAC_DEL); | ||
510 | spin_lock_bh(&adapter->mac_learn_lock); | 514 | spin_lock_bh(&adapter->mac_learn_lock); |
511 | adapter->fhash.fnum--; | 515 | adapter->fhash.fnum--; |
512 | hlist_del(&tmp_fil->fnode); | 516 | hlist_del(&tmp_fil->fnode); |
@@ -528,8 +532,9 @@ void qlcnic_delete_lb_filters(struct qlcnic_adapter *adapter) | |||
528 | head = &(adapter->fhash.fhead[i]); | 532 | head = &(adapter->fhash.fhead[i]); |
529 | 533 | ||
530 | hlist_for_each_entry_safe(tmp_fil, tmp_hnode, n, head, fnode) { | 534 | hlist_for_each_entry_safe(tmp_fil, tmp_hnode, n, head, fnode) { |
531 | qlcnic_sre_macaddr_change(adapter, | 535 | qlcnic_sre_macaddr_change(adapter, tmp_fil->faddr, |
532 | tmp_fil->faddr, QLCNIC_MAC_DEL); | 536 | tmp_fil->vlan_id, tmp_fil->vlan_id ? |
537 | QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL); | ||
533 | spin_lock_bh(&adapter->mac_learn_lock); | 538 | spin_lock_bh(&adapter->mac_learn_lock); |
534 | adapter->fhash.fnum--; | 539 | adapter->fhash.fnum--; |
535 | hlist_del(&tmp_fil->fnode); | 540 | hlist_del(&tmp_fil->fnode); |