]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/emulex/benet/be_cmds.c
be2net: reduce arguments passed to FW-cmd routines
[karo-tx-linux.git] / drivers / net / ethernet / emulex / benet / be_cmds.c
index d1ec15af0d2482f46c425bb7d2f6c99976c16329..791094c33535d845bd68c09cf1ac4e651ec4b8a6 100644 (file)
@@ -52,8 +52,7 @@ static struct be_cmd_priv_map cmd_priv_map[] = {
        }
 };
 
-static bool be_cmd_allowed(struct be_adapter *adapter, u8 opcode,
-                          u8 subsystem)
+static bool be_cmd_allowed(struct be_adapter *adapter, u8 opcode, u8 subsystem)
 {
        int i;
        int num_entries = sizeof(cmd_priv_map)/sizeof(struct be_cmd_priv_map);
@@ -120,21 +119,28 @@ static struct be_cmd_resp_hdr *be_decode_resp_hdr(u32 tag0, u32 tag1)
        return (void *)addr;
 }
 
-static int be_mcc_compl_process(struct be_adapter *adapter,
-                               struct be_mcc_compl *compl)
+static bool be_skip_err_log(u8 opcode, u16 base_status, u16 addl_status)
 {
-       u16 compl_status, extd_status;
-       struct be_cmd_resp_hdr *resp_hdr;
-       u8 opcode = 0, subsystem = 0;
-
-       /* Just swap the status to host endian; mcc tag is opaquely copied
-        * from mcc_wrb */
-       be_dws_le_to_cpu(compl, 4);
-
-       compl_status = (compl->status >> CQE_STATUS_COMPL_SHIFT) &
-                               CQE_STATUS_COMPL_MASK;
+       if (base_status == MCC_STATUS_NOT_SUPPORTED ||
+           base_status == MCC_STATUS_ILLEGAL_REQUEST ||
+           addl_status == MCC_ADDL_STATUS_TOO_MANY_INTERFACES ||
+           (opcode == OPCODE_COMMON_WRITE_FLASHROM &&
+           (base_status == MCC_STATUS_ILLEGAL_FIELD ||
+            addl_status == MCC_ADDL_STATUS_FLASH_IMAGE_CRC_MISMATCH)))
+               return true;
+       else
+               return false;
+}
 
