be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink
authorNikolay Aleksandrov <razor@blackwall.org>
Thu, 27 Feb 2025 16:41:29 +0000 (18:41 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 4 Mar 2025 10:14:15 +0000 (11:14 +0100)
Partially revert commit b71724147e73 ("be2net: replace polling with
sleeping in the FW completion path") w.r.t mcc mutex it introduces and the
use of usleep_range. The be2net be_ndo_bridge_getlink() callback is
called with rcu_read_lock, so this code has been broken for a long time.
Both the mutex_lock and the usleep_range can cause the issue Ian Kumlien
reported[1]. The call path is:
be_ndo_bridge_getlink -> be_cmd_get_hsw_config -> be_mcc_notify_wait ->
be_mcc_wait_compl -> usleep_range()

[1] https://lore.kernel.org/netdev/CAA85sZveppNgEVa_FD+qhOMtG_AavK9_mFiU+jWrMtXmwqefGA@mail.gmail.com/

Tested-by: Ian Kumlien <ian.kumlien@gmail.com>
Fixes: b71724147e73 ("be2net: replace polling with sleeping in the FW completion path")
Signed-off-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/20250227164129.1201164-1-razor@blackwall.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/emulex/benet/be.h
drivers/net/ethernet/emulex/benet/be_cmds.c
drivers/net/ethernet/emulex/benet/be_main.c

index e48b861e4ce15d5af602a6405175f4c97d9a2f89..270ff9aab3352ba8dd5e05e878b480cd08d8ac9f 100644 (file)
@@ -562,7 +562,7 @@ struct be_adapter {
        struct be_dma_mem mbox_mem_alloced;
 
        struct be_mcc_obj mcc_obj;
-       struct mutex mcc_lock;  /* For serializing mcc cmds to BE card */
+       spinlock_t mcc_lock;    /* For serializing mcc cmds to BE card */
        spinlock_t mcc_cq_lock;
 
        u16 cfg_num_rx_irqs;            /* configured via set-channels */
index 61adcebeef0107d5f899d3c2cc1b82739f219d31..51b8377edd1d04250d879fe78d9afd2774acc6f4 100644 (file)
@@ -575,7 +575,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            12000 /* 12s timeout */
+#define mcc_timeout            120000 /* 12s timeout */
        int i, status = 0;
        struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
 
@@ -589,7 +589,7 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
 
                if (atomic_read(&mcc_obj->q.used) == 0)
                        break;
-               usleep_range(500, 1000);
+               udelay(100);
        }
        if (i == mcc_timeout) {
                dev_err(&adapter->pdev->dev, "FW not responding\n");
@@ -866,7 +866,7 @@ static bool use_mcc(struct be_adapter *adapter)
 static int be_cmd_lock(struct be_adapter *adapter)
 {
        if (use_mcc(adapter)) {
-               mutex_lock(&adapter->mcc_lock);
+               spin_lock_bh(&adapter->mcc_lock);
                return 0;
        } else {
                return mutex_lock_interruptible(&adapter->mbox_lock);
@@ -877,7 +877,7 @@ static int be_cmd_lock(struct be_adapter *adapter)
 static void be_cmd_unlock(struct be_adapter *adapter)
 {
        if (use_mcc(adapter))
-               return mutex_unlock(&adapter->mcc_lock);
+               return spin_unlock_bh(&adapter->mcc_lock);
        else
                return mutex_unlock(&adapter->mbox_lock);
 }
@@ -1047,7 +1047,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
        struct be_cmd_req_mac_query *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1076,7 +1076,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1088,7 +1088,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, const u8 *mac_addr,
        struct be_cmd_req_pmac_add *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1113,7 +1113,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, const u8 *mac_addr,
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
 
        if (base_status(status) == MCC_STATUS_UNAUTHORIZED_REQUEST)
                status = -EPERM;
@@ -1131,7 +1131,7 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, int pmac_id, u32 dom)
        if (pmac_id == -1)
                return 0;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1151,7 +1151,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:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1414,7 +1414,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
        struct be_dma_mem *q_mem = &rxq->dma_mem;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1444,7 +1444,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1508,7 +1508,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
        struct be_cmd_req_q_destroy *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1525,7 +1525,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
        q->created = false;
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1593,7 +1593,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;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1621,7 +1621,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
        adapter->stats_cmd_sent = true;
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1637,7 +1637,7 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
                            CMD_SUBSYSTEM_ETH))
                return -EPERM;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1660,7 +1660,7 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
        adapter->stats_cmd_sent = true;
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1697,7 +1697,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
        struct be_cmd_req_link_status *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        if (link_status)
                *link_status = LINK_DOWN;
@@ -1736,7 +1736,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1747,7 +1747,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
        struct be_cmd_req_get_cntl_addnl_attribs *req;
        int status = 0;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1762,7 +1762,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
 
        status = be_mcc_notify(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1811,7 +1811,7 @@ int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf)
        if (!get_fat_cmd.va)
                return -ENOMEM;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        while (total_size) {
                buf_size = min(total_size, (u32)60 * 1024);
@@ -1849,9 +1849,9 @@ int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf)
                log_offset += buf_size;
        }
 err:
+       spin_unlock_bh(&adapter->mcc_lock);
        dma_free_coherent(&adapter->pdev->dev, get_fat_cmd.size,
                          get_fat_cmd.va, get_fat_cmd.dma);
-       mutex_unlock(&adapter->mcc_lock);
        return status;
 }
 
