be2net: Add function to issue mailbox cmd on MQ
authorParav Pandit <parav.pandit@emulex.com>
Mon, 26 Mar 2012 14:27:12 +0000 (14:27 +0000)
committerRoland Dreier <roland@purestorage.com>
Tue, 8 May 2012 18:17:47 +0000 (11:17 -0700)
- Add generic function to issue mailbox cmd on MQ as export function.
- RoCE driver will use this before it setups its own MQ.

Signed-off-by: Parav Pandit <parav.pandit@emulex.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/net/ethernet/emulex/benet/be_cmds.c

index 67b030d72df1599e68f9fa4becfa49f82a8b5140..1c7c7d06a0b772160982f15f713004dcb86ef657 100644 (file)
@@ -15,6 +15,7 @@
  * Costa Mesa, CA 92626
  */
 
+#include <linux/module.h>
 #include "be.h"
 #include "be_cmds.h"
 
@@ -2556,3 +2557,41 @@ err:
        pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma);
        return status;
 }
+
+int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
+                       int wrb_payload_size, u16 *cmd_status, u16 *ext_status)
+{
+       struct be_adapter *adapter = netdev_priv(netdev_handle);
+       struct be_mcc_wrb *wrb;
+       struct be_cmd_req_hdr *hdr = (struct be_cmd_req_hdr *) wrb_payload;
+       struct be_cmd_req_hdr *req;
+       struct be_cmd_resp_hdr *resp;
+       int status;
+
+       spin_lock_bh(&adapter->mcc_lock);
+
+       wrb = wrb_from_mccq(adapter);
+       if (!wrb) {
+               status = -EBUSY;
+               goto err;
+       }
+       req = embedded_payload(wrb);
+       resp = embedded_payload(wrb);
+
+       be_wrb_cmd_hdr_prepare(req, hdr->subsystem,
+                              hdr->opcode, wrb_payload_size, wrb, NULL);
+       memcpy(req, wrb_payload, wrb_payload_size);
+       be_dws_cpu_to_le(req, wrb_payload_size);
+
+       status = be_mcc_notify_wait(adapter);
+       if (cmd_status)
+               *cmd_status = (status & 0xffff);
+       if (ext_status)
+               *ext_status = 0;
+       memcpy(wrb_payload, resp, sizeof(*resp) + resp->response_length);
+       be_dws_le_to_cpu(wrb_payload, sizeof(*resp) + resp->response_length);
+err:
+       spin_unlock_bh(&adapter->mcc_lock);
+       return status;
+}
+EXPORT_SYMBOL(be_roce_mcc_cmd);