-       resp_hdr = be_decode_resp_hdr(compl->tag0, compl->tag1);
+/* Place holder for all the async MCC cmds wherein the caller is not in a busy
+ * loop (has not issued be_mcc_notify_wait())
+ */
+static void be_async_cmd_process(struct be_adapter *adapter,
+                                struct be_mcc_compl *compl,
+                                struct be_cmd_resp_hdr *resp_hdr)
+{
+       enum mcc_base_status base_status = base_status(compl->status);
+       u8 opcode = 0, subsystem = 0;
 
        if (resp_hdr) {
                opcode = resp_hdr->opcode;
@@ -144,61 +150,86 @@ static int be_mcc_compl_process(struct be_adapter *adapter,
        if (opcode == OPCODE_LOWLEVEL_LOOPBACK_TEST &&
            subsystem == CMD_SUBSYSTEM_LOWLEVEL) {
                complete(&adapter->et_cmd_compl);
-               return 0;
+               return;
        }
 
-       if (((opcode == OPCODE_COMMON_WRITE_FLASHROM) ||
-            (opcode == OPCODE_COMMON_WRITE_OBJECT)) &&
-           (subsystem == CMD_SUBSYSTEM_COMMON)) {
-               adapter->flash_status = compl_status;
+       if ((opcode == OPCODE_COMMON_WRITE_FLASHROM ||
+            opcode == OPCODE_COMMON_WRITE_OBJECT) &&
+           subsystem == CMD_SUBSYSTEM_COMMON) {
+               adapter->flash_status = compl->status;
                complete(&adapter->et_cmd_compl);
+               return;
        }
 
-       if (compl_status == MCC_STATUS_SUCCESS) {
-               if (((opcode == OPCODE_ETH_GET_STATISTICS) ||
-                    (opcode == OPCODE_ETH_GET_PPORT_STATS)) &&
-                   (subsystem == CMD_SUBSYSTEM_ETH)) {
-                       be_parse_stats(adapter);
-                       adapter->stats_cmd_sent = false;
-               }
-               if (opcode == OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES &&
-                   subsystem == CMD_SUBSYSTEM_COMMON) {
+       if ((opcode == OPCODE_ETH_GET_STATISTICS ||
+            opcode == OPCODE_ETH_GET_PPORT_STATS) &&
+           subsystem == CMD_SUBSYSTEM_ETH &&
+           base_status == MCC_STATUS_SUCCESS) {
+               be_parse_stats(adapter);
+               adapter->stats_cmd_sent = false;
+               return;
+       }
+
+       if (opcode == OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES &&
+           subsystem == CMD_SUBSYSTEM_COMMON) {
+               if (base_status == MCC_STATUS_SUCCESS) {
                        struct be_cmd_resp_get_cntl_addnl_attribs *resp =
-                               (void *)resp_hdr;
+                                                       (void *)resp_hdr;
                        adapter->drv_stats.be_on_die_temperature =
-                               resp->on_die_temperature;
-               }
-       } else {
-               if (opcode == OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES)
+                                               resp->on_die_temperature;
+               } else {
                        adapter->be_get_temp_freq = 0;
+               }
+               return;
+       }
+}
 
-               if (compl_status == MCC_STATUS_NOT_SUPPORTED ||
-                       compl_status == MCC_STATUS_ILLEGAL_REQUEST)
-                       goto done;
+static int be_mcc_compl_process(struct be_adapter *adapter,
+                               struct be_mcc_compl *compl)
+{
+       enum mcc_base_status base_status;
+       enum mcc_addl_status addl_status;
+       struct be_cmd_resp_hdr *resp_hdr;
+       u8 opcode = 0, subsystem = 0;
+
+       /* Just swap the status to host endian; mcc tag is opaquely copied
+        * from mcc_wrb */
+       be_dws_le_to_cpu(compl, 4);
+
+       base_status = base_status(compl->status);
+       addl_status = addl_status(compl->status);
+
+       resp_hdr = be_decode_resp_hdr(compl->tag0, compl->tag1);
+       if (resp_hdr) {
+               opcode = resp_hdr->opcode;
+               subsystem = resp_hdr->subsystem;
+       }
+
+       be_async_cmd_process(adapter, compl, resp_hdr);
 
-               if (compl_status == MCC_STATUS_UNAUTHORIZED_REQUEST) {
+       if (base_status != MCC_STATUS_SUCCESS &&
+           !be_skip_err_log(opcode, base_status, addl_status)) {
+
+               if (base_status == MCC_STATUS_UNAUTHORIZED_REQUEST) {
                        dev_warn(&adapter->pdev->dev,
                                 "VF is not privileged to issue opcode %d-%d\n",
                                 opcode, subsystem);
                } else {
-                       extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) &
-                                       CQE_STATUS_EXTD_MASK;
                        dev_err(&adapter->pdev->dev,
                                "opcode %d-%d failed:status %d-%d\n",
-                               opcode, subsystem, compl_status, extd_status);
-
-                       if (extd_status == MCC_ADDL_STS_INSUFFICIENT_RESOURCES)
-                               return extd_status;
+                               opcode, subsystem, base_status, addl_status);
                }
        }
-done:
-       return compl_status;
+       return compl->status;
 }
 
 /* Link state evt is a string of bytes; no need for endian swapping */
 static void be_async_link_state_process(struct be_adapter *adapter,
-               struct be_async_event_link_state *evt)
+                                       struct be_mcc_compl *compl)
 {
+       struct be_async_event_link_state *evt =
+                       (struct be_async_event_link_state *)compl;
+
        /* When link status changes, link speed must be re-queried from FW */
        adapter->phy.link_speed = -1;
 
@@ -221,8 +252,11 @@ static void be_async_link_state_process(struct be_adapter *adapter,
 
 /* Grp5 CoS Priority evt */
 static void be_async_grp5_cos_priority_process(struct be_adapter *adapter,
-               struct be_async_event_grp5_cos_priority *evt)
+                                              struct be_mcc_compl *compl)
 {
+       struct be_async_event_grp5_cos_priority *evt =
+                       (struct be_async_event_grp5_cos_priority *)compl;
+
        if (evt->valid) {
                adapter->vlan_prio_bmap = evt->available_priority_bmap;
                adapter->recommended_prio &= ~VLAN_PRIO_MASK;
@@ -233,8 +267,11 @@ static void be_async_grp5_cos_priority_process(struct be_adapter *adapter,
 
 /* Grp5 QOS Speed evt: qos_link_speed is in units of 10 Mbps */
 static void be_async_grp5_qos_speed_process(struct be_adapter *adapter,
-               struct be_async_event_grp5_qos_link_speed *evt)
+                                           struct be_mcc_compl *compl)
 {
+       struct be_async_event_grp5_qos_link_speed *evt =
+                       (struct be_async_event_grp5_qos_link_speed *)compl;
+
        if (adapter->phy.link_speed >= 0 &&
            evt->physical_port == adapter->port_num)
                adapter->phy.link_speed = le16_to_cpu(evt->qos_link_speed) * 10;
@@ -242,8 +279,11 @@ static void be_async_grp5_qos_speed_process(struct be_adapter *adapter,
 
 /*Grp5 PVID evt*/
 static void be_async_grp5_pvid_state_process(struct be_adapter *adapter,
-               struct be_async_event_grp5_pvid_state *evt)
+                                            struct be_mcc_compl *compl)
 {
+       struct be_async_event_grp5_pvid_state *evt =
+                       (struct be_async_event_grp5_pvid_state *)compl;
+
        if (evt->enabled) {
                adapter->pvid = le16_to_cpu(evt->tag) & VLAN_VID_MASK;
                dev_info(&adapter->pdev->dev, "LPVID: %d\n", adapter->pvid);
@@ -253,26 +293,21 @@ static void be_async_grp5_pvid_state_process(struct be_adapter *adapter,
 }
 
 static void be_async_grp5_evt_process(struct be_adapter *adapter,
-               u32 trailer, struct be_mcc_compl *evt)
+                                     struct be_mcc_compl *compl)
 {
-       u8 event_type = 0;
-
-       event_type = (trailer >> ASYNC_TRAILER_EVENT_TYPE_SHIFT) &
-               ASYNC_TRAILER_EVENT_TYPE_MASK;
+       u8 event_type = (compl->flags >> ASYNC_EVENT_TYPE_SHIFT) &
+                               ASYNC_EVENT_TYPE_MASK;
 
        switch (event_type) {
        case ASYNC_EVENT_COS_PRIORITY:
-               be_async_grp5_cos_priority_process(adapter,
-               (struct be_async_event_grp5_cos_priority *)evt);
-       break;
+               be_async_grp5_cos_priority_process(adapter, compl);
+               break;
        case ASYNC_EVENT_QOS_SPEED:
-               be_async_grp5_qos_speed_process(adapter,
-               (struct be_async_event_grp5_qos_link_speed *)evt);
-       break;
+               be_async_grp5_qos_speed_process(adapter, compl);
+               break;
        case ASYNC_EVENT_PVID_STATE:
-               be_async_grp5_pvid_state_process(adapter,
-               (struct be_async_event_grp5_pvid_state *)evt);
-       break;
+               be_async_grp5_pvid_state_process(adapter, compl);
+               break;
        default:
                dev_warn(&adapter->pdev->dev, "Unknown grp5 event 0x%x!\n",
                         event_type);
@@ -281,13 +316,13 @@ static void be_async_grp5_evt_process(struct be_adapter *adapter,
 }
 
 static void be_async_dbg_evt_process(struct be_adapter *adapter,
-               u32 trailer, struct be_mcc_compl *cmp)
+                                    struct be_mcc_compl *cmp)
 {
        u8 event_type = 0;
        struct be_async_event_qnq *evt = (struct be_async_event_qnq *) cmp;
 
-       event_type = (trailer >> ASYNC_TRAILER_EVENT_TYPE_SHIFT) &
-               ASYNC_TRAILER_EVENT_TYPE_MASK;
+       event_type = (cmp->flags >> ASYNC_EVENT_TYPE_SHIFT) &
+                       ASYNC_EVENT_TYPE_MASK;
 
        switch (event_type) {
        case ASYNC_DEBUG_EVENT_TYPE_QNQ:
@@ -302,25 +337,33 @@ static void be_async_dbg_evt_process(struct be_adapter *adapter,
        }
 }
 
-static inline bool is_link_state_evt(u32 trailer)
+static inline bool is_link_state_evt(u32 flags)
+{
+       return ((flags >> ASYNC_EVENT_CODE_SHIFT) & ASYNC_EVENT_CODE_MASK) ==
+                       ASYNC_EVENT_CODE_LINK_STATE;
+}
+
+static inline bool is_grp5_evt(u32 flags)
 {
-       return ((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
-               ASYNC_TRAILER_EVENT_CODE_MASK) ==
-                               ASYNC_EVENT_CODE_LINK_STATE;
+       return ((flags >> ASYNC_EVENT_CODE_SHIFT) & ASYNC_EVENT_CODE_MASK) ==
+                       ASYNC_EVENT_CODE_GRP_5;
 }
 
-static inline bool is_grp5_evt(u32 trailer)
+static inline bool is_dbg_evt(u32 flags)
 {
-       return (((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
-               ASYNC_TRAILER_EVENT_CODE_MASK) ==
-                               ASYNC_EVENT_CODE_GRP_5);
+       return ((flags >> ASYNC_EVENT_CODE_SHIFT) & ASYNC_EVENT_CODE_MASK) ==
+                       ASYNC_EVENT_CODE_QNQ;
 }
 
-static inline bool is_dbg_evt(u32 trailer)
+static void be_mcc_event_process(struct be_adapter *adapter,
+                                struct be_mcc_compl *compl)
 {
-       return (((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
-               ASYNC_TRAILER_EVENT_CODE_MASK) ==
-                               ASYNC_EVENT_CODE_QNQ);
+       if (is_link_state_evt(compl->flags))
+               be_async_link_state_process(adapter, compl);
+       else if (is_grp5_evt(compl->flags))
+               be_async_grp5_evt_process(adapter, compl);
+       else if (is_dbg_evt(compl->flags))
+               be_async_dbg_evt_process(adapter, compl);
 }
 
 static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter)
@@ -362,21 +405,13 @@ int be_process_mcc(struct be_adapter *adapter)
        struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
 
        spin_lock(&adapter->mcc_cq_lock);
+
        while ((compl = be_mcc_compl_get(adapter))) {
                if (compl->flags & CQE_FLAGS_ASYNC_MASK) {
-                       /* Interpret flags as an async trailer */
-                       if (is_link_state_evt(compl->flags))
-                               be_async_link_state_process(adapter,
-                               (struct be_async_event_link_state *) compl);
-                       else if (is_grp5_evt(compl->flags))
-                               be_async_grp5_evt_process(adapter,
-                               compl->flags, compl);
-                       else if (is_dbg_evt(compl->flags))
-                               be_async_dbg_evt_process(adapter,
-                               compl->flags, compl);
+                       be_mcc_event_process(adapter, compl);
                } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) {
-                               status = be_mcc_compl_process(adapter, compl);
-                               atomic_dec(&mcc_obj->q.used);
+                       status = be_mcc_compl_process(adapter, compl);
+                       atomic_dec(&mcc_obj->q.used);
                }
                be_mcc_compl_use(compl);
                num++;
@@ -436,7 +471,9 @@ static int be_mcc_notify_wait(struct be_adapter *adapter)
        if (status == -EIO)
                goto out;
 
-       status = resp->status;
+       status = (resp->base_status |
+                 ((resp->addl_status & CQE_ADDL_STATUS_MASK) <<
+                  CQE_ADDL_STATUS_SHIFT));
 out:
        return status;
 }
@@ -560,10 +597,8 @@ static bool lancer_provisioning_error(struct be_adapter *adapter)
        u32 sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0;
        sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET);
        if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
-               sliport_err1 = ioread32(adapter->db +
-                                       SLIPORT_ERROR1_OFFSET);
-               sliport_err2 = ioread32(adapter->db +
-                                       SLIPORT_ERROR2_OFFSET);
+               sliport_err1 = ioread32(adapter->db + SLIPORT_ERROR1_OFFSET);
+               sliport_err2 = ioread32(adapter->db + SLIPORT_ERROR2_OFFSET);
 
                if (sliport_err1 == SLIPORT_ERROR_NO_RESOURCE1 &&
                    sliport_err2 == SLIPORT_ERROR_NO_RESOURCE2)
@@ -630,8 +665,7 @@ int be_fw_wait_ready(struct be_adapter *adapter)
                if (stage == POST_STAGE_ARMFW_RDY)
                        return 0;
 
-               dev_info(dev, "Waiting for POST, %ds elapsed\n",
-                        timeout);
+               dev_info(dev, "Waiting for POST, %ds elapsed\n", timeout);
                if (msleep_interruptible(2000)) {
                        dev_err(dev, "Waiting for POST aborted\n");
                        return -EINTR;
@@ -649,8 +683,7 @@ static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb)
        return &wrb->payload.sgl[0];
 }
 
-static inline void fill_wrb_tags(struct be_mcc_wrb *wrb,
-                                unsigned long addr)
+static inline void fill_wrb_tags(struct be_mcc_wrb *wrb, unsigned long addr)
 {
        wrb->tag0 = addr & 0xFFFFFFFF;
        wrb->tag1 = upper_32_bits(addr);
@@ -659,8 +692,9 @@ static inline void fill_wrb_tags(struct be_mcc_wrb *wrb,
 /* Don't touch the hdr after it's prepared */
 /* mem will be NULL for embedded commands */
 static void be_wrb_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr,
-                               u8 subsystem, u8 opcode, int cmd_len,
-                               struct be_mcc_wrb *wrb, struct be_dma_mem *mem)
+                                  u8 subsystem, u8 opcode, int cmd_len,
+                                  struct be_mcc_wrb *wrb,
+                                  struct be_dma_mem *mem)
 {
        struct be_sge *sge;
 
@@ -683,7 +717,7 @@ static void be_wrb_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr,
 }
 
 static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages,
-                       struct be_dma_mem *mem)
+                                     struct be_dma_mem *mem)
 {
        int i, buf_pages = min(PAGES_4K_SPANNED(mem->va, mem->size), max_pages);
        u64 dma = (u64)mem->dma;
@@ -868,7 +902,8 @@ int be_cmd_eq_create(struct be_adapter *adapter, struct be_eq_obj *eqo)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_EQ_CREATE, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_EQ_CREATE, sizeof(*req), wrb,
+                              NULL);
 
        /* Support for EQ_CREATEv2 available only SH-R onwards */
        if (!(BEx_chip(adapter) || lancer_chip(adapter)))
@@ -917,7 +952,8 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_NTWK_MAC_QUERY, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_NTWK_MAC_QUERY, sizeof(*req), wrb,
+                              NULL);
        req->type = MAC_ADDRESS_TYPE_NETWORK;
        if (permanent) {
                req->permanent = 1;
@@ -940,7 +976,7 @@ err:
 
 /* Uses synchronous MCCQ */
 int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr,
-               u32 if_id, u32 *pmac_id, u32 domain)
+                   u32 if_id, u32 *pmac_id, u32 domain)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_pmac_add *req;
@@ -956,7 +992,8 @@ int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_NTWK_PMAC_ADD, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_NTWK_PMAC_ADD, sizeof(*req), wrb,
+                              NULL);
 
        req->hdr.domain = domain;
        req->if_id = cpu_to_le32(if_id);
@@ -1012,7 +1049,7 @@ err:
 
 /* Uses Mbox */
 int be_cmd_cq_create(struct be_adapter *adapter, struct be_queue_info *cq,
-               struct be_queue_info *eq, bool no_delay, int coalesce_wm)
+                    struct be_queue_info *eq, bool no_delay, int coalesce_wm)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_cq_create *req;
@@ -1028,17 +1065,18 @@ int be_cmd_cq_create(struct be_adapter *adapter, struct be_queue_info *cq,
        ctxt = &req->context;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_CQ_CREATE, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_CQ_CREATE, sizeof(*req), wrb,
+                              NULL);
 
        req->num_pages =  cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
 
        if (BEx_chip(adapter)) {
                AMAP_SET_BITS(struct amap_cq_context_be, coalescwm, ctxt,
-                                                               coalesce_wm);
+                             coalesce_wm);
                AMAP_SET_BITS(struct amap_cq_context_be, nodelay,
-                                                               ctxt, no_delay);
+                             ctxt, no_delay);
                AMAP_SET_BITS(struct amap_cq_context_be, count, ctxt,
-                                               __ilog2_u32(cq->len/256));
+                             __ilog2_u32(cq->len / 256));
                AMAP_SET_BITS(struct amap_cq_context_be, valid, ctxt, 1);
                AMAP_SET_BITS(struct amap_cq_context_be, eventable, ctxt, 1);
                AMAP_SET_BITS(struct amap_cq_context_be, eqid, ctxt, eq->id);