@@ -1862,7 +1862,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter)
        struct be_cmd_req_get_fw_version *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1885,7 +1885,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter)
                        sizeof(adapter->fw_on_flash));
        }
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1899,7 +1899,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter,
        struct be_cmd_req_modify_eq_delay *req;
        int status = 0, i;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1922,7 +1922,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter,
 
        status = be_mcc_notify(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1949,7 +1949,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;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -1971,7 +1971,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1982,7 +1982,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;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2015,7 +2015,7 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
 
        status = be_mcc_notify_wait(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -2046,7 +2046,7 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
                            CMD_SUBSYSTEM_COMMON))
                return -EPERM;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2066,7 +2066,7 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
        status = be_mcc_notify_wait(adapter);
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
 
        if (base_status(status) == MCC_STATUS_FEATURE_NOT_SUPPORTED)
                return  -EOPNOTSUPP;
@@ -2085,7 +2085,7 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
                            CMD_SUBSYSTEM_COMMON))
                return -EPERM;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2108,7 +2108,7 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -2189,7 +2189,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
        if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS))
                return 0;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2214,7 +2214,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -2226,7 +2226,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
        struct be_cmd_req_enable_disable_beacon *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2247,7 +2247,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
        status = be_mcc_notify_wait(adapter);
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -2258,7 +2258,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;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2282,7 +2282,7 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -2306,7 +2306,7 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter,
                return -ENOMEM;
        }
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2328,7 +2328,7 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter,
                memcpy(data, resp->page_data + off, len);
        }
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
        return status;
 }
@@ -2345,7 +2345,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
        void *ctxt = NULL;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
        adapter->flash_status = 0;
 
        wrb = wrb_from_mccq(adapter);
@@ -2387,7 +2387,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
        if (status)
                goto err_unlock;
 
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
 
        if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
                                         msecs_to_jiffies(60000)))
@@ -2406,7 +2406,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
        return status;
 
 err_unlock:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -2460,7 +2460,7 @@ static int lancer_cmd_delete_object(struct be_adapter *adapter,
        struct be_mcc_wrb *wrb;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2478,7 +2478,7 @@ static int lancer_cmd_delete_object(struct be_adapter *adapter,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -2491,7 +2491,7 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
        struct lancer_cmd_resp_read_object *resp;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2525,7 +2525,7 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
        }
 
 err_unlock:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -2537,7 +2537,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
        struct be_cmd_write_flashrom *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
        adapter->flash_status = 0;
 
        wrb = wrb_from_mccq(adapter);
@@ -2562,7 +2562,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
        if (status)
                goto err_unlock;
 
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
 
        if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
                                         msecs_to_jiffies(40000)))
@@ -2573,7 +2573,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
        return status;
 
 err_unlock:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -2584,7 +2584,7 @@ static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
        struct be_mcc_wrb *wrb;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -2611,7 +2611,7 @@ static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
                memcpy(flashed_crc, req->crc, 4);
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3217,7 +3217,7 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
        struct be_cmd_req_acpi_wol_magic_config *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3234,7 +3234,7 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
        status = be_mcc_notify_wait(adapter);
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3249,7 +3249,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
                            CMD_SUBSYSTEM_LOWLEVEL))
                return -EPERM;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3272,7 +3272,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
        if (status)
                goto err_unlock;
 
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
 
        if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
                                         msecs_to_jiffies(SET_LB_MODE_TIMEOUT)))
