be2net: Provide an alternate way to read pf_num for BEx chips
[cascardo/linux.git] / drivers / net / ethernet / emulex / benet / be_cmds.c
index 2cc1175..45d1742 100644 (file)
@@ -92,6 +92,11 @@ static struct be_cmd_priv_map cmd_priv_map[] = {
                CMD_SUBSYSTEM_COMMON,
                BE_PRIV_DEVCFG | BE_PRIV_VHADM
        },
+       {
+               OPCODE_COMMON_GET_EXT_FAT_CAPABILITIES,
+               CMD_SUBSYSTEM_COMMON,
+               BE_PRIV_DEVCFG
+       }
 };
 
 static bool be_cmd_allowed(struct be_adapter *adapter, u8 opcode, u8 subsystem)
@@ -571,7 +576,7 @@ int be_process_mcc(struct be_adapter *adapter)
 /* Wait till no more pending mcc requests are present */
 static int be_mcc_wait_compl(struct be_adapter *adapter)
 {
-#define mcc_timeout            120000 /* 12s timeout */
+#define mcc_timeout            12000 /* 12s timeout */
        int i, status = 0;
        struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
 
@@ -585,7 +590,7 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
 
                if (atomic_read(&mcc_obj->q.used) == 0)
                        break;
-               udelay(100);
+               usleep_range(500, 1000);
        }
        if (i == mcc_timeout) {
                dev_err(&adapter->pdev->dev, "FW not responding\n");
@@ -705,7 +710,7 @@ static int be_mbox_notify_wait(struct be_adapter *adapter)
        return 0;
 }
 
-static u16 be_POST_stage_get(struct be_adapter *adapter)
+u16 be_POST_stage_get(struct be_adapter *adapter)
 {
        u32 sem;
 
@@ -863,7 +868,7 @@ static bool use_mcc(struct be_adapter *adapter)
 static int be_cmd_lock(struct be_adapter *adapter)
 {
        if (use_mcc(adapter)) {
-               spin_lock_bh(&adapter->mcc_lock);
+               mutex_lock(&adapter->mcc_lock);
                return 0;
        } else {
                return mutex_lock_interruptible(&adapter->mbox_lock);
@@ -874,7 +879,7 @@ static int be_cmd_lock(struct be_adapter *adapter)
 static void be_cmd_unlock(struct be_adapter *adapter)
 {
        if (use_mcc(adapter))
-               spin_unlock_bh(&adapter->mcc_lock);
+               return mutex_unlock(&adapter->mcc_lock);
        else
                return mutex_unlock(&adapter->mbox_lock);
 }
@@ -1044,7 +1049,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
        struct be_cmd_req_mac_query *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1073,7 +1078,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
        }
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1085,7 +1090,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr,
        struct be_cmd_req_pmac_add *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1110,7 +1115,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr,
        }
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
 
         if (status == MCC_STATUS_UNAUTHORIZED_REQUEST)
                status = -EPERM;
@@ -1128,7 +1133,7 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, int pmac_id, u32 dom)
        if (pmac_id == -1)
                return 0;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1148,7 +1153,7 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, int pmac_id, u32 dom)
        status = be_mcc_notify_wait(adapter);
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1411,7 +1416,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
        struct be_dma_mem *q_mem = &rxq->dma_mem;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1441,7 +1446,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
        }
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1505,7 +1510,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
        struct be_cmd_req_q_destroy *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1522,7 +1527,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
        q->created = false;
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1590,7 +1595,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
        struct be_cmd_req_hdr *hdr;
        int status = 0;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1618,7 +1623,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
        adapter->stats_cmd_sent = true;
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1634,7 +1639,7 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
                            CMD_SUBSYSTEM_ETH))
                return -EPERM;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1657,7 +1662,7 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
        adapter->stats_cmd_sent = true;
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1694,7 +1699,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
        struct be_cmd_req_link_status *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        if (link_status)
                *link_status = LINK_DOWN;