@@ -1053,14 +1091,12 @@ int be_cmd_cq_create(struct be_adapter *adapter, struct be_queue_info *cq,
                        AMAP_SET_BITS(struct amap_cq_context_v2, coalescwm,
                                      ctxt, coalesce_wm);
                AMAP_SET_BITS(struct amap_cq_context_v2, nodelay, ctxt,
-                                                               no_delay);
+                             no_delay);
                AMAP_SET_BITS(struct amap_cq_context_v2, count, ctxt,
-                                               __ilog2_u32(cq->len/256));
+                             __ilog2_u32(cq->len / 256));
                AMAP_SET_BITS(struct amap_cq_context_v2, valid, ctxt, 1);
-               AMAP_SET_BITS(struct amap_cq_context_v2, eventable,
-                                                               ctxt, 1);
-               AMAP_SET_BITS(struct amap_cq_context_v2, eqid,
-                                                               ctxt, eq->id);
+               AMAP_SET_BITS(struct amap_cq_context_v2, eventable, ctxt, 1);
+               AMAP_SET_BITS(struct amap_cq_context_v2, eqid, ctxt, eq->id);
        }
 
        be_dws_cpu_to_le(ctxt, sizeof(req->context));
@@ -1088,8 +1124,8 @@ static u32 be_encoded_q_len(int q_len)
 }
 
 static int be_cmd_mccq_ext_create(struct be_adapter *adapter,
-                               struct be_queue_info *mccq,
-                               struct be_queue_info *cq)
+                                 struct be_queue_info *mccq,
+                                 struct be_queue_info *cq)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_mcc_ext_create *req;
@@ -1105,13 +1141,14 @@ static int be_cmd_mccq_ext_create(struct be_adapter *adapter,
        ctxt = &req->context;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                       OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req), wrb,
+                              NULL);
 
        req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
        if (BEx_chip(adapter)) {
                AMAP_SET_BITS(struct amap_mcc_context_be, valid, ctxt, 1);
                AMAP_SET_BITS(struct amap_mcc_context_be, ring_size, ctxt,
-                                               be_encoded_q_len(mccq->len));
+                             be_encoded_q_len(mccq->len));
                AMAP_SET_BITS(struct amap_mcc_context_be, cq_id, ctxt, cq->id);
        } else {
                req->hdr.version = 1;
@@ -1145,8 +1182,8 @@ static int be_cmd_mccq_ext_create(struct be_adapter *adapter,
 }
 
 static int be_cmd_mccq_org_create(struct be_adapter *adapter,
-                               struct be_queue_info *mccq,
-                               struct be_queue_info *cq)
+                                 struct be_queue_info *mccq,
+                                 struct be_queue_info *cq)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_mcc_create *req;
@@ -1162,13 +1199,14 @@ static int be_cmd_mccq_org_create(struct be_adapter *adapter,
        ctxt = &req->context;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                       OPCODE_COMMON_MCC_CREATE, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_MCC_CREATE, sizeof(*req), wrb,
+                              NULL);
 
        req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
 
        AMAP_SET_BITS(struct amap_mcc_context_be, valid, ctxt, 1);
        AMAP_SET_BITS(struct amap_mcc_context_be, ring_size, ctxt,
-                       be_encoded_q_len(mccq->len));
+                     be_encoded_q_len(mccq->len));
        AMAP_SET_BITS(struct amap_mcc_context_be, cq_id, ctxt, cq->id);
 
        be_dws_cpu_to_le(ctxt, sizeof(req->context));
@@ -1187,8 +1225,7 @@ static int be_cmd_mccq_org_create(struct be_adapter *adapter,
 }
 
 int be_cmd_mccq_create(struct be_adapter *adapter,
-                       struct be_queue_info *mccq,
-                       struct be_queue_info *cq)
+                      struct be_queue_info *mccq, struct be_queue_info *cq)
 {
        int status;
 
@@ -1213,7 +1250,7 @@ int be_cmd_txq_create(struct be_adapter *adapter, struct be_tx_obj *txo)
 
        req = embedded_payload(&wrb);
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
-                               OPCODE_ETH_TX_CREATE, sizeof(*req), &wrb, NULL);
+                              OPCODE_ETH_TX_CREATE, sizeof(*req), &wrb, NULL);
 
        if (lancer_chip(adapter)) {
                req->hdr.version = 1;
@@ -1250,8 +1287,8 @@ int be_cmd_txq_create(struct be_adapter *adapter, struct be_tx_obj *txo)
 
 /* Uses MCC */
 int be_cmd_rxq_create(struct be_adapter *adapter,
-               struct be_queue_info *rxq, u16 cq_id, u16 frag_size,
-               u32 if_id, u32 rss, u8 *rss_id)
+                     struct be_queue_info *rxq, u16 cq_id, u16 frag_size,
+                     u32 if_id, u32 rss, u8 *rss_id)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_eth_rx_create *req;
@@ -1268,7 +1305,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
-                               OPCODE_ETH_RX_CREATE, sizeof(*req), wrb, NULL);
+                              OPCODE_ETH_RX_CREATE, sizeof(*req), wrb, NULL);
 
        req->cq_id = cpu_to_le16(cq_id);
        req->frag_size = fls(frag_size) - 1;
@@ -1295,7 +1332,7 @@ err:
  * Uses Mbox
  */
 int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
-               int queue_type)
+                    int queue_type)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_q_destroy *req;
@@ -1334,7 +1371,7 @@ int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
        }
 
        be_wrb_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req), wrb,
-                               NULL);
+                              NULL);
        req->id = cpu_to_le16(q->id);
 
        status = be_mbox_notify_wait(adapter);
