diff options
| author | Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com> | 2011-05-10 01:13:26 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-05-11 19:10:03 -0400 |
| commit | ecd0bf0f7b280bac3ac7419ed3aac84cd92878e9 (patch) | |
| tree | c4f6f4a61e4e5d744dccd7503bfdc0f856080c9c /drivers/net | |
| parent | 18a91e6002207c8212e0960854f88ab924ea22f9 (diff) | |
be2net: Use NTWK_RX_FILTER command for promiscous mode
Use OPCODE_COMMON_NTWK_RX_FILTER command for promiscous mode as
OPCODE_ETH_PROMISCUOUS command is getting deprecated.
Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/benet/be_cmds.c | 46 | ||||
| -rw-r--r-- | drivers/net/benet/be_cmds.h | 24 | ||||
| -rw-r--r-- | drivers/net/benet/be_main.c | 4 |
3 files changed, 48 insertions, 26 deletions
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index bdd6c5402adf..0dbb4cbc07b6 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
| @@ -1404,12 +1404,24 @@ err: | |||
| 1404 | /* Uses MCC for this command as it may be called in BH context | 1404 | /* Uses MCC for this command as it may be called in BH context |
| 1405 | * Uses synchronous mcc | 1405 | * Uses synchronous mcc |
| 1406 | */ | 1406 | */ |
| 1407 | int be_cmd_promiscuous_config(struct be_adapter *adapter, u8 port_num, bool en) | 1407 | int be_cmd_promiscuous_config(struct be_adapter *adapter, bool en) |
| 1408 | { | 1408 | { |
| 1409 | struct be_mcc_wrb *wrb; | 1409 | struct be_mcc_wrb *wrb; |
| 1410 | struct be_cmd_req_promiscuous_config *req; | 1410 | struct be_cmd_req_rx_filter *req; |
| 1411 | struct be_dma_mem promiscous_cmd; | ||
| 1412 | struct be_sge *sge; | ||
| 1411 | int status; | 1413 | int status; |
| 1412 | 1414 | ||
| 1415 | memset(&promiscous_cmd, 0, sizeof(struct be_dma_mem)); | ||
| 1416 | promiscous_cmd.size = sizeof(struct be_cmd_req_rx_filter); | ||
| 1417 | promiscous_cmd.va = pci_alloc_consistent(adapter->pdev, | ||
| 1418 | promiscous_cmd.size, &promiscous_cmd.dma); | ||
| 1419 | if (!promiscous_cmd.va) { | ||
| 1420 | dev_err(&adapter->pdev->dev, | ||
| 1421 | "Memory allocation failure\n"); | ||
| 1422 | return -ENOMEM; | ||
| 1423 | } | ||
| 1424 | |||
| 1413 | spin_lock_bh(&adapter->mcc_lock); | 1425 | spin_lock_bh(&adapter->mcc_lock); |
| 1414 | 1426 | ||
| 1415 | wrb = wrb_from_mccq(adapter); | 1427 | wrb = wrb_from_mccq(adapter); |
| @@ -1417,26 +1429,30 @@ int be_cmd_promiscuous_config(struct be_adapter *adapter, u8 port_num, bool en) | |||
| 1417 | status = -EBUSY; | 1429 | status = -EBUSY; |
| 1418 | goto err; | 1430 | goto err; |
| 1419 | } | 1431 | } |
| 1420 | req = embedded_payload(wrb); | ||
| 1421 | 1432 | ||
| 1422 | be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, OPCODE_ETH_PROMISCUOUS); | 1433 | req = promiscous_cmd.va; |
| 1434 | sge = nonembedded_sgl(wrb); | ||
| 1423 | 1435 | ||
| 1424 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, | 1436 | be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1, |
| 1425 | OPCODE_ETH_PROMISCUOUS, sizeof(*req)); | 1437 | OPCODE_COMMON_NTWK_RX_FILTER); |
| 1426 | 1438 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | |
| 1427 | /* In FW versions X.102.149/X.101.487 and later, | 1439 | OPCODE_COMMON_NTWK_RX_FILTER, sizeof(*req)); |
| 1428 | * the port setting associated only with the | 1440 | |
| 1429 | * issuing pci function will take effect | 1441 | req->if_id = cpu_to_le32(adapter->if_handle); |
| 1430 | */ | 1442 | req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS); |
| 1431 | if (port_num) | 1443 | if (en) |
| 1432 | req->port1_promiscuous = en; | 1444 | req->if_flags = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS); |
| 1433 | else | 1445 | |
| 1434 | req->port0_promiscuous = en; | 1446 | sge->pa_hi = cpu_to_le32(upper_32_bits(promiscous_cmd.dma)); |
| 1447 | sge->pa_lo = cpu_to_le32(promiscous_cmd.dma & 0xFFFFFFFF); | ||
| 1448 | sge->len = cpu_to_le32(promiscous_cmd.size); | ||
| 1435 | 1449 | ||
| 1436 | status = be_mcc_notify_wait(adapter); | 1450 | status = be_mcc_notify_wait(adapter); |
| 1437 | 1451 | ||
| 1438 | err: | 1452 | err: |
| 1439 | spin_unlock_bh(&adapter->mcc_lock); | 1453 | spin_unlock_bh(&adapter->mcc_lock); |
| 1454 | pci_free_consistent(adapter->pdev, promiscous_cmd.size, | ||
| 1455 | promiscous_cmd.va, promiscous_cmd.dma); | ||
| 1440 | return status; | 1456 | return status; |
| 1441 | } | 1457 | } |
| 1442 | 1458 | ||
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index af4bbff5feba..78256b65cb03 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
| @@ -714,13 +714,6 @@ struct be_cmd_req_vlan_config { | |||
| 714 | u16 normal_vlan[64]; | 714 | u16 normal_vlan[64]; |
| 715 | } __packed; | 715 | } __packed; |
| 716 | 716 | ||
| 717 | struct be_cmd_req_promiscuous_config { | ||
| 718 | struct be_cmd_req_hdr hdr; | ||
| 719 | u8 port0_promiscuous; | ||
| 720 | u8 port1_promiscuous; | ||
| 721 | u16 rsvd0; | ||
| 722 | } __packed; | ||
| 723 | |||
| 724 | /******************** Multicast MAC Config *******************/ | 717 | /******************** Multicast MAC Config *******************/ |
| 725 | #define BE_MAX_MC 64 /* set mcast promisc if > 64 */ | 718 | #define BE_MAX_MC 64 /* set mcast promisc if > 64 */ |
| 726 | struct macaddr { | 719 | struct macaddr { |
| @@ -741,6 +734,20 @@ hw_stats_from_cmd(struct be_cmd_resp_get_stats *cmd) | |||
| 741 | return &cmd->hw_stats; | 734 | return &cmd->hw_stats; |
| 742 | } | 735 | } |
| 743 | 736 | ||
| 737 | |||
| 738 | /******************* RX FILTER ******************************/ | ||
| 739 | struct be_cmd_req_rx_filter { | ||
| 740 | struct be_cmd_req_hdr hdr; | ||
| 741 | u32 global_flags_mask; | ||
| 742 | u32 global_flags; | ||
| 743 | u32 if_flags_mask; | ||
| 744 | u32 if_flags; | ||
| 745 | u32 if_id; | ||
| 746 | u32 multicast_num; | ||
| 747 | struct macaddr mac[BE_MAX_MC]; | ||
| 748 | }; | ||
| 749 | |||
| 750 | |||
| 744 | /******************** Link Status Query *******************/ | 751 | /******************** Link Status Query *******************/ |
| 745 | struct be_cmd_req_link_status { | 752 | struct be_cmd_req_link_status { |
| 746 | struct be_cmd_req_hdr hdr; | 753 | struct be_cmd_req_hdr hdr; |
| @@ -1122,8 +1129,7 @@ extern int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd); | |||
| 1122 | extern int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, | 1129 | extern int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, |
| 1123 | u16 *vtag_array, u32 num, bool untagged, | 1130 | u16 *vtag_array, u32 num, bool untagged, |
| 1124 | bool promiscuous); | 1131 | bool promiscuous); |
| 1125 | extern int be_cmd_promiscuous_config(struct be_adapter *adapter, | 1132 | extern int be_cmd_promiscuous_config(struct be_adapter *adapter, bool en); |
| 1126 | u8 port_num, bool en); | ||
| 1127 | extern int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id, | 1133 | extern int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id, |
| 1128 | struct net_device *netdev, struct be_dma_mem *mem); | 1134 | struct net_device *netdev, struct be_dma_mem *mem); |
| 1129 | extern int be_cmd_set_flow_control(struct be_adapter *adapter, | 1135 | extern int be_cmd_set_flow_control(struct be_adapter *adapter, |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 3202f67d8785..babe53af7e86 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
| @@ -698,7 +698,7 @@ static void be_set_multicast_list(struct net_device *netdev) | |||
| 698 | struct be_adapter *adapter = netdev_priv(netdev); | 698 | struct be_adapter *adapter = netdev_priv(netdev); |
| 699 | 699 | ||
| 700 | if (netdev->flags & IFF_PROMISC) { | 700 | if (netdev->flags & IFF_PROMISC) { |
| 701 | be_cmd_promiscuous_config(adapter, adapter->port_num, 1); | 701 | be_cmd_promiscuous_config(adapter, true); |
| 702 | adapter->promiscuous = true; | 702 | adapter->promiscuous = true; |
| 703 | goto done; | 703 | goto done; |
| 704 | } | 704 | } |
| @@ -706,7 +706,7 @@ static void be_set_multicast_list(struct net_device *netdev) | |||
| 706 | /* BE was previously in promiscuous mode; disable it */ | 706 | /* BE was previously in promiscuous mode; disable it */ |
| 707 | if (adapter->promiscuous) { | 707 | if (adapter->promiscuous) { |
| 708 | adapter->promiscuous = false; | 708 | adapter->promiscuous = false; |
| 709 | be_cmd_promiscuous_config(adapter, adapter->port_num, 0); | 709 | be_cmd_promiscuous_config(adapter, false); |
| 710 | } | 710 | } |
| 711 | 711 | ||
| 712 | /* Enable multicast promisc if num configured exceeds what we support */ | 712 | /* Enable multicast promisc if num configured exceeds what we support */ |
