]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Mar 2025 11:47:39 +0000 (12:47 +0100)
[ Upstream commit 1a82d19ca2d6835904ee71e2d40fd331098f94a0 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/emulex/benet/be.h
drivers/net/ethernet/emulex/benet/be_cmds.c
drivers/net/ethernet/emulex/benet/be_main.c

index 8689d4a51fe541a75949e79c8a646f9de7db8de3..6e44000bddf1eac5c478ad16c6aac83f8e87115b 100644 (file)
@@ -563,7 +563,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 1288b5e3d2201895db50d2329c987810b5f42d9c..9812a9a5d033bda20a5deea02a31ad4aaa7b7e5e 100644 (file)
@@ -573,7 +573,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;
 
@@ -587,7 +587,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");
@@ -865,7 +865,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);
@@ -876,7 +876,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);
 }
@@ -1046,7 +1046,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) {
@@ -1075,7 +1075,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;
 }
 
@@ -1087,7 +1087,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, 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) {
@@ -1112,7 +1112,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, 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;
@@ -1130,7 +1130,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) {
@@ -1150,7 +1150,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;
 }
 
@@ -1413,7 +1413,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) {
@@ -1443,7 +1443,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
        }
 
 err:
-       mutex_unlock(&adapter->mcc_lock);
+       spin_unlock_bh(&adapter->mcc_lock);
        return status;
 }
 
@@ -1507,7 +1507,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) {
@@ -1524,7 +1524,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;
 }
 
@@ -1592,7 +1592,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) {
@@ -1620,7 +1620,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;
 }
 
@@ -1636,7 +1636,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) {
@@ -1659,7 +1659,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;
 }
 
@@ -1696,7 +1696,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;
@@ -1735,7 +1735,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;
 }
 
@@ -1746,7 +1746,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) {
@@ -1761,7 +1761,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;
 }
 
@@ -1810,7 +1810,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);
@@ -1848,9 +1848,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;
 }
 
@@ -1861,7 +1861,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) {
@@ -1884,7 +1884,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;
 }
 
@@ -1898,7 +1898,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) {
@@ -1921,7 +1921,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;
 }
 
@@ -1948,7 +1948,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) {
@@ -1970,7 +1970,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;
 }
 
@@ -1981,7 +1981,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) {
@@ -2014,7 +2014,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;
 }
 
@@ -2045,7 +2045,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) {
@@ -2065,7 +2065,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;
@@ -2084,7 +2084,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) {
@@ -2107,7 +2107,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;
 }
 
@@ -2188,7 +2188,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) {
@@ -2213,7 +2213,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;
 }
 
@@ -2225,7 +2225,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) {
@@ -2246,7 +2246,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;
 }
 
@@ -2257,7 +2257,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) {
@@ -2281,7 +2281,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;
 }
 
@@ -2305,7 +2305,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) {
@@ -2327,7 +2327,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;
 }
@@ -2344,7 +2344,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);
@@ -2386,7 +2386,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)))
@@ -2405,7 +2405,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;
 }
 
@@ -2459,7 +2459,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) {
@@ -2477,7 +2477,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;
 }
 
@@ -2490,7 +2490,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) {
@@ -2524,7 +2524,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;
 }
 
@@ -2536,7 +2536,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);
@@ -2561,7 +2561,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)))
@@ -2572,7 +2572,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;
 }
 
@@ -2583,7 +2583,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) {
@@ -2610,7 +2610,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;
 }
 
@@ -3216,7 +3216,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) {
@@ -3233,7 +3233,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;
 }
 
@@ -3248,7 +3248,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) {
@@ -3271,7 +3271,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)))
@@ -3280,7 +3280,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;
 }
 
@@ -3297,7 +3297,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) {
@@ -3323,7 +3323,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);
@@ -3331,7 +3331,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;
 }
 
@@ -3347,7 +3347,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) {
@@ -3381,7 +3381,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;
 }
 
@@ -3392,7 +3392,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) {
@@ -3408,7 +3408,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;
 }
 
@@ -3423,7 +3423,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) {
@@ -3468,7 +3468,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;
 }
 
@@ -3478,7 +3478,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) {
@@ -3498,7 +3498,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;
 }
 
@@ -3610,7 +3610,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) {
@@ -3642,7 +3642,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;
 }
 
@@ -3654,7 +3654,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) {
@@ -3674,7 +3674,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;
 }
 
@@ -3706,7 +3706,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) {
@@ -3770,7 +3770,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;
@@ -3830,7 +3830,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) {
@@ -3852,7 +3852,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;
 }
 
@@ -3888,7 +3888,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) {
@@ -3929,7 +3929,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;
 }
 
@@ -3943,7 +3943,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) {
@@ -3990,7 +3990,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;
 }
 
@@ -4189,7 +4189,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) {
@@ -4205,7 +4205,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;
 }
 
@@ -4683,7 +4683,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) {
@@ -4700,7 +4700,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;
 }
 
@@ -4734,7 +4734,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) {
@@ -4755,7 +4755,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;
 }
 
@@ -4849,7 +4849,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) {
@@ -4867,7 +4867,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;
 }
 
@@ -4940,7 +4940,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) {
@@ -4968,7 +4968,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;
 }
 
@@ -4999,8 +4999,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) {
@@ -5038,7 +5037,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;
 }
 
@@ -5052,7 +5051,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) {
@@ -5075,7 +5074,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 f018379d13509c803cad6aaaecbdccdfa6ff3489..ff3ea24d2e3f9a035fd94e4523b58f036d10e09d 100644 (file)
@@ -5681,8 +5681,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);