@@ -1361,7 +1398,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
-                       OPCODE_ETH_RX_DESTROY, sizeof(*req), wrb, NULL);
+                              OPCODE_ETH_RX_DESTROY, sizeof(*req), wrb, NULL);
        req->id = cpu_to_le16(q->id);
 
        status = be_mcc_notify_wait(adapter);
@@ -1384,7 +1421,8 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, u32 en_flags,
 
        req = embedded_payload(&wrb);
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req), &wrb, NULL);
+                              OPCODE_COMMON_NTWK_INTERFACE_CREATE,
+                              sizeof(*req), &wrb, NULL);
        req->hdr.domain = domain;
        req->capability_flags = cpu_to_le32(cap_flags);
        req->enable_flags = cpu_to_le32(en_flags);
@@ -1422,7 +1460,8 @@ int be_cmd_if_destroy(struct be_adapter *adapter, int interface_id, u32 domain)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_NTWK_INTERFACE_DESTROY, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_NTWK_INTERFACE_DESTROY,
+                              sizeof(*req), wrb, NULL);
        req->hdr.domain = domain;
        req->interface_id = cpu_to_le32(interface_id);
 
@@ -1452,7 +1491,8 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
        hdr = nonemb_cmd->va;
 
        be_wrb_cmd_hdr_prepare(hdr, CMD_SUBSYSTEM_ETH,
-               OPCODE_ETH_GET_STATISTICS, nonemb_cmd->size, wrb, nonemb_cmd);
+                              OPCODE_ETH_GET_STATISTICS, nonemb_cmd->size, wrb,
+                              nonemb_cmd);
 
        /* version 1 of the cmd is not supported only by BE2 */
        if (BE2_chip(adapter))
@@ -1472,7 +1512,7 @@ err:
 
 /* Lancer Stats */
 int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
-                               struct be_dma_mem *nonemb_cmd)
+                              struct be_dma_mem *nonemb_cmd)
 {
 
        struct be_mcc_wrb *wrb;
@@ -1493,8 +1533,8 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
        req = nonemb_cmd->va;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
-                       OPCODE_ETH_GET_PPORT_STATS, nonemb_cmd->size, wrb,
-                       nonemb_cmd);
+                              OPCODE_ETH_GET_PPORT_STATS, nonemb_cmd->size,
+                              wrb, nonemb_cmd);
 
        req->cmd_params.params.pport_num = cpu_to_le16(adapter->hba_port_num);
        req->cmd_params.params.reset_stats = 0;
@@ -1553,7 +1593,8 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_NTWK_LINK_STATUS_QUERY,
+                              sizeof(*req), wrb, NULL);
 
        /* version 1 of the cmd is not supported only by BE2 */
        if (!BE2_chip(adapter))
@@ -1598,8 +1639,8 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES, sizeof(*req),
-               wrb, NULL);
+                              OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES,
+                              sizeof(*req), wrb, NULL);
 
        be_mcc_notify(adapter);
 
@@ -1625,7 +1666,8 @@ int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_MANAGE_FAT, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_MANAGE_FAT, sizeof(*req), wrb,
+                              NULL);
        req->fat_operation = cpu_to_le32(QUERY_FAT);
        status = be_mcc_notify_wait(adapter);
        if (!status) {
@@ -1655,8 +1697,8 @@ void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf)
 
        get_fat_cmd.size = sizeof(struct be_cmd_req_get_fat) + 60*1024;
        get_fat_cmd.va = pci_alloc_consistent(adapter->pdev,
-                       get_fat_cmd.size,
-                       &get_fat_cmd.dma);
+                                             get_fat_cmd.size,
+                                             &get_fat_cmd.dma);
        if (!get_fat_cmd.va) {
                status = -ENOMEM;
                dev_err(&adapter->pdev->dev,
@@ -1679,8 +1721,8 @@ void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf)
 
                payload_len = sizeof(struct be_cmd_req_get_fat) + buf_size;
                be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                               OPCODE_COMMON_MANAGE_FAT, payload_len, wrb,
-                               &get_fat_cmd);
+                                      OPCODE_COMMON_MANAGE_FAT, payload_len,
+                                      wrb, &get_fat_cmd);
 
                req->fat_operation = cpu_to_le32(RETRIEVE_FAT);
                req->read_log_offset = cpu_to_le32(log_offset);
@@ -1691,8 +1733,8 @@ void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf)
                if (!status) {
                        struct be_cmd_resp_get_fat *resp = get_fat_cmd.va;
                        memcpy(buf + offset,
-                               resp->data_buffer,
-                               le32_to_cpu(resp->read_log_length));
+                              resp->data_buffer,
+                              le32_to_cpu(resp->read_log_length));
                } else {
                        dev_err(&adapter->pdev->dev, "FAT Table Retrieve error\n");
                        goto err;
@@ -1702,14 +1744,12 @@ void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf)
        }
 err:
        pci_free_consistent(adapter->pdev, get_fat_cmd.size,
-                       get_fat_cmd.va,
-                       get_fat_cmd.dma);
+                           get_fat_cmd.va, get_fat_cmd.dma);
        spin_unlock_bh(&adapter->mcc_lock);
 }
 
 /* Uses synchronous mcc */
-int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver,
-                       char *fw_on_flash)
+int be_cmd_get_fw_ver(struct be_adapter *adapter)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_get_fw_version *req;
@@ -1726,13 +1766,13 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_GET_FW_VERSION, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_GET_FW_VERSION, sizeof(*req), wrb,
+                              NULL);
        status = be_mcc_notify_wait(adapter);
        if (!status) {
                struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb);
-               strcpy(fw_ver, resp->firmware_version_string);
-               if (fw_on_flash)
-                       strcpy(fw_on_flash, resp->fw_on_flash_version_string);
+               strcpy(adapter->fw_ver, resp->firmware_version_string);
+               strcpy(adapter->fw_on_flash, resp->fw_on_flash_version_string);
        }
 err:
        spin_unlock_bh(&adapter->mcc_lock);
@@ -1759,7 +1799,8 @@ int be_cmd_modify_eqd(struct be_adapter *adapter, struct be_set_eqd *set_eqd,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_MODIFY_EQ_DELAY, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_MODIFY_EQ_DELAY, sizeof(*req), wrb,
+                              NULL);
 
        req->num_eq = cpu_to_le32(num);
        for (i = 0; i < num; i++) {
@@ -1777,7 +1818,7 @@ err:
 
 /* Uses sycnhronous mcc */
 int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
-                      u32 num, bool promiscuous)
+                      u32 num)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_vlan_config *req;
@@ -1793,19 +1834,16 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_NTWK_VLAN_CONFIG, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_NTWK_VLAN_CONFIG, sizeof(*req),
+                              wrb, NULL);
 
        req->interface_id = if_id;
-       req->promiscuous = promiscuous;
        req->untagged = BE_IF_FLAGS_UNTAGGED & be_if_cap_flags(adapter) ? 1 : 0;
        req->num_vlan = num;
-       if (!promiscuous) {
-               memcpy(req->normal_vlan, vtag_array,
-                       req->num_vlan * sizeof(vtag_array[0]));
-       }
+       memcpy(req->normal_vlan, vtag_array,
+              req->num_vlan * sizeof(vtag_array[0]));
 
        status = be_mcc_notify_wait(adapter);
-
 err:
        spin_unlock_bh(&adapter->mcc_lock);
        return status;
@@ -1827,18 +1865,19 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
        }
        memset(req, 0, sizeof(*req));
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                               OPCODE_COMMON_NTWK_RX_FILTER, sizeof(*req),
-                               wrb, mem);
+                              OPCODE_COMMON_NTWK_RX_FILTER, sizeof(*req),
+                              wrb, mem);
 
        req->if_id = cpu_to_le32(adapter->if_handle);
        if (flags & IFF_PROMISC) {
                req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS |
-                                       BE_IF_FLAGS_VLAN_PROMISCUOUS |
-                                       BE_IF_FLAGS_MCAST_PROMISCUOUS);
+                                                BE_IF_FLAGS_VLAN_PROMISCUOUS |
+                                                BE_IF_FLAGS_MCAST_PROMISCUOUS);
                if (value == ON)
-                       req->if_flags = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS |
-                                               BE_IF_FLAGS_VLAN_PROMISCUOUS |
-                                               BE_IF_FLAGS_MCAST_PROMISCUOUS);
+                       req->if_flags =
+                               cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS |
+                                           BE_IF_FLAGS_VLAN_PROMISCUOUS |
+                                           BE_IF_FLAGS_MCAST_PROMISCUOUS);
        } else if (flags & IFF_ALLMULTI) {
                req->if_flags_mask = req->if_flags =
                                cpu_to_le32(BE_IF_FLAGS_MCAST_PROMISCUOUS);
@@ -1867,7 +1906,7 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
        }
 
        if ((req->if_flags_mask & cpu_to_le32(be_if_cap_flags(adapter))) !=
-            req->if_flags_mask) {
+           req->if_flags_mask) {
                dev_warn(&adapter->pdev->dev,
                         "Cannot set rx filter flags 0x%x\n",
                         req->if_flags_mask);
@@ -1905,7 +1944,8 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_SET_FLOW_CONTROL, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_SET_FLOW_CONTROL, sizeof(*req),
+                              wrb, NULL);
 
        req->tx_flow_control = cpu_to_le16((u16)tx_fc);
        req->rx_flow_control = cpu_to_le16((u16)rx_fc);
