diff options
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 | ||
2560 | static 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 | |||
2560 | static void hclge_enable_vector(struct hclge_misc_vector *vector, bool enable) | 2569 | static 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 | ||
129 | static 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 | |||
129 | void hclgevf_mbx_handler(struct hclgevf_dev *hdev) | 136 | void 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 */ |