Commit 855c9c0b authored by Jian Shen's avatar Jian Shen Committed by Hao Chen
Browse files

net: hns3: don't auto enable misc vector

driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAP2LZ



----------------------------------------------------------------------

Currently, there is a time window between misc irq enabled
and service task inited. If an interrupte is reported at
this time, it will cause warning like below:

[   16.324639] Call trace:
[   16.324641]  __queue_delayed_work+0xb8/0xe0
[   16.324643]  mod_delayed_work_on+0x78/0xd0
[   16.324655]  hclge_errhand_task_schedule+0x58/0x90 [hclge]
[   16.324662]  hclge_misc_irq_handle+0x168/0x240 [hclge]
[   16.324666]  __handle_irq_event_percpu+0x64/0x1e0
[   16.324667]  handle_irq_event+0x80/0x170
[   16.324670]  handle_fasteoi_edge_irq+0x110/0x2bc
[   16.324671]  __handle_domain_irq+0x84/0xfc
[   16.324673]  gic_handle_irq+0x88/0x2c0
[   16.324674]  el1_irq+0xb8/0x140
[   16.324677]  arch_cpu_idle+0x18/0x40
[   16.324679]  default_idle_call+0x5c/0x1bc
[   16.324682]  cpuidle_idle_call+0x18c/0x1c4
[   16.324684]  do_idle+0x174/0x17c
[   16.324685]  cpu_startup_entry+0x30/0x6c
[   16.324687]  secondary_start_kernel+0x1a4/0x280
[   16.324688] ---[ end trace 6aa0bff672a964aa ]---

So don't auto enable misc vector when request irq.

Fixes: 7be1b9f3 ("net: hns3: make hclge_service use delayed workqueue")
Signed-off-by: default avatarJian Shen <shenjian15@huawei.com>
Signed-off-by: default avatarXinghai Cen <cenxinghai@h-partners.com>
parent f0e063d2
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#include <linux/etherdevice.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netdevice.h>
@@ -3828,6 +3829,7 @@ static int hclge_misc_irq_init(struct hclge_dev *hdev)
	/* this would be explicitly freed in the end */
	snprintf(hdev->misc_vector.name, HNAE3_INT_NAME_LEN, "%s-misc-%s",
		 HCLGE_NAME, pci_name(hdev->pdev));
	irq_set_status_flags(hdev->misc_vector.vector_irq, IRQ_NOAUTOEN);
	ret = request_irq(hdev->misc_vector.vector_irq, hclge_misc_irq_handle,
			  0, hdev->misc_vector.name, hdev);
	if (ret) {
@@ -12585,9 +12587,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)

	hclge_init_rxd_adv_layout(hdev);

	/* Enable MISC vector(vector0) */
	hclge_enable_vector(&hdev->misc_vector, true);

	ret = hclge_init_wol(hdev);
	if (ret)
		dev_warn(&pdev->dev,
@@ -12600,6 +12599,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
	hclge_state_init(hdev);
	hdev->last_reset_time = jiffies;

	/* Enable MISC vector(vector0) */
	enable_irq(hdev->misc_vector.vector_irq);
	hclge_enable_vector(&hdev->misc_vector, true);

	dev_info(&hdev->pdev->dev, "%s driver initialization finished.\n",
		 HCLGE_DRIVER_NAME);

@@ -13007,7 +13010,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)

	/* Disable MISC vector(vector0) */
	hclge_enable_vector(&hdev->misc_vector, false);
	synchronize_irq(hdev->misc_vector.vector_irq);
	disable_irq(hdev->misc_vector.vector_irq);

	/* Disable all hw interrupts */
	hclge_config_mac_tnl_int(hdev, false);