66#include <linux/etherdevice.h>
77#include <linux/init.h>
88#include <linux/interrupt.h>
9+ #include <linux/irq.h>
910#include <linux/kernel.h>
1011#include <linux/module.h>
1112#include <linux/netdevice.h>
@@ -3584,6 +3585,17 @@ static int hclge_set_vf_link_state(struct hnae3_handle *handle, int vf,
35843585 return ret ;
35853586}
35863587
3588+ static void hclge_set_reset_pending (struct hclge_dev * hdev ,
3589+ enum hnae3_reset_type reset_type )
3590+ {
3591+ /* When an incorrect reset type is executed, the get_reset_level
3592+ * function generates the HNAE3_NONE_RESET flag. As a result, this
3593+ * type do not need to pending.
3594+ */
3595+ if (reset_type != HNAE3_NONE_RESET )
3596+ set_bit (reset_type , & hdev -> reset_pending );
3597+ }
3598+
35873599static u32 hclge_check_event_cause (struct hclge_dev * hdev , u32 * clearval )
35883600{
35893601 u32 cmdq_src_reg , msix_src_reg , hw_err_src_reg ;
@@ -3604,7 +3616,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
36043616 */
36053617 if (BIT (HCLGE_VECTOR0_IMPRESET_INT_B ) & msix_src_reg ) {
36063618 dev_info (& hdev -> pdev -> dev , "IMP reset interrupt\n" );
3607- set_bit ( HNAE3_IMP_RESET , & hdev -> reset_pending );
3619+ hclge_set_reset_pending ( hdev , HNAE3_IMP_RESET );
36083620 set_bit (HCLGE_COMM_STATE_CMD_DISABLE , & hdev -> hw .hw .comm_state );
36093621 * clearval = BIT (HCLGE_VECTOR0_IMPRESET_INT_B );
36103622 hdev -> rst_stats .imp_rst_cnt ++ ;
@@ -3614,7 +3626,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
36143626 if (BIT (HCLGE_VECTOR0_GLOBALRESET_INT_B ) & msix_src_reg ) {
36153627 dev_info (& hdev -> pdev -> dev , "global reset interrupt\n" );
36163628 set_bit (HCLGE_COMM_STATE_CMD_DISABLE , & hdev -> hw .hw .comm_state );
3617- set_bit ( HNAE3_GLOBAL_RESET , & hdev -> reset_pending );
3629+ hclge_set_reset_pending ( hdev , HNAE3_GLOBAL_RESET );
36183630 * clearval = BIT (HCLGE_VECTOR0_GLOBALRESET_INT_B );
36193631 hdev -> rst_stats .global_rst_cnt ++ ;
36203632 return HCLGE_VECTOR0_EVENT_RST ;
@@ -3769,7 +3781,7 @@ static int hclge_misc_irq_init(struct hclge_dev *hdev)
37693781 snprintf (hdev -> misc_vector .name , HNAE3_INT_NAME_LEN , "%s-misc-%s" ,
37703782 HCLGE_NAME , pci_name (hdev -> pdev ));
37713783 ret = request_irq (hdev -> misc_vector .vector_irq , hclge_misc_irq_handle ,
3772- 0 , hdev -> misc_vector .name , hdev );
3784+ IRQ_NOAUTOEN , hdev -> misc_vector .name , hdev );
37733785 if (ret ) {
37743786 hclge_free_vector (hdev , 0 );
37753787 dev_err (& hdev -> pdev -> dev , "request misc irq(%d) fail\n" ,
@@ -4062,7 +4074,7 @@ static void hclge_do_reset(struct hclge_dev *hdev)
40624074 case HNAE3_FUNC_RESET :
40634075 dev_info (& pdev -> dev , "PF reset requested\n" );
40644076 /* schedule again to check later */
4065- set_bit ( HNAE3_FUNC_RESET , & hdev -> reset_pending );
4077+ hclge_set_reset_pending ( hdev , HNAE3_FUNC_RESET );
40664078 hclge_reset_task_schedule (hdev );
40674079 break ;
40684080 default :
@@ -4096,6 +4108,8 @@ static enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,
40964108 clear_bit (HNAE3_FLR_RESET , addr );
40974109 }
40984110
4111+ clear_bit (HNAE3_NONE_RESET , addr );
4112+
40994113 if (hdev -> reset_type != HNAE3_NONE_RESET &&
41004114 rst_level < hdev -> reset_type )
41014115 return HNAE3_NONE_RESET ;
@@ -4237,7 +4251,7 @@ static bool hclge_reset_err_handle(struct hclge_dev *hdev)
42374251 return false;
42384252 } else if (hdev -> rst_stats .reset_fail_cnt < MAX_RESET_FAIL_CNT ) {
42394253 hdev -> rst_stats .reset_fail_cnt ++ ;
4240- set_bit (hdev -> reset_type , & hdev -> reset_pending );
4254+ hclge_set_reset_pending (hdev , hdev -> reset_type );
42414255 dev_info (& hdev -> pdev -> dev ,
42424256 "re-schedule reset task(%u)\n" ,
42434257 hdev -> rst_stats .reset_fail_cnt );
@@ -4480,8 +4494,20 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle)
44804494static void hclge_set_def_reset_request (struct hnae3_ae_dev * ae_dev ,
44814495 enum hnae3_reset_type rst_type )
44824496{
4497+ #define HCLGE_SUPPORT_RESET_TYPE \
4498+ (BIT(HNAE3_FLR_RESET) | BIT(HNAE3_FUNC_RESET) | \
4499+ BIT(HNAE3_GLOBAL_RESET) | BIT(HNAE3_IMP_RESET))
4500+
44834501 struct hclge_dev * hdev = ae_dev -> priv ;
44844502
4503+ if (!(BIT (rst_type ) & HCLGE_SUPPORT_RESET_TYPE )) {
4504+ /* To prevent reset triggered by hclge_reset_event */
4505+ set_bit (HNAE3_NONE_RESET , & hdev -> default_reset_request );
4506+ dev_warn (& hdev -> pdev -> dev , "unsupported reset type %d\n" ,
4507+ rst_type );
4508+ return ;
4509+ }
4510+
44854511 set_bit (rst_type , & hdev -> default_reset_request );
44864512}
44874513
@@ -11891,9 +11917,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
1189111917
1189211918 hclge_init_rxd_adv_layout (hdev );
1189311919
11894- /* Enable MISC vector(vector0) */
11895- hclge_enable_vector (& hdev -> misc_vector , true);
11896-
1189711920 ret = hclge_init_wol (hdev );
1189811921 if (ret )
1189911922 dev_warn (& pdev -> dev ,
@@ -11906,6 +11929,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
1190611929 hclge_state_init (hdev );
1190711930 hdev -> last_reset_time = jiffies ;
1190811931
11932+ /* Enable MISC vector(vector0) */
11933+ enable_irq (hdev -> misc_vector .vector_irq );
11934+ hclge_enable_vector (& hdev -> misc_vector , true);
11935+
1190911936 dev_info (& hdev -> pdev -> dev , "%s driver initialization finished.\n" ,
1191011937 HCLGE_DRIVER_NAME );
1191111938
@@ -12311,7 +12338,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
1231112338
1231212339 /* Disable MISC vector(vector0) */
1231312340 hclge_enable_vector (& hdev -> misc_vector , false);
12314- synchronize_irq (hdev -> misc_vector .vector_irq );
12341+ disable_irq (hdev -> misc_vector .vector_irq );
1231512342
1231612343 /* Disable all hw interrupts */
1231712344 hclge_config_mac_tnl_int (hdev , false);
0 commit comments