be2net: Use NTWK_RX_FILTER command for promiscous mode
[pandora-kernel.git] / drivers / net / benet / be_cmds.c
index 0fc06d3..0dbb4cb 100644 (file)
@@ -133,7 +133,7 @@ static void be_async_grp5_pvid_state_process(struct be_adapter *adapter,
                struct be_async_event_grp5_pvid_state *evt)
 {
        if (evt->enabled)
-               adapter->pvid = evt->tag;
+               adapter->pvid = le16_to_cpu(evt->tag);
        else
                adapter->pvid = 0;
 }
@@ -293,7 +293,8 @@ static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db)
 
                if (msecs > 4000) {
                        dev_err(&adapter->pdev->dev, "mbox poll timed out\n");
-                       be_detect_dump_ue(adapter);
+                       if (!lancer_chip(adapter))
+                               be_detect_dump_ue(adapter);
                        return -1;
                }
 
@@ -729,8 +730,6 @@ int be_cmd_cq_create(struct be_adapter *adapter,
        if (lancer_chip(adapter)) {
                req->hdr.version = 2;
                req->page_size = 1; /* 1 for 4K */
-               AMAP_SET_BITS(struct amap_cq_context_lancer, coalescwm, ctxt,
-                                                               coalesce_wm);
                AMAP_SET_BITS(struct amap_cq_context_lancer, nodelay, ctxt,
                                                                no_delay);
                AMAP_SET_BITS(struct amap_cq_context_lancer, count, ctxt,
@@ -1405,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);
@@ -1418,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;
 }