be2net: Use TXQ_CREATE_V2 cmd
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / emulex / benet / be_cmds.c
index 3c9b4f12e3e516ff8775c208a3b138c9acd5c109..5d96f773ea92ae559f036046708c7b5d58bf9b4b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005 - 2011 Emulex
+ * Copyright (C) 2005 - 2013 Emulex
  * All rights reserved.
  *
  * This program is free software; you can redistribute it and/or
@@ -1095,15 +1095,14 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
        return status;
 }
 
-int be_cmd_txq_create(struct be_adapter *adapter,
-                       struct be_queue_info *txq,
-                       struct be_queue_info *cq)
+int be_cmd_txq_create(struct be_adapter *adapter, struct be_tx_obj *txo)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_eth_tx_create *req;
+       struct be_queue_info *txq = &txo->q;
+       struct be_queue_info *cq = &txo->cq;
        struct be_dma_mem *q_mem = &txq->dma_mem;
-       void *ctxt;
-       int status;
+       int status, ver = 0;
 
        spin_lock_bh(&adapter->mcc_lock);
 
@@ -1114,34 +1113,37 @@ int be_cmd_txq_create(struct be_adapter *adapter,
        }
 
        req = embedded_payload(wrb);
-       ctxt = &req->context;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
                OPCODE_ETH_TX_CREATE, sizeof(*req), wrb, NULL);
 
        if (lancer_chip(adapter)) {
                req->hdr.version = 1;
-               AMAP_SET_BITS(struct amap_tx_context, if_id, ctxt,
-                                       adapter->if_handle);
+               req->if_id = cpu_to_le16(adapter->if_handle);
+       } else if (BEx_chip(adapter)) {
+               if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC)
+                       req->hdr.version = 2;
+       } else { /* For SH */
+               req->hdr.version = 2;
        }
 
        req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
        req->ulp_num = BE_ULP1_NUM;
        req->type = BE_ETH_TX_RING_TYPE_STANDARD;
-
-       AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt,
-               be_encoded_q_len(txq->len));
-       AMAP_SET_BITS(struct amap_tx_context, ctx_valid, ctxt, 1);
-       AMAP_SET_BITS(struct amap_tx_context, cq_id_send, ctxt, cq->id);
-
-       be_dws_cpu_to_le(ctxt, sizeof(req->context));
-
+       req->cq_id = cpu_to_le16(cq->id);
+       req->queue_size = be_encoded_q_len(txq->len);
        be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
 
+       ver = req->hdr.version;
+
        status = be_mcc_notify_wait(adapter);
        if (!status) {
                struct be_cmd_resp_eth_tx_create *resp = embedded_payload(wrb);
                txq->id = le16_to_cpu(resp->cid);
+               if (ver == 2)
+                       txo->db_offset = le32_to_cpu(resp->db_offset);
+               else
+                       txo->db_offset = DB_TXULP1_OFFSET;
                txq->created = true;
        }
 
@@ -2343,7 +2345,6 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_seeprom_read *req;
-       struct be_sge *sge;
        int status;
 
        spin_lock_bh(&adapter->mcc_lock);
@@ -2354,7 +2355,6 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
                goto err;
        }
        req = nonemb_cmd->va;
-       sge = nonembedded_sgl(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
                        OPCODE_COMMON_SEEPROM_READ, sizeof(*req), wrb,
@@ -2667,10 +2667,8 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
        cmd.size = sizeof(struct be_cmd_req_set_mac_list);
        cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size,
                        &cmd.dma, GFP_KERNEL);
-       if (!cmd.va) {
-               dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
+       if (!cmd.va)
                return -ENOMEM;
-       }
 
        spin_lock_bh(&adapter->mcc_lock);
 
@@ -3202,6 +3200,31 @@ err:
        return status;
 }
 
+int be_cmd_intr_set(struct be_adapter *adapter, bool intr_enable)
+{
+       struct be_mcc_wrb *wrb;
+       struct be_cmd_req_intr_set *req;
+       int status;
+
+       if (mutex_lock_interruptible(&adapter->mbox_lock))
+               return -1;
+
+       wrb = wrb_from_mbox(adapter);
+
+       req = embedded_payload(wrb);
+
+       be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+                              OPCODE_COMMON_SET_INTERRUPT_ENABLE, sizeof(*req),
+                              wrb, NULL);
+
+       req->intr_enabled = intr_enable;
+
+       status = be_mbox_notify_wait(adapter);
+
+       mutex_unlock(&adapter->mbox_lock);
+       return status;
+}
+
 int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
                        int wrb_payload_size, u16 *cmd_status, u16 *ext_status)
 {