@@ -1733,7 +1738,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
        }
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1744,7 +1749,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
        struct be_cmd_req_get_cntl_addnl_attribs *req;
        int status = 0;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1759,7 +1764,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
 
        status = be_mcc_notify(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1808,7 +1813,7 @@ int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf)
        if (!get_fat_cmd.va)
                return -ENOMEM;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        while (total_size) {
                buf_size = min(total_size, (u32)60*1024);
@@ -1848,7 +1853,7 @@ int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf)
 err:
        dma_free_coherent(&adapter->pdev->dev, get_fat_cmd.size,
                          get_fat_cmd.va, get_fat_cmd.dma);
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1859,7 +1864,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter)
        struct be_cmd_req_get_fw_version *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1882,7 +1887,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter)
                        sizeof(adapter->fw_on_flash));
        }
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1896,7 +1901,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter,
        struct be_cmd_req_modify_eq_delay *req;
        int status = 0, i;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1919,7 +1924,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter,
 
        status = be_mcc_notify(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1946,7 +1951,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
        struct be_cmd_req_vlan_config *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1968,7 +1973,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1979,7 +1984,7 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
        struct be_cmd_req_rx_filter *req = mem->va;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1996,8 +2001,7 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
        req->if_flags = (value == ON) ? req->if_flags_mask : 0;
 
        if (flags & BE_IF_FLAGS_MULTICAST) {
-               struct netdev_hw_addr *ha;
-               int i = 0;
+               int i;
 
                /* Reset mcast promisc mode if already set by setting mask
                 * and not setting flags field
@@ -2005,14 +2009,15 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
                req->if_flags_mask |=
                        cpu_to_le32(BE_IF_FLAGS_MCAST_PROMISCUOUS &
                                    be_if_cap_flags(adapter));
-               req->mcast_num = cpu_to_le32(netdev_mc_count(adapter->netdev));
-               netdev_for_each_mc_addr(ha, adapter->netdev)
-                       memcpy(req->mcast_mac[i++].byte, ha->addr, ETH_ALEN);
+               req->mcast_num = cpu_to_le32(adapter->mc_count);
+               for (i = 0; i < adapter->mc_count; i++)
+                       ether_addr_copy(req->mcast_mac[i].byte,
+                                       adapter->mc_list[i].mac);
        }
 
        status = be_mcc_notify_wait(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -2043,7 +2048,7 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
                            CMD_SUBSYSTEM_COMMON))
                return -EPERM;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2063,7 +2068,7 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
        status = be_mcc_notify_wait(adapter);
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
 
        if (base_status(status) == MCC_STATUS_FEATURE_NOT_SUPPORTED)
                return  -EOPNOTSUPP;
@@ -2082,7 +2087,7 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
                            CMD_SUBSYSTEM_COMMON))
                return -EPERM;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2105,7 +2110,7 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
        }
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -2186,7 +2191,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
        if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS))
                return 0;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2211,7 +2216,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -2223,7 +2228,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
        struct be_cmd_req_enable_disable_beacon *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2244,7 +2249,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
        status = be_mcc_notify_wait(adapter);
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -2255,7 +2260,7 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
        struct be_cmd_req_get_beacon_state *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2279,7 +2284,7 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
        }
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -2303,7 +2308,7 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter,
                return -ENOMEM;
        }
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2325,7 +2330,7 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter,
                memcpy(data, resp->page_data, PAGE_DATA_LEN);
        }
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
        return status;
 }
@@ -2342,7 +2347,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
        void *ctxt = NULL;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
        adapter->flash_status = 0;
 
        wrb = wrb_from_mccq(adapter);
@@ -2384,7 +2389,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
        if (status)
                goto err_unlock;
 
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
 
        if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
                                         msecs_to_jiffies(60000)))
@@ -2403,7 +2408,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
        return status;
 
 err_unlock:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -2457,7 +2462,7 @@ static int lancer_cmd_delete_object(struct be_adapter *adapter,
        struct be_mcc_wrb *wrb;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2475,7 +2480,7 @@ static int lancer_cmd_delete_object(struct be_adapter *adapter,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -2488,7 +2493,7 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
        struct lancer_cmd_resp_read_object *resp;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2522,7 +2527,7 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
        }
 
 err_unlock:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -2534,7 +2539,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
        struct be_cmd_write_flashrom *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
        adapter->flash_status = 0;
 
        wrb = wrb_from_mccq(adapter);
@@ -2559,7 +2564,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
        if (status)
                goto err_unlock;
 
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
 
        if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
                                         msecs_to_jiffies(40000)))
@@ -2570,7 +2575,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
        return status;
 
 err_unlock:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -2581,7 +2586,7 @@ static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
        struct be_mcc_wrb *wrb;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2608,7 +2613,7 @@ static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
                memcpy(flashed_crc, req->crc, 4);
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3192,7 +3197,7 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
        struct be_cmd_req_acpi_wol_magic_config *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3209,7 +3214,7 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
        status = be_mcc_notify_wait(adapter);
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3224,7 +3229,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
                            CMD_SUBSYSTEM_LOWLEVEL))
                return -EPERM;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3247,7 +3252,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
        if (status)
                goto err_unlock;
 
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
 
        if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
                                         msecs_to_jiffies(SET_LB_MODE_TIMEOUT)))
@@ -3256,7 +3261,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
        return status;
 
 err_unlock:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3273,7 +3278,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
                            CMD_SUBSYSTEM_LOWLEVEL))
                return -EPERM;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3299,7 +3304,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
        if (status)
                goto err;
 
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
 
        wait_for_completion(&adapter->et_cmd_compl);
        resp = embedded_payload(wrb);
@@ -3307,7 +3312,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
 
        return status;
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3323,7 +3328,7 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
                            CMD_SUBSYSTEM_LOWLEVEL))
                return -EPERM;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3357,7 +3362,7 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
        }
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3368,7 +3373,7 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
        struct be_cmd_req_seeprom_read *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3384,7 +3389,7 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
        status = be_mcc_notify_wait(adapter);
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3399,7 +3404,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
                            CMD_SUBSYSTEM_COMMON))
                return -EPERM;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3444,7 +3449,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
        }
        dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3454,7 +3459,7 @@ static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
        struct be_cmd_req_set_qos *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3474,7 +3479,7 @@ static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
        status = be_mcc_notify_wait(adapter);
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3522,6 +3527,11 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
                for (i = 0; i < CNTL_SERIAL_NUM_WORDS; i++)
                        adapter->serial_num[i] = le32_to_cpu(serial_num[i]) &
                                (BIT_MASK(16) - 1);
+               /* For BEx, since GET_FUNC_CONFIG command is not
+                * supported, we read funcnum here as a workaround.
+                */
+               if (BEx_chip(adapter))
+                       adapter->pf_num = attribs->hba_attribs.pci_funcnum;
        }
 
 err:
@@ -3581,7 +3591,7 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
        struct be_cmd_req_get_fn_privileges *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3613,7 +3623,7 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
        }
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3625,7 +3635,7 @@ int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
        struct be_cmd_req_set_fn_privileges *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3645,7 +3655,7 @@ int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3677,7 +3687,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
                return -ENOMEM;
        }
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3741,7 +3751,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
        }
 
 out:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        dma_free_coherent(&adapter->pdev->dev, get_mac_list_cmd.size,
                          get_mac_list_cmd.va, get_mac_list_cmd.dma);
        return status;