@@ -1938,7 +1978,8 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req),
+                              wrb, NULL);
 
        status = be_mcc_notify_wait(adapter);
        if (!status) {
@@ -1954,8 +1995,7 @@ err:
 }
 
 /* Uses mbox */
-int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num,
-                       u32 *mode, u32 *caps, u16 *asic_rev)
+int be_cmd_query_fw_cfg(struct be_adapter *adapter)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_query_fw_cfg *req;
@@ -1968,15 +2008,16 @@ int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_QUERY_FIRMWARE_CONFIG,
+                              sizeof(*req), wrb, NULL);
 
        status = be_mbox_notify_wait(adapter);
        if (!status) {
                struct be_cmd_resp_query_fw_cfg *resp = embedded_payload(wrb);
-               *port_num = le32_to_cpu(resp->phys_port);
-               *mode = le32_to_cpu(resp->function_mode);
-               *caps = le32_to_cpu(resp->function_caps);
-               *asic_rev = le32_to_cpu(resp->asic_revision) & 0xFF;
+               adapter->port_num = le32_to_cpu(resp->phys_port);
+               adapter->function_mode = le32_to_cpu(resp->function_mode);
+               adapter->function_caps = le32_to_cpu(resp->function_caps);
+               adapter->asic_rev = le32_to_cpu(resp->asic_revision) & 0xFF;
        }
 
        mutex_unlock(&adapter->mbox_lock);
@@ -2011,7 +2052,8 @@ int be_cmd_reset_function(struct be_adapter *adapter)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(req, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_FUNCTION_RESET, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_FUNCTION_RESET, sizeof(*req), wrb,
+                              NULL);
 
        status = be_mbox_notify_wait(adapter);
 
@@ -2020,47 +2062,47 @@ int be_cmd_reset_function(struct be_adapter *adapter)
 }
 
 int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
-                       u32 rss_hash_opts, u16 table_size)
+                     u32 rss_hash_opts, u16 table_size, const u8 *rss_hkey)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_rss_config *req;
-       u32 myhash[10] = {0x15d43fa5, 0x2534685a, 0x5f87693a, 0x5668494e,
-                       0x33cf6a53, 0x383334c6, 0x76ac4257, 0x59b242b2,
-                       0x3ea83c02, 0x4a110304};
        int status;
 
        if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS))
                return 0;
 
-       if (mutex_lock_interruptible(&adapter->mbox_lock))
-               return -1;
+       spin_lock_bh(&adapter->mcc_lock);
 
-       wrb = wrb_from_mbox(adapter);
+       wrb = wrb_from_mccq(adapter);
+       if (!wrb) {
+               status = -EBUSY;
+               goto err;
+       }
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
-               OPCODE_ETH_RSS_CONFIG, sizeof(*req), wrb, NULL);
+                              OPCODE_ETH_RSS_CONFIG, sizeof(*req), wrb, NULL);
 
        req->if_id = cpu_to_le32(adapter->if_handle);
        req->enable_rss = cpu_to_le16(rss_hash_opts);
        req->cpu_table_size_log2 = cpu_to_le16(fls(table_size) - 1);
 
-       if (lancer_chip(adapter) || skyhawk_chip(adapter))
+       if (!BEx_chip(adapter))
                req->hdr.version = 1;
 
        memcpy(req->cpu_table, rsstable, table_size);
-       memcpy(req->hash, myhash, sizeof(myhash));
+       memcpy(req->hash, rss_hkey, RSS_HASH_KEY_LEN);
        be_dws_cpu_to_le(req->hash, sizeof(req->hash));
 
-       status = be_mbox_notify_wait(adapter);
-
-       mutex_unlock(&adapter->mbox_lock);
+       status = be_mcc_notify_wait(adapter);
+err:
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
 /* Uses sync mcc */
 int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
-                       u8 bcn, u8 sts, u8 state)
+                           u8 bcn, u8 sts, u8 state)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_enable_disable_beacon *req;
@@ -2076,7 +2118,8 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_ENABLE_DISABLE_BEACON, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_ENABLE_DISABLE_BEACON,
+                              sizeof(*req), wrb, NULL);
 
        req->port_num = port_num;
        req->beacon_state = state;
@@ -2107,7 +2150,8 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_GET_BEACON_STATE, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_GET_BEACON_STATE, sizeof(*req),
+                              wrb, NULL);
 
        req->port_num = port_num;
 
@@ -2146,20 +2190,20 @@ int lancer_cmd_write_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                               OPCODE_COMMON_WRITE_OBJECT,
-                               sizeof(struct lancer_cmd_req_write_object), wrb,
-                               NULL);
+                              OPCODE_COMMON_WRITE_OBJECT,
+                              sizeof(struct lancer_cmd_req_write_object), wrb,
+                              NULL);
 
        ctxt = &req->context;
        AMAP_SET_BITS(struct amap_lancer_write_obj_context,
-                       write_length, ctxt, data_size);
+                     write_length, ctxt, data_size);
 
        if (data_size == 0)
                AMAP_SET_BITS(struct amap_lancer_write_obj_context,
-                               eof, ctxt, 1);
+                             eof, ctxt, 1);
        else
                AMAP_SET_BITS(struct amap_lancer_write_obj_context,
-                               eof, ctxt, 0);
+                             eof, ctxt, 0);
 
        be_dws_cpu_to_le(ctxt, sizeof(req->context));
        req->write_offset = cpu_to_le32(data_offset);
@@ -2167,8 +2211,8 @@ int lancer_cmd_write_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
        req->descriptor_count = cpu_to_le32(1);
        req->buf_len = cpu_to_le32(data_size);
        req->addr_low = cpu_to_le32((cmd->dma +
-                               sizeof(struct lancer_cmd_req_write_object))
-                               & 0xFFFFFFFF);
+                                    sizeof(struct lancer_cmd_req_write_object))
+                                   & 0xFFFFFFFF);
        req->addr_high = cpu_to_le32(upper_32_bits(cmd->dma +
                                sizeof(struct lancer_cmd_req_write_object)));
 
@@ -2177,7 +2221,7 @@ int lancer_cmd_write_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
 
        if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
                                         msecs_to_jiffies(60000)))
-               status = -1;
+               status = -ETIMEDOUT;
        else
                status = adapter->flash_status;
 
@@ -2197,8 +2241,8 @@ err_unlock:
 }
 
 int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
-               u32 data_size, u32 data_offset, const char *obj_name,
-               u32 *data_read, u32 *eof, u8 *addn_status)
+                          u32 data_size, u32 data_offset, const char *obj_name,
+                          u32 *data_read, u32 *eof, u8 *addn_status)
 {
        struct be_mcc_wrb *wrb;
        struct lancer_cmd_req_read_object *req;
@@ -2216,9 +2260,9 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                       OPCODE_COMMON_READ_OBJECT,
-                       sizeof(struct lancer_cmd_req_read_object), wrb,
-                       NULL);
+                              OPCODE_COMMON_READ_OBJECT,
+                              sizeof(struct lancer_cmd_req_read_object), wrb,
+                              NULL);
 
        req->desired_read_len = cpu_to_le32(data_size);
        req->read_offset = cpu_to_le32(data_offset);
@@ -2244,7 +2288,7 @@ err_unlock:
 }
 
 int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
-                       u32 flash_type, u32 flash_opcode, u32 buf_size)
+                         u32 flash_type, u32 flash_opcode, u32 buf_size)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_write_flashrom *req;
@@ -2261,7 +2305,8 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
        req = cmd->va;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_WRITE_FLASHROM, cmd->size, wrb, cmd);
+                              OPCODE_COMMON_WRITE_FLASHROM, cmd->size, wrb,
+                              cmd);
 
        req->params.op_type = cpu_to_le32(flash_type);
        req->params.op_code = cpu_to_le32(flash_opcode);
@@ -2272,7 +2317,7 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
 
        if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
                                         msecs_to_jiffies(40000)))
-               status = -1;
+               status = -ETIMEDOUT;
        else
                status = adapter->flash_status;
 
@@ -2284,7 +2329,7 @@ err_unlock:
 }
 
 int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
-                        int offset)
+                         u16 optype, int offset)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_read_flash_crc *req;
@@ -2303,7 +2348,7 @@ int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
                               OPCODE_COMMON_READ_FLASHROM, sizeof(*req),
                               wrb, NULL);
 
