aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c13
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c3
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c23
3 files changed, 36 insertions, 3 deletions
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
index 2a801344eafb..d318d35e598f 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -2557,6 +2557,15 @@ static void hclge_clear_event_cause(struct hclge_dev *hdev, u32 event_type,
2557 } 2557 }
2558} 2558}
2559 2559
2560static void hclge_clear_all_event_cause(struct hclge_dev *hdev)
2561{
2562 hclge_clear_event_cause(hdev, HCLGE_VECTOR0_EVENT_RST,
2563 BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B) |
2564 BIT(HCLGE_VECTOR0_CORERESET_INT_B) |
2565 BIT(HCLGE_VECTOR0_IMPRESET_INT_B));
2566 hclge_clear_event_cause(hdev, HCLGE_VECTOR0_EVENT_MBX, 0);
2567}
2568
2560static void hclge_enable_vector(struct hclge_misc_vector *vector, bool enable) 2569static void hclge_enable_vector(struct hclge_misc_vector *vector, bool enable)
2561{ 2570{
2562 writel(enable ? 1 : 0, vector->addr); 2571 writel(enable ? 1 : 0, vector->addr);
@@ -5688,6 +5697,8 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
5688 INIT_WORK(&hdev->rst_service_task, hclge_reset_service_task); 5697 INIT_WORK(&hdev->rst_service_task, hclge_reset_service_task);
5689 INIT_WORK(&hdev->mbx_service_task, hclge_mailbox_service_task); 5698 INIT_WORK(&hdev->mbx_service_task, hclge_mailbox_service_task);
5690 5699
5700 hclge_clear_all_event_cause(hdev);
5701
5691 /* Enable MISC vector(vector0) */ 5702 /* Enable MISC vector(vector0) */
5692 hclge_enable_vector(&hdev->misc_vector, true); 5703 hclge_enable_vector(&hdev->misc_vector, true);
5693 5704
@@ -5817,6 +5828,8 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
5817 5828
5818 /* Disable MISC vector(vector0) */ 5829 /* Disable MISC vector(vector0) */
5819 hclge_enable_vector(&hdev->misc_vector, false); 5830 hclge_enable_vector(&hdev->misc_vector, false);
5831 synchronize_irq(hdev->misc_vector.vector_irq);
5832
5820 hclge_destroy_cmd_queue(&hdev->hw); 5833 hclge_destroy_cmd_queue(&hdev->hw);
5821 hclge_misc_irq_uninit(hdev); 5834 hclge_misc_irq_uninit(hdev);
5822 hclge_pci_uninit(hdev); 5835 hclge_pci_uninit(hdev);
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
index bc8a5760d959..a17872aab168 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
@@ -1565,6 +1565,8 @@ static int hclgevf_misc_irq_init(struct hclgevf_dev *hdev)
1565 return ret; 1565 return ret;
1566 } 1566 }
1567 1567
1568 hclgevf_clear_event_cause(hdev, 0);
1569
1568 /* enable misc. vector(vector 0) */ 1570 /* enable misc. vector(vector 0) */
1569 hclgevf_enable_vector(&hdev->misc_vector, true); 1571 hclgevf_enable_vector(&hdev->misc_vector, true);
1570 1572
@@ -1575,6 +1577,7 @@ static void hclgevf_misc_irq_uninit(struct hclgevf_dev *hdev)
1575{ 1577{
1576 /* disable misc vector(vector 0) */ 1578 /* disable misc vector(vector 0) */
1577 hclgevf_enable_vector(&hdev->misc_vector, false); 1579 hclgevf_enable_vector(&hdev->misc_vector, false);
1580 synchronize_irq(hdev->misc_vector.vector_irq);
1578 free_irq(hdev->misc_vector.vector_irq, hdev); 1581 free_irq(hdev->misc_vector.vector_irq, hdev);
1579 hclgevf_free_vector(hdev, 0); 1582 hclgevf_free_vector(hdev, 0);
1580} 1583}
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
index a28618428338..b598c06af8e0 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
@@ -126,6 +126,13 @@ int hclgevf_send_mbx_msg(struct hclgevf_dev *hdev, u16 code, u16 subcode,
126 return status; 126 return status;
127} 127}
128 128
129static bool hclgevf_cmd_crq_empty(struct hclgevf_hw *hw)
130{
131 u32 tail = hclgevf_read_dev(hw, HCLGEVF_NIC_CRQ_TAIL_REG);
132
133 return tail == hw->cmq.crq.next_to_use;
134}
135
129void hclgevf_mbx_handler(struct hclgevf_dev *hdev) 136void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
130{ 137{
131 struct hclgevf_mbx_resp_status *resp; 138 struct hclgevf_mbx_resp_status *resp;
@@ -140,11 +147,22 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
140 resp = &hdev->mbx_resp; 147 resp = &hdev->mbx_resp;
141 crq = &hdev->hw.cmq.crq; 148 crq = &hdev->hw.cmq.crq;
142 149
143 flag = le16_to_cpu(crq->desc[crq->next_to_use].flag); 150 while (!hclgevf_cmd_crq_empty(&hdev->hw)) {
144 while (hnae_get_bit(flag, HCLGEVF_CMDQ_RX_OUTVLD_B)) {
145 desc = &crq->desc[crq->next_to_use]; 151 desc = &crq->desc[crq->next_to_use];
146 req = (struct hclge_mbx_pf_to_vf_cmd *)desc->data; 152 req = (struct hclge_mbx_pf_to_vf_cmd *)desc->data;
147 153
154 flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
155 if (unlikely(!hnae_get_bit(flag, HCLGEVF_CMDQ_RX_OUTVLD_B))) {
156 dev_warn(&hdev->pdev->dev,
157 "dropped invalid mailbox message, code = %d\n",
158 req->msg[0]);
159
160 /* dropping/not processing this invalid message */
161 crq->desc[crq->next_to_use].flag = 0;
162 hclge_mbx_ring_ptr_move_crq(crq);
163 continue;
164 }
165
148 /* synchronous messages are time critical and need preferential 166 /* synchronous messages are time critical and need preferential
149 * treatment. Therefore, we need to acknowledge all the sync 167 * treatment. Therefore, we need to acknowledge all the sync
150 * responses as quickly as possible so that waiting tasks do not 168 * responses as quickly as possible so that waiting tasks do not
@@ -205,7 +223,6 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
205 } 223 }
206 crq->desc[crq->next_to_use].flag = 0; 224 crq->desc[crq->next_to_use].flag = 0;
207 hclge_mbx_ring_ptr_move_crq(crq); 225 hclge_mbx_ring_ptr_move_crq(crq);
208 flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
209 } 226 }
210 227
211 /* Write back CMDQ_RQ header pointer, M7 need this pointer */ 228 /* Write back CMDQ_RQ header pointer, M7 need this pointer */