Merge branch 'hns3-next'
Salil Mehta says: ==================== Bug fixes & optimization for HNS3 Driver This patch-set presents miscellaneous bug fixes and an optimization for HNS3 driver V1->V2: * Fixes the compilation break reported by David Miller & Kbuild ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
96a3c9a489
|
@ -2557,6 +2557,15 @@ static void hclge_clear_event_cause(struct hclge_dev *hdev, u32 event_type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hclge_clear_all_event_cause(struct hclge_dev *hdev)
|
||||||
|
{
|
||||||
|
hclge_clear_event_cause(hdev, HCLGE_VECTOR0_EVENT_RST,
|
||||||
|
BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B) |
|
||||||
|
BIT(HCLGE_VECTOR0_CORERESET_INT_B) |
|
||||||
|
BIT(HCLGE_VECTOR0_IMPRESET_INT_B));
|
||||||
|
hclge_clear_event_cause(hdev, HCLGE_VECTOR0_EVENT_MBX, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void hclge_enable_vector(struct hclge_misc_vector *vector, bool enable)
|
static void hclge_enable_vector(struct hclge_misc_vector *vector, bool enable)
|
||||||
{
|
{
|
||||||
writel(enable ? 1 : 0, vector->addr);
|
writel(enable ? 1 : 0, vector->addr);
|
||||||
|
@ -5688,6 +5697,8 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||||
INIT_WORK(&hdev->rst_service_task, hclge_reset_service_task);
|
INIT_WORK(&hdev->rst_service_task, hclge_reset_service_task);
|
||||||
INIT_WORK(&hdev->mbx_service_task, hclge_mailbox_service_task);
|
INIT_WORK(&hdev->mbx_service_task, hclge_mailbox_service_task);
|
||||||
|
|
||||||
|
hclge_clear_all_event_cause(hdev);
|
||||||
|
|
||||||
/* Enable MISC vector(vector0) */
|
/* Enable MISC vector(vector0) */
|
||||||
hclge_enable_vector(&hdev->misc_vector, true);
|
hclge_enable_vector(&hdev->misc_vector, true);
|
||||||
|
|
||||||
|
@ -5817,6 +5828,8 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
|
||||||
|
|
||||||
/* Disable MISC vector(vector0) */
|
/* Disable MISC vector(vector0) */
|
||||||
hclge_enable_vector(&hdev->misc_vector, false);
|
hclge_enable_vector(&hdev->misc_vector, false);
|
||||||
|
synchronize_irq(hdev->misc_vector.vector_irq);
|
||||||
|
|
||||||
hclge_destroy_cmd_queue(&hdev->hw);
|
hclge_destroy_cmd_queue(&hdev->hw);
|
||||||
hclge_misc_irq_uninit(hdev);
|
hclge_misc_irq_uninit(hdev);
|
||||||
hclge_pci_uninit(hdev);
|
hclge_pci_uninit(hdev);
|
||||||
|
|
|
@ -1565,6 +1565,8 @@ static int hclgevf_misc_irq_init(struct hclgevf_dev *hdev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hclgevf_clear_event_cause(hdev, 0);
|
||||||
|
|
||||||
/* enable misc. vector(vector 0) */
|
/* enable misc. vector(vector 0) */
|
||||||
hclgevf_enable_vector(&hdev->misc_vector, true);
|
hclgevf_enable_vector(&hdev->misc_vector, true);
|
||||||
|
|
||||||
|
@ -1575,6 +1577,7 @@ static void hclgevf_misc_irq_uninit(struct hclgevf_dev *hdev)
|
||||||
{
|
{
|
||||||
/* disable misc vector(vector 0) */
|
/* disable misc vector(vector 0) */
|
||||||
hclgevf_enable_vector(&hdev->misc_vector, false);
|
hclgevf_enable_vector(&hdev->misc_vector, false);
|
||||||
|
synchronize_irq(hdev->misc_vector.vector_irq);
|
||||||
free_irq(hdev->misc_vector.vector_irq, hdev);
|
free_irq(hdev->misc_vector.vector_irq, hdev);
|
||||||
hclgevf_free_vector(hdev, 0);
|
hclgevf_free_vector(hdev, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,6 +126,13 @@ int hclgevf_send_mbx_msg(struct hclgevf_dev *hdev, u16 code, u16 subcode,
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool hclgevf_cmd_crq_empty(struct hclgevf_hw *hw)
|
||||||
|
{
|
||||||
|
u32 tail = hclgevf_read_dev(hw, HCLGEVF_NIC_CRQ_TAIL_REG);
|
||||||
|
|
||||||
|
return tail == hw->cmq.crq.next_to_use;
|
||||||
|
}
|
||||||
|
|
||||||
void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
|
void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
|
||||||
{
|
{
|
||||||
struct hclgevf_mbx_resp_status *resp;
|
struct hclgevf_mbx_resp_status *resp;
|
||||||
|
@ -140,11 +147,22 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
|
||||||
resp = &hdev->mbx_resp;
|
resp = &hdev->mbx_resp;
|
||||||
crq = &hdev->hw.cmq.crq;
|
crq = &hdev->hw.cmq.crq;
|
||||||
|
|
||||||
flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
|
while (!hclgevf_cmd_crq_empty(&hdev->hw)) {
|
||||||
while (hnae_get_bit(flag, HCLGEVF_CMDQ_RX_OUTVLD_B)) {
|
|
||||||
desc = &crq->desc[crq->next_to_use];
|
desc = &crq->desc[crq->next_to_use];
|
||||||
req = (struct hclge_mbx_pf_to_vf_cmd *)desc->data;
|
req = (struct hclge_mbx_pf_to_vf_cmd *)desc->data;
|
||||||
|
|
||||||
|
flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
|
||||||
|
if (unlikely(!hnae_get_bit(flag, HCLGEVF_CMDQ_RX_OUTVLD_B))) {
|
||||||
|
dev_warn(&hdev->pdev->dev,
|
||||||
|
"dropped invalid mailbox message, code = %d\n",
|
||||||
|
req->msg[0]);
|
||||||
|
|
||||||
|
/* dropping/not processing this invalid message */
|
||||||
|
crq->desc[crq->next_to_use].flag = 0;
|
||||||
|
hclge_mbx_ring_ptr_move_crq(crq);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* synchronous messages are time critical and need preferential
|
/* synchronous messages are time critical and need preferential
|
||||||
* treatment. Therefore, we need to acknowledge all the sync
|
* treatment. Therefore, we need to acknowledge all the sync
|
||||||
* responses as quickly as possible so that waiting tasks do not
|
* responses as quickly as possible so that waiting tasks do not
|
||||||
|
@ -205,7 +223,6 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
|
||||||
}
|
}
|
||||||
crq->desc[crq->next_to_use].flag = 0;
|
crq->desc[crq->next_to_use].flag = 0;
|
||||||
hclge_mbx_ring_ptr_move_crq(crq);
|
hclge_mbx_ring_ptr_move_crq(crq);
|
||||||
flag = le16_to_cpu(crq->desc[crq->next_to_use].flag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write back CMDQ_RQ header pointer, M7 need this pointer */
|
/* Write back CMDQ_RQ header pointer, M7 need this pointer */
|
||||||
|
|
Loading…
Reference in New Issue