-       req->params.op_type = cpu_to_le32(OPTYPE_REDBOOT);
+       req->params.op_type = cpu_to_le32(optype);
        req->params.op_code = cpu_to_le32(FLASHROM_OPER_REPORT);
        req->params.offset = cpu_to_le32(offset);
        req->params.data_buf_size = cpu_to_le32(0x4);
@@ -2318,7 +2363,7 @@ err:
 }
 
 int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
-                               struct be_dma_mem *nonemb_cmd)
+                           struct be_dma_mem *nonemb_cmd)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_acpi_wol_magic_config *req;
@@ -2334,8 +2379,8 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
        req = nonemb_cmd->va;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
-               OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, sizeof(*req), wrb,
-               nonemb_cmd);
+                              OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, sizeof(*req),
+                              wrb, nonemb_cmd);
        memcpy(req->magic_mac, mac, ETH_ALEN);
 
        status = be_mcc_notify_wait(adapter);
@@ -2363,8 +2408,8 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
-                       OPCODE_LOWLEVEL_SET_LOOPBACK_MODE, sizeof(*req), wrb,
-                       NULL);
+                              OPCODE_LOWLEVEL_SET_LOOPBACK_MODE, sizeof(*req),
+                              wrb, NULL);
 
        req->src_port = port_num;
        req->dest_port = port_num;
@@ -2378,7 +2423,8 @@ err:
 }
 
 int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
-               u32 loopback_type, u32 pkt_size, u32 num_pkts, u64 pattern)
+                        u32 loopback_type, u32 pkt_size, u32 num_pkts,
+                        u64 pattern)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_loopback_test *req;
@@ -2396,7 +2442,8 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
-                       OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req), wrb, NULL);
+                              OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req), wrb,
+                              NULL);
 
        req->hdr.timeout = cpu_to_le32(15);
        req->pattern = cpu_to_le64(pattern);
@@ -2421,7 +2468,7 @@ err:
 }
 
 int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
-                               u32 byte_cnt, struct be_dma_mem *cmd)
+                       u32 byte_cnt, struct be_dma_mem *cmd)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_ddrdma_test *req;
@@ -2437,7 +2484,8 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
        }
        req = cmd->va;
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
-                       OPCODE_LOWLEVEL_HOST_DDR_DMA, cmd->size, wrb, cmd);
+                              OPCODE_LOWLEVEL_HOST_DDR_DMA, cmd->size, wrb,
+                              cmd);
 
        req->pattern = cpu_to_le64(pattern);
        req->byte_count = cpu_to_le32(byte_cnt);
@@ -2465,7 +2513,7 @@ err:
 }
 
 int be_cmd_get_seeprom_data(struct be_adapter *adapter,
-                               struct be_dma_mem *nonemb_cmd)
+                           struct be_dma_mem *nonemb_cmd)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_seeprom_read *req;
@@ -2481,8 +2529,8 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
        req = nonemb_cmd->va;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                       OPCODE_COMMON_SEEPROM_READ, sizeof(*req), wrb,
-                       nonemb_cmd);
+                              OPCODE_COMMON_SEEPROM_READ, sizeof(*req), wrb,
+                              nonemb_cmd);
 
        status = be_mcc_notify_wait(adapter);
 
@@ -2510,8 +2558,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
                goto err;
        }
        cmd.size = sizeof(struct be_cmd_req_get_phy_info);
-       cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size,
-                                       &cmd.dma);
+       cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, &cmd.dma);
        if (!cmd.va) {
                dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
                status = -ENOMEM;
@@ -2521,8 +2568,8 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
        req = cmd.va;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                       OPCODE_COMMON_GET_PHY_DETAILS, sizeof(*req),
-                       wrb, &cmd);
+                              OPCODE_COMMON_GET_PHY_DETAILS, sizeof(*req),
+                              wrb, &cmd);
 
        status = be_mcc_notify_wait(adapter);
        if (!status) {
@@ -2544,8 +2591,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
                                BE_SUPPORTED_SPEED_1GBPS;
                }
        }
-       pci_free_consistent(adapter->pdev, cmd.size,
-                               cmd.va, cmd.dma);
+       pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma);
 err:
        spin_unlock_bh(&adapter->mcc_lock);
        return status;
@@ -2568,7 +2614,7 @@ int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                       OPCODE_COMMON_SET_QOS, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_SET_QOS, sizeof(*req), wrb, NULL);
 
        req->hdr.domain = domain;
        req->valid_bits = cpu_to_le32(BE_QOS_BITS_NIC);
@@ -2597,10 +2643,9 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
        memset(&attribs_cmd, 0, sizeof(struct be_dma_mem));
        attribs_cmd.size = sizeof(struct be_cmd_resp_cntl_attribs);
        attribs_cmd.va = pci_alloc_consistent(adapter->pdev, attribs_cmd.size,
-                                               &attribs_cmd.dma);
+                                             &attribs_cmd.dma);
        if (!attribs_cmd.va) {
-               dev_err(&adapter->pdev->dev,
-                               "Memory allocation failure\n");
+               dev_err(&adapter->pdev->dev, "Memory allocation failure\n");
                status = -ENOMEM;
                goto err;
        }
@@ -2613,8 +2658,8 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
        req = attribs_cmd.va;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                        OPCODE_COMMON_GET_CNTL_ATTRIBUTES, payload_len, wrb,
-                       &attribs_cmd);
+                              OPCODE_COMMON_GET_CNTL_ATTRIBUTES, payload_len,
+                              wrb, &attribs_cmd);
 
        status = be_mbox_notify_wait(adapter);
        if (!status) {
@@ -2649,7 +2694,8 @@ int be_cmd_req_native_mode(struct be_adapter *adapter)
        req = embedded_payload(wrb);
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-               OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP,
+                              sizeof(*req), wrb, NULL);
 
        req->valid_cap_flags = cpu_to_le32(CAPABILITY_SW_TIMESTAMPS |
                                CAPABILITY_BE3_NATIVE_ERX_API);
@@ -2762,12 +2808,12 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
        memset(&get_mac_list_cmd, 0, sizeof(struct be_dma_mem));
        get_mac_list_cmd.size = sizeof(struct be_cmd_resp_get_mac_list);
        get_mac_list_cmd.va = pci_alloc_consistent(adapter->pdev,
-                       get_mac_list_cmd.size,
-                       &get_mac_list_cmd.dma);
+                                                  get_mac_list_cmd.size,
+                                                  &get_mac_list_cmd.dma);
 
        if (!get_mac_list_cmd.va) {
                dev_err(&adapter->pdev->dev,
-                               "Memory allocation failure during GET_MAC_LIST\n");
+                       "Memory allocation failure during GET_MAC_LIST\n");
                return -ENOMEM;
        }
 
@@ -2831,18 +2877,18 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
                /* If no active mac_id found, return first mac addr */
                *pmac_id_valid = false;
                memcpy(mac, resp->macaddr_list[0].mac_addr_id.macaddr,
-                                                               ETH_ALEN);
+                      ETH_ALEN);
        }
 
 out:
        spin_unlock_bh(&adapter->mcc_lock);
        pci_free_consistent(adapter->pdev, get_mac_list_cmd.size,
-                       get_mac_list_cmd.va, get_mac_list_cmd.dma);
+                           get_mac_list_cmd.va, get_mac_list_cmd.dma);
        return status;
 }
 
-int be_cmd_get_active_mac(struct be_adapter *adapter, u32 curr_pmac_id, u8 *mac,
-                         u32 if_handle, bool active, u32 domain)
+int be_cmd_get_active_mac(struct be_adapter *adapter, u32 curr_pmac_id,
+                         u8 *mac, u32 if_handle, bool active, u32 domain)
 {
 
        if (!active)
@@ -2892,7 +2938,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
        memset(&cmd, 0, sizeof(struct be_dma_mem));
        cmd.size = sizeof(struct be_cmd_req_set_mac_list);
        cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size,
-                       &cmd.dma, GFP_KERNEL);
+                                   &cmd.dma, GFP_KERNEL);
        if (!cmd.va)
                return -ENOMEM;
 
@@ -2906,8 +2952,8 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
 
        req = cmd.va;
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                               OPCODE_COMMON_SET_MAC_LIST, sizeof(*req),
-                               wrb, &cmd);
+                              OPCODE_COMMON_SET_MAC_LIST, sizeof(*req),
+                              wrb, &cmd);
 
        req->hdr.domain = domain;
        req->mac_count = mac_count;
@@ -2917,8 +2963,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
        status = be_mcc_notify_wait(adapter);
 
 err:
-       dma_free_coherent(&adapter->pdev->dev, cmd.size,
-                               cmd.va, cmd.dma);
+       dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
        spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
@@ -2963,7 +3008,8 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
        ctxt = &req->context;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                       OPCODE_COMMON_SET_HSW_CONFIG, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_SET_HSW_CONFIG, sizeof(*req), wrb,
+                              NULL);
 
        req->hdr.domain = domain;
        AMAP_SET_BITS(struct amap_set_hsw_context, interface_id, ctxt, intf_id);