@@ -3281,7 +3281,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
        return status;
 
 err_unlock:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3298,7 +3298,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
                            CMD_SUBSYSTEM_LOWLEVEL))
                return -EPERM;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3324,7 +3324,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
        if (status)
                goto err;
 
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
 
        wait_for_completion(&adapter->et_cmd_compl);
        resp = embedded_payload(wrb);
@@ -3332,7 +3332,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
 
        return status;
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3348,7 +3348,7 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
                            CMD_SUBSYSTEM_LOWLEVEL))
                return -EPERM;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3382,7 +3382,7 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3393,7 +3393,7 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
        struct be_cmd_req_seeprom_read *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3409,7 +3409,7 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
        status = be_mcc_notify_wait(adapter);
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3424,7 +3424,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
                            CMD_SUBSYSTEM_COMMON))
                return -EPERM;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3469,7 +3469,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
        }
        dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3479,7 +3479,7 @@ static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
        struct be_cmd_req_set_qos *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3499,7 +3499,7 @@ static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
        status = be_mcc_notify_wait(adapter);
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3611,7 +3611,7 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
        struct be_cmd_req_get_fn_privileges *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3643,7 +3643,7 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3655,7 +3655,7 @@ int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
        struct be_cmd_req_set_fn_privileges *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3675,7 +3675,7 @@ int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3707,7 +3707,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
                return -ENOMEM;
        }
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3771,7 +3771,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
        }
 
 out:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&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;
@@ -3831,7 +3831,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
        if (!cmd.va)
                return -ENOMEM;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3853,7 +3853,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);
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3889,7 +3889,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
                            CMD_SUBSYSTEM_COMMON))
                return -EPERM;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3930,7 +3930,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
        status = be_mcc_notify_wait(adapter);
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -3944,7 +3944,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
        int status;
        u16 vid;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -3991,7 +3991,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -4190,7 +4190,7 @@ int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
        struct be_cmd_req_set_ext_fat_caps *req;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4206,7 +4206,7 @@ int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -4684,7 +4684,7 @@ int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op)
        if (iface == 0xFFFFFFFF)
                return -1;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4701,7 +4701,7 @@ int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op)
 
        status = be_mcc_notify_wait(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -4735,7 +4735,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;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4756,7 +4756,7 @@ int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg,
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -4850,7 +4850,7 @@ int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain)
        if (BEx_chip(adapter))
                return 0;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4868,7 +4868,7 @@ int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain)
        req->enable = 1;
        status = be_mcc_notify_wait(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -4941,7 +4941,7 @@ __be_cmd_set_logical_link_config(struct be_adapter *adapter,
        u32 link_config = 0;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -4969,7 +4969,7 @@ __be_cmd_set_logical_link_config(struct be_adapter *adapter,
 
        status = be_mcc_notify_wait(adapter);
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -5000,8 +5000,7 @@ int be_cmd_set_features(struct be_adapter *adapter)
        struct be_mcc_wrb *wrb;
        int status;
 
-       if (mutex_lock_interruptible(&adapter->mcc_lock))
-               return -1;
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -5039,7 +5038,7 @@ err:
                dev_info(&adapter->pdev->dev,
                         "Adapter does not support HW error recovery\n");
 
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -5053,7 +5052,7 @@ int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
        struct be_cmd_resp_hdr *resp;
        int status;
 
-       mutex_lock(&adapter->mcc_lock);
+       spin_lock_bh(&adapter->mcc_lock);
 
        wrb = wrb_from_mccq(adapter);
        if (!wrb) {
@@ -5076,7 +5075,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:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 EXPORT_SYMBOL(be_roce_mcc_cmd);
index 875fe379eea213abcb69de189602bcacbcaa6f56..3d2e215921191769094356fbea820eece091ddf2 100644 (file)
@@ -5667,8 +5667,8 @@ static int be_drv_init(struct be_adapter *adapter)
        }
 
        mutex_init(&adapter->mbox_lock);
-       mutex_init(&adapter->mcc_lock);
        mutex_init(&adapter->rx_filter_lock);
+       spin_lock_init(&adapter->mcc_lock);
        spin_lock_init(&adapter->mcc_cq_lock);
        init_completion(&adapter->et_cmd_compl);