net/hns3: fix mailbox response length
[dpdk.git] / drivers / net / hns3 / hns3_mbx.c
index c03e71d..c1647af 100644 (file)
@@ -24,7 +24,6 @@
 #include "hns3_logs.h"
 #include "hns3_intr.h"
 
-#define HNS3_REG_MSG_DATA_OFFSET       4
 #define HNS3_CMD_CODE_OFFSET           2
 
 static const struct errno_respcode_map err_code_map[] = {
@@ -81,6 +80,7 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code0, uint16_t code1,
                  uint8_t *resp_data, uint16_t resp_len)
 {
 #define HNS3_MAX_RETRY_MS      500
+       struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
        struct hns3_mbx_resp_status *mbx_resp;
        bool in_irq = false;
        uint64_t now;
@@ -96,6 +96,19 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code0, uint16_t code1,
        end = now + HNS3_MAX_RETRY_MS;
        while ((hw->mbx_resp.head != hw->mbx_resp.tail + hw->mbx_resp.lost) &&
               (now < end)) {
+               if (rte_atomic16_read(&hw->reset.disable_cmd)) {
+                       hns3_err(hw, "Don't wait for mbx respone because of "
+                                "disable_cmd");
+                       return -EBUSY;
+               }
+
+               if (is_reset_pending(hns)) {
+                       hw->mbx_resp.req_msg_data = 0;
+                       hns3_err(hw, "Don't wait for mbx respone because of "
+                                "reset pending");
+                       return -EIO;
+               }
+
                /*
                 * The mbox response is running on the interrupt thread.
                 * Sending mbox in the interrupt thread cannot wait for the
@@ -224,6 +237,7 @@ hns3_mbx_handler(struct hns3_hw *hw)
 
                        hns3_warn(hw, "PF inform reset level %d", reset_level);
                        hw->reset.stats.request_cnt++;
+                       hns3_schedule_reset(HNS3_DEV_HW_TO_ADAPTER(hw));
                        break;
                default:
                        hns3_err(hw, "Fetched unsupported(%d) message from arq",
@@ -305,8 +319,7 @@ hns3_dev_handle_mbx_msg(struct hns3_hw *hw)
                        resp->resp_status = hns3_resp_to_errno(req->msg[3]);
 
                        temp = (uint8_t *)&req->msg[4];
-                       for (i = 0; i < HNS3_MBX_MAX_RESP_DATA_SIZE &&
-                            i < HNS3_REG_MSG_DATA_OFFSET; i++) {
+                       for (i = 0; i < HNS3_MBX_MAX_RESP_DATA_SIZE; i++) {
                                resp->additional_info[i] = *temp;
                                temp++;
                        }