@@ -3009,7 +3055,8 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
        ctxt = &req->context;
 
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                       OPCODE_COMMON_GET_HSW_CONFIG, sizeof(*req), wrb, NULL);
+                              OPCODE_COMMON_GET_HSW_CONFIG, sizeof(*req), wrb,
+                              NULL);
 
        req->hdr.domain = domain;
        AMAP_SET_BITS(struct amap_get_hsw_req_context, interface_id,
@@ -3027,10 +3074,9 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
        if (!status) {
                struct be_cmd_resp_get_hsw_config *resp =
                                                embedded_payload(wrb);
-               be_dws_le_to_cpu(&resp->context,
-                                               sizeof(resp->context));
+               be_dws_le_to_cpu(&resp->context, sizeof(resp->context));
                vid = AMAP_GET_BITS(struct amap_get_hsw_resp_context,
-                                                       pvid, &resp->context);
+                                   pvid, &resp->context);
                if (pvid)
                        *pvid = le16_to_cpu(vid);
                if (mode)
@@ -3062,11 +3108,9 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
 
        memset(&cmd, 0, sizeof(struct be_dma_mem));
        cmd.size = sizeof(struct be_cmd_resp_acpi_wol_magic_config_v1);
-       cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size,
-                                              &cmd.dma);
+       cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, &cmd.dma);
        if (!cmd.va) {
-               dev_err(&adapter->pdev->dev,
-                               "Memory allocation failure\n");
+               dev_err(&adapter->pdev->dev, "Memory allocation failure\n");
                status = -ENOMEM;
                goto err;
        }
@@ -3266,15 +3310,28 @@ err:
        return status;
 }
 
-static struct be_nic_res_desc *be_get_nic_desc(u8 *buf, u32 desc_count)
+/* Descriptor type */
+enum {
+       FUNC_DESC = 1,
+       VFT_DESC = 2
+};
+
+static struct be_nic_res_desc *be_get_nic_desc(u8 *buf, u32 desc_count,
+                                              int desc_type)
 {
        struct be_res_desc_hdr *hdr = (struct be_res_desc_hdr *)buf;
+       struct be_nic_res_desc *nic;
        int i;
 
        for (i = 0; i < desc_count; i++) {
                if (hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V0 ||
-                   hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V1)
-                       return (struct be_nic_res_desc *)hdr;
+                   hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V1) {
+                       nic = (struct be_nic_res_desc *)hdr;
+                       if (desc_type == FUNC_DESC ||
+                           (desc_type == VFT_DESC &&
+                            nic->flags & (1 << VFT_SHIFT)))
+                               return nic;
+               }
 
                hdr->desc_len = hdr->desc_len ? : RESOURCE_DESC_SIZE_V0;
                hdr = (void *)hdr + hdr->desc_len;
@@ -3282,6 +3339,16 @@ static struct be_nic_res_desc *be_get_nic_desc(u8 *buf, u32 desc_count)
        return NULL;
 }
 
+static struct be_nic_res_desc *be_get_vft_desc(u8 *buf, u32 desc_count)
+{
+       return be_get_nic_desc(buf, desc_count, VFT_DESC);
+}
+
+static struct be_nic_res_desc *be_get_func_nic_desc(u8 *buf, u32 desc_count)
+{
+       return be_get_nic_desc(buf, desc_count, FUNC_DESC);
+}
+
 static struct be_pcie_res_desc *be_get_pcie_desc(u8 devfn, u8 *buf,
                                                 u32 desc_count)
 {
@@ -3349,8 +3416,7 @@ int be_cmd_get_func_config(struct be_adapter *adapter, struct be_resources *res)
 
        memset(&cmd, 0, sizeof(struct be_dma_mem));
        cmd.size = sizeof(struct be_cmd_resp_get_func_config);
-       cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size,
-                                     &cmd.dma);
+       cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, &cmd.dma);
        if (!cmd.va) {
                dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
                status = -ENOMEM;
@@ -3378,7 +3444,7 @@ int be_cmd_get_func_config(struct be_adapter *adapter, struct be_resources *res)
                u32 desc_count = le32_to_cpu(resp->desc_count);
                struct be_nic_res_desc *desc;
 
-               desc = be_get_nic_desc(resp->func_param, desc_count);
+               desc = be_get_func_nic_desc(resp->func_param, desc_count);
                if (!desc) {
                        status = -EINVAL;
                        goto err;
@@ -3394,76 +3460,17 @@ err:
        return status;
 }
 
-/* Uses mbox */
-static int be_cmd_get_profile_config_mbox(struct be_adapter *adapter,
-                                       u8 domain, struct be_dma_mem *cmd)
-{
-       struct be_mcc_wrb *wrb;
-       struct be_cmd_req_get_profile_config *req;
-       int status;
-
-       if (mutex_lock_interruptible(&adapter->mbox_lock))
-               return -1;
-       wrb = wrb_from_mbox(adapter);
-
-       req = cmd->va;
-       be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                              OPCODE_COMMON_GET_PROFILE_CONFIG,
-                              cmd->size, wrb, cmd);
-
-       req->type = ACTIVE_PROFILE_TYPE;
-       req->hdr.domain = domain;
-       if (!lancer_chip(adapter))
-               req->hdr.version = 1;
-
-       status = be_mbox_notify_wait(adapter);
-
-       mutex_unlock(&adapter->mbox_lock);
-       return status;
-}
-
-/* Uses sync mcc */
-static int be_cmd_get_profile_config_mccq(struct be_adapter *adapter,
-                                       u8 domain, struct be_dma_mem *cmd)
-{
-       struct be_mcc_wrb *wrb;
-       struct be_cmd_req_get_profile_config *req;
-       int status;
-
-       spin_lock_bh(&adapter->mcc_lock);
-
-       wrb = wrb_from_mccq(adapter);
-       if (!wrb) {
-               status = -EBUSY;
-               goto err;
-       }
-
-       req = cmd->va;
-       be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                              OPCODE_COMMON_GET_PROFILE_CONFIG,
-                              cmd->size, wrb, cmd);
-
-       req->type = ACTIVE_PROFILE_TYPE;
-       req->hdr.domain = domain;
-       if (!lancer_chip(adapter))
-               req->hdr.version = 1;
-
-       status = be_mcc_notify_wait(adapter);
-
-err:
-       spin_unlock_bh(&adapter->mcc_lock);
-       return status;
-}
-
-/* Uses sync mcc, if MCCQ is already created otherwise mbox */
+/* Will use MBOX only if MCCQ has not been created */
 int be_cmd_get_profile_config(struct be_adapter *adapter,
                              struct be_resources *res, u8 domain)
 {
        struct be_cmd_resp_get_profile_config *resp;
+       struct be_cmd_req_get_profile_config *req;
+       struct be_nic_res_desc *vf_res;
        struct be_pcie_res_desc *pcie;
        struct be_port_res_desc *port;
        struct be_nic_res_desc *nic;
-       struct be_queue_info *mccq = &adapter->mcc_obj.q;
+       struct be_mcc_wrb wrb = {0};
        struct be_dma_mem cmd;
        u32 desc_count;
        int status;
@@ -3474,18 +3481,25 @@ int be_cmd_get_profile_config(struct be_adapter *adapter,
        if (!cmd.va)
                return -ENOMEM;
 
-       if (!mccq->created)
-               status = be_cmd_get_profile_config_mbox(adapter, domain, &cmd);
-       else
-               status = be_cmd_get_profile_config_mccq(adapter, domain, &cmd);
+       req = cmd.va;
+       be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+                              OPCODE_COMMON_GET_PROFILE_CONFIG,
+                              cmd.size, &wrb, &cmd);
+
+       req->hdr.domain = domain;
+       if (!lancer_chip(adapter))
+               req->hdr.version = 1;
+       req->type = ACTIVE_PROFILE_TYPE;
+
+       status = be_cmd_notify_wait(adapter, &wrb);
        if (status)
                goto err;
 
        resp = cmd.va;
        desc_count = le32_to_cpu(resp->desc_count);
 
-       pcie =  be_get_pcie_desc(adapter->pdev->devfn, resp->func_param,
-                                desc_count);
+       pcie = be_get_pcie_desc(adapter->pdev->devfn, resp->func_param,
+                               desc_count);
        if (pcie)
                res->max_vfs = le16_to_cpu(pcie->num_vfs);
 
@@ -3493,48 +3507,52 @@ int be_cmd_get_profile_config(struct be_adapter *adapter,
        if (port)
                adapter->mc_type = port->mc_type;
 
-       nic = be_get_nic_desc(resp->func_param, desc_count);
+       nic = be_get_func_nic_desc(resp->func_param, desc_count);
        if (nic)
                be_copy_nic_desc(res, nic);
 
+       vf_res = be_get_vft_desc(resp->func_param, desc_count);
+       if (vf_res)
+               res->vf_if_cap_flags = vf_res->cap_flags;
 err:
        if (cmd.va)
                pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma);
        return status;
 }
 
