be2net: Use NTWK_RX_FILTER command for promiscous mode
authorPadmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Tue, 10 May 2011 05:13:26 +0000 (05:13 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 May 2011 23:10:03 +0000 (19:10 -0400)
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>
drivers/net/benet/be_cmds.c
drivers/net/benet/be_cmds.h
drivers/net/benet/be_main.c

index bdd6c5402adf9b996b4b23a5356f5a3dcfdb8a44..0dbb4cbc07b6aa8497ee1ebec48cb45e22b871c5 100644 (file)
@@ -1404,12 +1404,24 @@ err:
 /* Uses MCC for this command as it may be called in BH context
  * 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_cmd_req_promiscuous_config *req;
+       struct be_cmd_req_rx_filter *req;
+       struct be_dma_mem promiscous_cmd;
+       struct be_sge *sge;
        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);
 
        wrb = wrb_from_mccq(adapter);
@@ -1417,26 +1429,30 @@ int be_cmd_promiscuous_config(struct be_adapter *adapter, u8 port_num, bool en)
                status = -EBUSY;
                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,
-               OPCODE_ETH_PROMISCUOUS, sizeof(*req));
-
-       /* In FW versions X.102.149/X.101.487 and later,
-        * the port setting associated only with the
-        * issuing pci function will take effect
-        */
-       if (port_num)
-               req->port1_promiscuous = en;
-       else
-               req->port0_promiscuous = en;
+       be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1,
+                                       OPCODE_COMMON_NTWK_RX_FILTER);
+       be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+                       OPCODE_COMMON_NTWK_RX_FILTER, sizeof(*req));
+
+       req->if_id = cpu_to_le32(adapter->if_handle);
+       req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS);
+       if (en)
+               req->if_flags = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS);
+
+       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);
 
 err:
        spin_unlock_bh(&adapter->mcc_lock);
+       pci_free_consistent(adapter->pdev, promiscous_cmd.size,
+                       promiscous_cmd.va, promiscous_cmd.dma);
        return status;
 }
 
index af4bbff5feba2427b089076a3e503843daeff3e1..78256b65cb0393b3a138a0007a2071498f863f22 100644 (file)
@@ -714,13 +714,6 @@ struct be_cmd_req_vlan_config {
        u16 normal_vlan[64];
 } __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 *******************/
 #define BE_MAX_MC              64 /* set mcast promisc if > 64 */
 struct macaddr {
@@ -741,6 +734,20 @@ hw_stats_from_cmd(struct be_cmd_resp_get_stats *cmd)
        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 *******************/
 struct be_cmd_req_link_status {
        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);
 extern int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id,
                        u16 *vtag_array, u32 num, bool untagged,
                        bool promiscuous);
-extern int be_cmd_promiscuous_config(struct be_adapter *adapter,
-                       u8 port_num, bool en);
+extern int be_cmd_promiscuous_config(struct be_adapter *adapter, bool en);
 extern int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id,
                        struct net_device *netdev, struct be_dma_mem *mem);
 extern int be_cmd_set_flow_control(struct be_adapter *adapter,
index 3202f67d8785ddc8ea299766ab8a528e3fe202bd..babe53af7e8651858d425542aa9886c5fed76161 100644 (file)
@@ -698,7 +698,7 @@ static void be_set_multicast_list(struct net_device *netdev)
        struct be_adapter *adapter = netdev_priv(netdev);
 
        if (netdev->flags & IFF_PROMISC) {
-               be_cmd_promiscuous_config(adapter, adapter->port_num, 1);
+               be_cmd_promiscuous_config(adapter, true);
                adapter->promiscuous = true;
                goto done;
        }
@@ -706,7 +706,7 @@ static void be_set_multicast_list(struct net_device *netdev)
        /* BE was previously in promiscuous mode; disable it */
        if (adapter->promiscuous) {
                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 */