@@ -3801,7 +3811,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
        if (!cmd.va)
                return -ENOMEM;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3823,7 +3833,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
 
 err:
        dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3859,7 +3869,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
                            CMD_SUBSYSTEM_COMMON))
                return -EPERM;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3900,7 +3910,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
        status = be_mcc_notify_wait(adapter);
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -3914,7 +3924,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
        int status;
        u16 vid;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3961,7 +3971,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
        }
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -4127,6 +4137,10 @@ int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter,
        struct be_cmd_req_get_ext_fat_caps *req;
        int status;
 
+       if (!be_cmd_allowed(adapter, OPCODE_COMMON_GET_EXT_FAT_CAPABILITIES,
+                           CMD_SUBSYSTEM_COMMON))
+               return -EPERM;
+
        if (mutex_lock_interruptible(&adapter->mbox_lock))
                return -1;
 
@@ -4138,7 +4152,7 @@ int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter,
 
        req = cmd->va;
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                              OPCODE_COMMON_GET_EXT_FAT_CAPABILITES,
+                              OPCODE_COMMON_GET_EXT_FAT_CAPABILITIES,
                               cmd->size, wrb, cmd);
        req->parameter_type = cpu_to_le32(1);
 
@@ -4156,7 +4170,7 @@ int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
        struct be_cmd_req_set_ext_fat_caps *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4167,12 +4181,12 @@ int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
        req = cmd->va;
        memcpy(&req->set_params, configs, sizeof(struct be_fat_conf_params));
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                              OPCODE_COMMON_SET_EXT_FAT_CAPABILITES,
+                              OPCODE_COMMON_SET_EXT_FAT_CAPABILITIES,
                               cmd->size, wrb, cmd);
 
        status = be_mcc_notify_wait(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -4373,7 +4387,7 @@ err:
 }
 
 /* This routine returns a list of all the NIC PF_nums in the adapter */