-int be_cmd_set_profile_config(struct be_adapter *adapter, void *desc,
-                             int size, u8 version, u8 domain)
+/* Will use MBOX only if MCCQ has not been created */
+static int be_cmd_set_profile_config(struct be_adapter *adapter, void *desc,
+                                    int size, int count, u8 version, u8 domain)
 {
        struct be_cmd_req_set_profile_config *req;
-       struct be_mcc_wrb *wrb;
+       struct be_mcc_wrb wrb = {0};
+       struct be_dma_mem cmd;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
-
-       wrb = wrb_from_mccq(adapter);
-       if (!wrb) {
-               status = -EBUSY;
-               goto err;
-       }
+       memset(&cmd, 0, sizeof(struct be_dma_mem));
+       cmd.size = sizeof(struct be_cmd_req_set_profile_config);
+       cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, &cmd.dma);
+       if (!cmd.va)
+               return -ENOMEM;
 
-       req = embedded_payload(wrb);
+       req = cmd.va;
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                              OPCODE_COMMON_SET_PROFILE_CONFIG, sizeof(*req),
-                              wrb, NULL);
+                              OPCODE_COMMON_SET_PROFILE_CONFIG, cmd.size,
+                              &wrb, &cmd);
        req->hdr.version = version;
        req->hdr.domain = domain;
-       req->desc_count = cpu_to_le32(1);
+       req->desc_count = cpu_to_le32(count);
        memcpy(req->desc, desc, size);
 
-       status = be_mcc_notify_wait(adapter);
-err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       status = be_cmd_notify_wait(adapter, &wrb);
+
+       if (cmd.va)
+               pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma);
        return status;
 }
 
 /* Mark all fields invalid */
-void be_reset_nic_desc(struct be_nic_res_desc *nic)
+static void be_reset_nic_desc(struct be_nic_res_desc *nic)
 {
        memset(nic, 0, sizeof(*nic));
        nic->unicast_mac_count = 0xFFFF;
@@ -3548,33 +3566,114 @@ void be_reset_nic_desc(struct be_nic_res_desc *nic)
        nic->cq_count = 0xFFFF;
        nic->toe_conn_count = 0xFFFF;
        nic->eq_count = 0xFFFF;
+       nic->iface_count = 0xFFFF;
        nic->link_param = 0xFF;
+       nic->channel_id_param = cpu_to_le16(0xF000);
        nic->acpi_params = 0xFF;
        nic->wol_param = 0x0F;
+       nic->tunnel_iface_count = 0xFFFF;
+       nic->direct_tenant_iface_count = 0xFFFF;
        nic->bw_min = 0xFFFFFFFF;
        nic->bw_max = 0xFFFFFFFF;
 }
 
-int be_cmd_config_qos(struct be_adapter *adapter, u32 bps, u8 domain)
+/* Mark all fields invalid */
+static void be_reset_pcie_desc(struct be_pcie_res_desc *pcie)
 {
-       if (lancer_chip(adapter)) {
-               struct be_nic_res_desc nic_desc;
+       memset(pcie, 0, sizeof(*pcie));
+       pcie->sriov_state = 0xFF;
+       pcie->pf_state = 0xFF;
+       pcie->pf_type = 0xFF;
+       pcie->num_vfs = 0xFFFF;
+}
+
+int be_cmd_config_qos(struct be_adapter *adapter, u32 max_rate, u16 link_speed,
+                     u8 domain)
+{
+       struct be_nic_res_desc nic_desc;
+       u32 bw_percent;
+       u16 version = 0;
 
-               be_reset_nic_desc(&nic_desc);
+       if (BE3_chip(adapter))
+               return be_cmd_set_qos(adapter, max_rate / 10, domain);
+
+       be_reset_nic_desc(&nic_desc);
+       nic_desc.pf_num = adapter->pf_number;
+       nic_desc.vf_num = domain;
+       if (lancer_chip(adapter)) {
                nic_desc.hdr.desc_type = NIC_RESOURCE_DESC_TYPE_V0;
                nic_desc.hdr.desc_len = RESOURCE_DESC_SIZE_V0;
                nic_desc.flags = (1 << QUN_SHIFT) | (1 << IMM_SHIFT) |
                                        (1 << NOSV_SHIFT);
-               nic_desc.pf_num = adapter->pf_number;
-               nic_desc.vf_num = domain;
-               nic_desc.bw_max = cpu_to_le32(bps);
+               nic_desc.bw_max = cpu_to_le32(max_rate / 10);
+       } else {
+               version = 1;
+               nic_desc.hdr.desc_type = NIC_RESOURCE_DESC_TYPE_V1;
+               nic_desc.hdr.desc_len = RESOURCE_DESC_SIZE_V1;
+               nic_desc.flags = (1 << IMM_SHIFT) | (1 << NOSV_SHIFT);
+               bw_percent = max_rate ? (max_rate * 100) / link_speed : 100;
+               nic_desc.bw_max = cpu_to_le32(bw_percent);
+       }
+
+       return be_cmd_set_profile_config(adapter, &nic_desc,
+                                        nic_desc.hdr.desc_len,
+                                        1, version, domain);
+}
+
+int be_cmd_set_sriov_config(struct be_adapter *adapter,
+                           struct be_resources res, u16 num_vfs)
+{
+       struct {
+               struct be_pcie_res_desc pcie;
+               struct be_nic_res_desc nic_vft;
+       } __packed desc;
+       u16 vf_q_count;
 
-               return be_cmd_set_profile_config(adapter, &nic_desc,
-                                                RESOURCE_DESC_SIZE_V0,
-                                                0, domain);
+       if (BEx_chip(adapter) || lancer_chip(adapter))
+               return 0;
+
+       /* PF PCIE descriptor */
+       be_reset_pcie_desc(&desc.pcie);
+       desc.pcie.hdr.desc_type = PCIE_RESOURCE_DESC_TYPE_V1;
+       desc.pcie.hdr.desc_len = RESOURCE_DESC_SIZE_V1;
+       desc.pcie.flags = (1 << IMM_SHIFT) | (1 << NOSV_SHIFT);
+       desc.pcie.pf_num = adapter->pdev->devfn;
+       desc.pcie.sriov_state = num_vfs ? 1 : 0;
+       desc.pcie.num_vfs = cpu_to_le16(num_vfs);
+
+       /* VF NIC Template descriptor */
+       be_reset_nic_desc(&desc.nic_vft);
+       desc.nic_vft.hdr.desc_type = NIC_RESOURCE_DESC_TYPE_V1;
+       desc.nic_vft.hdr.desc_len = RESOURCE_DESC_SIZE_V1;
+       desc.nic_vft.flags = (1 << VFT_SHIFT) | (1 << IMM_SHIFT) |
+                               (1 << NOSV_SHIFT);
+       desc.nic_vft.pf_num = adapter->pdev->devfn;
+       desc.nic_vft.vf_num = 0;
+
+       if (num_vfs && res.vf_if_cap_flags & BE_IF_FLAGS_RSS) {
+               /* If number of VFs requested is 8 less than max supported,
+                * assign 8 queue pairs to the PF and divide the remaining
+                * resources evenly among the VFs
+                */
+               if (num_vfs < (be_max_vfs(adapter) - 8))
+                       vf_q_count = (res.max_rss_qs - 8) / num_vfs;
+               else
+                       vf_q_count = res.max_rss_qs / num_vfs;
+
+               desc.nic_vft.rq_count = cpu_to_le16(vf_q_count);
+               desc.nic_vft.txq_count = cpu_to_le16(vf_q_count);
+               desc.nic_vft.rssq_count = cpu_to_le16(vf_q_count - 1);
+               desc.nic_vft.cq_count = cpu_to_le16(3 * vf_q_count);
        } else {
-               return be_cmd_set_qos(adapter, bps, domain);
+               desc.nic_vft.txq_count = cpu_to_le16(1);
+               desc.nic_vft.rq_count = cpu_to_le16(1);
+               desc.nic_vft.rssq_count = cpu_to_le16(0);
+               /* One CQ for each TX, RX and MCCQ */
+               desc.nic_vft.cq_count = cpu_to_le16(3);
        }
+
+       return be_cmd_set_profile_config(adapter, &desc,
+                                        2 * RESOURCE_DESC_SIZE_V1, 2, 1, 0);
 }
 
 int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op)
@@ -3626,7 +3725,7 @@ int be_cmd_set_vxlan_port(struct be_adapter *adapter, __be16 port)
        }
 
        return be_cmd_set_profile_config(adapter, &port_desc,
-                                        RESOURCE_DESC_SIZE_V1, 1, 0);
+                                        RESOURCE_DESC_SIZE_V1, 1, 1, 0);
 }
 
 int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg,
@@ -3859,7 +3958,7 @@ err:
 }
 
 int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
-                       int wrb_payload_size, u16 *cmd_status, u16 *ext_status)
+                   int wrb_payload_size, u16 *cmd_status, u16 *ext_status)
 {
        struct be_adapter *adapter = netdev_priv(netdev_handle);
        struct be_mcc_wrb *wrb;