提交 ecd0bf0f 编写于 作者: P Padmanabh Ratnakar 提交者: David S. Miller

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: NPadmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 18a91e60
...@@ -1404,12 +1404,24 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array, ...@@ -1404,12 +1404,24 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
/* Uses MCC for this command as it may be called in BH context /* Uses MCC for this command as it may be called in BH context
* Uses synchronous mcc * Uses synchronous mcc
*/ */
int be_cmd_promiscuous_config(struct be_adapter *adapter, u8 port_num, bool en) int be_cmd_promiscuous_config(struct be_adapter *adapter, bool en)
{ {
struct be_mcc_wrb *wrb; struct be_mcc_wrb *wrb;
struct be_cmd_req_promiscuous_config *req; struct be_cmd_req_rx_filter *req;
struct be_dma_mem promiscous_cmd;
struct be_sge *sge;
int status; int status;
memset(&promiscous_cmd, 0, sizeof(struct be_dma_mem));
promiscous_cmd.size = sizeof(struct be_cmd_req_rx_filter);
promiscous_cmd.va = pci_alloc_consistent(adapter->pdev,
promiscous_cmd.size, &promiscous_cmd.dma);
if (!promiscous_cmd.va) {
dev_err(&adapter->pdev->dev,
"Memory allocation failure\n");
return -ENOMEM;
}
spin_lock_bh(&adapter->mcc_lock); spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter); wrb = wrb_from_mccq(adapter);
...@@ -1417,26 +1429,30 @@ int be_cmd_promiscuous_config(struct be_adapter *adapter, u8 port_num, bool en) ...@@ -1417,26 +1429,30 @@ int be_cmd_promiscuous_config(struct be_adapter *adapter, u8 port_num, bool en)
status = -EBUSY; status = -EBUSY;
goto err; goto err;
} }
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, OPCODE_ETH_PROMISCUOUS); req = promiscous_cmd.va;
sge = nonembedded_sgl(wrb);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1,
OPCODE_ETH_PROMISCUOUS, sizeof(*req)); OPCODE_COMMON_NTWK_RX_FILTER);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
/* In FW versions X.102.149/X.101.487 and later, OPCODE_COMMON_NTWK_RX_FILTER, sizeof(*req));
* the port setting associated only with the
* issuing pci function will take effect req->if_id = cpu_to_le32(adapter->if_handle);
*/ req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS);
if (port_num) if (en)
req->port1_promiscuous = en; req->if_flags = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS);
else
req->port0_promiscuous = en; sge->pa_hi = cpu_to_le32(upper_32_bits(promiscous_cmd.dma));
sge->pa_lo = cpu_to_le32(promiscous_cmd.dma & 0xFFFFFFFF);
sge->len = cpu_to_le32(promiscous_cmd.size);
status = be_mcc_notify_wait(adapter); status = be_mcc_notify_wait(adapter);
err: err:
spin_unlock_bh(&adapter->mcc_lock); spin_unlock_bh(&adapter->mcc_lock);
pci_free_consistent(adapter->pdev, promiscous_cmd.size,
promiscous_cmd.va, promiscous_cmd.dma);
return status; return status;
} }
......
...@@ -714,13 +714,6 @@ struct be_cmd_req_vlan_config { ...@@ -714,13 +714,6 @@ struct be_cmd_req_vlan_config {
u16 normal_vlan[64]; u16 normal_vlan[64];
} __packed; } __packed;
struct be_cmd_req_promiscuous_config {
struct be_cmd_req_hdr hdr;
u8 port0_promiscuous;
u8 port1_promiscuous;
u16 rsvd0;
} __packed;
/******************** Multicast MAC Config *******************/ /******************** Multicast MAC Config *******************/
#define BE_MAX_MC 64 /* set mcast promisc if > 64 */ #define BE_MAX_MC 64 /* set mcast promisc if > 64 */
struct macaddr { struct macaddr {
...@@ -741,6 +734,20 @@ hw_stats_from_cmd(struct be_cmd_resp_get_stats *cmd) ...@@ -741,6 +734,20 @@ hw_stats_from_cmd(struct be_cmd_resp_get_stats *cmd)
return &cmd->hw_stats; return &cmd->hw_stats;
} }
/******************* RX FILTER ******************************/
struct be_cmd_req_rx_filter {
struct be_cmd_req_hdr hdr;
u32 global_flags_mask;
u32 global_flags;
u32 if_flags_mask;
u32 if_flags;
u32 if_id;
u32 multicast_num;
struct macaddr mac[BE_MAX_MC];
};
/******************** Link Status Query *******************/ /******************** Link Status Query *******************/
struct be_cmd_req_link_status { struct be_cmd_req_link_status {
struct be_cmd_req_hdr hdr; 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,8 +1129,7 @@ extern int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd);
extern int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, extern int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id,
u16 *vtag_array, u32 num, bool untagged, u16 *vtag_array, u32 num, bool untagged,
bool promiscuous); bool promiscuous);
extern int be_cmd_promiscuous_config(struct be_adapter *adapter, extern int be_cmd_promiscuous_config(struct be_adapter *adapter, bool en);
u8 port_num, bool en);
extern int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id, extern int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id,
struct net_device *netdev, struct be_dma_mem *mem); struct net_device *netdev, struct be_dma_mem *mem);
extern int be_cmd_set_flow_control(struct be_adapter *adapter, extern int be_cmd_set_flow_control(struct be_adapter *adapter,
......
...@@ -698,7 +698,7 @@ static void be_set_multicast_list(struct net_device *netdev) ...@@ -698,7 +698,7 @@ static void be_set_multicast_list(struct net_device *netdev)
struct be_adapter *adapter = netdev_priv(netdev); struct be_adapter *adapter = netdev_priv(netdev);
if (netdev->flags & IFF_PROMISC) { if (netdev->flags & IFF_PROMISC) {
be_cmd_promiscuous_config(adapter, adapter->port_num, 1); be_cmd_promiscuous_config(adapter, true);
adapter->promiscuous = true; adapter->promiscuous = true;
goto done; goto done;
} }
...@@ -706,7 +706,7 @@ static void be_set_multicast_list(struct net_device *netdev) ...@@ -706,7 +706,7 @@ static void be_set_multicast_list(struct net_device *netdev)
/* BE was previously in promiscuous mode; disable it */ /* BE was previously in promiscuous mode; disable it */
if (adapter->promiscuous) { if (adapter->promiscuous) {
adapter->promiscuous = false; adapter->promiscuous = false;
be_cmd_promiscuous_config(adapter, adapter->port_num, 0); be_cmd_promiscuous_config(adapter, false);
} }
/* Enable multicast promisc if num configured exceeds what we support */ /* Enable multicast promisc if num configured exceeds what we support */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册