-u16 be_get_nic_pf_num_list(u8 *buf, u32 desc_count, u16 *nic_pf_nums)
+static u16 be_get_nic_pf_num_list(u8 *buf, u32 desc_count, u16 *nic_pf_nums)
 {
        struct be_res_desc_hdr *hdr = (struct be_res_desc_hdr *)buf;
        struct be_pcie_res_desc *pcie = NULL;
@@ -4525,7 +4539,7 @@ static int be_cmd_set_profile_config(struct be_adapter *adapter, void *desc,
 }
 
 /* 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;
@@ -4650,7 +4664,7 @@ int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op)
        if (iface == 0xFFFFFFFF)
                return -1;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4667,7 +4681,7 @@ int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op)
 
        status = be_mcc_notify_wait(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -4701,7 +4715,7 @@ int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg,
        struct be_cmd_resp_get_iface_list *resp;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4722,7 +4736,7 @@ int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg,
        }
 
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -4816,7 +4830,7 @@ int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain)
        if (BEx_chip(adapter))
                return 0;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4834,7 +4848,7 @@ int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain)
        req->enable = 1;
        status = be_mcc_notify_wait(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -4898,14 +4912,15 @@ err:
        return status;
 }
 
-int __be_cmd_set_logical_link_config(struct be_adapter *adapter,
-                                    int link_state, int version, u8 domain)
+static int
+__be_cmd_set_logical_link_config(struct be_adapter *adapter,
+                                int link_state, int version, u8 domain)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_set_ll_link *req;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4931,7 +4946,7 @@ int __be_cmd_set_logical_link_config(struct be_adapter *adapter,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -4954,6 +4969,57 @@ int be_cmd_set_logical_link_config(struct be_adapter *adapter,
                                                          1, domain);
        return status;
 }
+
+int be_cmd_set_features(struct be_adapter *adapter)
+{
+       struct be_cmd_resp_set_features *resp;
+       struct be_cmd_req_set_features *req;
+       struct be_mcc_wrb *wrb;
+       int status;
+
+       if (mutex_lock_interruptible(&adapter->mcc_lock))
+               return -1;
+
+       wrb = wrb_from_mccq(adapter);
+       if (!wrb) {
+               status = -EBUSY;
+               goto err;
+       }
+
+       req = embedded_payload(wrb);
+
+       be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+                              OPCODE_COMMON_SET_FEATURES,
+                              sizeof(*req), wrb, NULL);
+
+       req->features = cpu_to_le32(BE_FEATURE_UE_RECOVERY);
+       req->parameter_len = cpu_to_le32(sizeof(struct be_req_ue_recovery));
+       req->parameter.req.uer = cpu_to_le32(BE_UE_RECOVERY_UER_MASK);
+
+       status = be_mcc_notify_wait(adapter);
+       if (status)
+               goto err;
+
+       resp = embedded_payload(wrb);
+
+       adapter->error_recovery.ue_to_poll_time =
+               le16_to_cpu(resp->parameter.resp.ue2rp);
+       adapter->error_recovery.ue_to_reset_time =
+               le16_to_cpu(resp->parameter.resp.ue2sr);
+       adapter->error_recovery.recovery_supported = true;
+err:
+       /* Checking "MCC_STATUS_INVALID_LENGTH" for SKH as FW
+        * returns this error in older firmware versions
+        */
+       if (base_status(status) == MCC_STATUS_ILLEGAL_REQUEST ||
+           base_status(status) == MCC_STATUS_INVALID_LENGTH)
+               dev_info(&adapter->pdev->dev,
+                        "Adapter does not support HW error recovery\n");
+
+       mutex_unlock(&adapter->mcc_lock);
+       return status;
+}
+
 int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
                    int wrb_payload_size, u16 *cmd_status, u16 *ext_status)
 {
@@ -4964,7 +5030,7 @@ int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
        struct be_cmd_resp_hdr *resp;
        int status;
 
-       spin_lock_bh(&adapter->mcc_lock);
+       mutex_lock(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4987,7 +5053,7 @@ int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
        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);
+       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 EXPORT_SYMBOL(be_roce_mcc_cmd);