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>
@@ -3574,6 +3575,17 @@ static int hclge_set_vf_link_state(struct hnae3_handle *handle, int vf,
35743575 return ret ;
35753576}
35763577
3578+ static void hclge_set_reset_pending (struct hclge_dev * hdev ,
3579+ enum hnae3_reset_type reset_type )
3580+ {
3581+ /* When an incorrect reset type is executed, the get_reset_level
3582+ * function generates the HNAE3_NONE_RESET flag. As a result, this
3583+ * type do not need to pending.
3584+ */
3585+ if (reset_type != HNAE3_NONE_RESET )
3586+ set_bit (reset_type , & hdev -> reset_pending );
3587+ }
3588+
35773589static u32 hclge_check_event_cause (struct hclge_dev * hdev , u32 * clearval )
35783590{
35793591 u32 cmdq_src_reg , msix_src_reg , hw_err_src_reg ;
@@ -3594,7 +3606,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
35943606 */
35953607 if (BIT (HCLGE_VECTOR0_IMPRESET_INT_B ) & msix_src_reg ) {
35963608 dev_info (& hdev -> pdev -> dev , "IMP reset interrupt\n" );
3597- set_bit ( HNAE3_IMP_RESET , & hdev -> reset_pending );
3609+ hclge_set_reset_pending ( hdev , HNAE3_IMP_RESET );
35983610 set_bit (HCLGE_COMM_STATE_CMD_DISABLE , & hdev -> hw .hw .comm_state );
35993611 * clearval = BIT (HCLGE_VECTOR0_IMPRESET_INT_B );
36003612 hdev -> rst_stats .imp_rst_cnt ++ ;
@@ -3604,7 +3616,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
36043616 if (BIT (HCLGE_VECTOR0_GLOBALRESET_INT_B ) & msix_src_reg ) {
36053617 dev_info (& hdev -> pdev -> dev , "global reset interrupt\n" );
36063618 set_bit (HCLGE_COMM_STATE_CMD_DISABLE , & hdev -> hw .hw .comm_state );
3607- set_bit ( HNAE3_GLOBAL_RESET , & hdev -> reset_pending );
3619+ hclge_set_reset_pending ( hdev , HNAE3_GLOBAL_RESET );
36083620 * clearval = BIT (HCLGE_VECTOR0_GLOBALRESET_INT_B );
36093621 hdev -> rst_stats .global_rst_cnt ++ ;
36103622 return HCLGE_VECTOR0_EVENT_RST ;
@@ -3759,7 +3771,7 @@ static int hclge_misc_irq_init(struct hclge_dev *hdev)
37593771 snprintf (hdev -> misc_vector .name , HNAE3_INT_NAME_LEN , "%s-misc-%s" ,
37603772 HCLGE_NAME , pci_name (hdev -> pdev ));
37613773 ret = request_irq (hdev -> misc_vector .vector_irq , hclge_misc_irq_handle ,
3762- 0 , hdev -> misc_vector .name , hdev );
3774+ IRQF_NO_AUTOEN , hdev -> misc_vector .name , hdev );
37633775 if (ret ) {
37643776 hclge_free_vector (hdev , 0 );
37653777 dev_err (& hdev -> pdev -> dev , "request misc irq(%d) fail\n" ,
@@ -4052,7 +4064,7 @@ static void hclge_do_reset(struct hclge_dev *hdev)
40524064 case HNAE3_FUNC_RESET :
40534065 dev_info (& pdev -> dev , "PF reset requested\n" );
40544066 /* schedule again to check later */
4055- set_bit ( HNAE3_FUNC_RESET , & hdev -> reset_pending );
4067+ hclge_set_reset_pending ( hdev , HNAE3_FUNC_RESET );
40564068 hclge_reset_task_schedule (hdev );
40574069 break ;
40584070 default :
@@ -4086,6 +4098,8 @@ static enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,
40864098 clear_bit (HNAE3_FLR_RESET , addr );
40874099 }
40884100
4101+ clear_bit (HNAE3_NONE_RESET , addr );
4102+
40894103 if (hdev -> reset_type != HNAE3_NONE_RESET &&
40904104 rst_level < hdev -> reset_type )
40914105 return HNAE3_NONE_RESET ;
@@ -4227,7 +4241,7 @@ static bool hclge_reset_err_handle(struct hclge_dev *hdev)
42274241 return false;
42284242 } else if (hdev -> rst_stats .reset_fail_cnt < MAX_RESET_FAIL_CNT ) {
42294243 hdev -> rst_stats .reset_fail_cnt ++ ;
4230- set_bit (hdev -> reset_type , & hdev -> reset_pending );
4244+ hclge_set_reset_pending (hdev , hdev -> reset_type );
42314245 dev_info (& hdev -> pdev -> dev ,
42324246 "re-schedule reset task(%u)\n" ,
42334247 hdev -> rst_stats .reset_fail_cnt );
@@ -4470,8 +4484,20 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle)
44704484static void hclge_set_def_reset_request (struct hnae3_ae_dev * ae_dev ,
44714485 enum hnae3_reset_type rst_type )
44724486{
4487+ #define HCLGE_SUPPORT_RESET_TYPE \
4488+ (BIT(HNAE3_FLR_RESET) | BIT(HNAE3_FUNC_RESET) | \
4489+ BIT(HNAE3_GLOBAL_RESET) | BIT(HNAE3_IMP_RESET))
4490+
44734491 struct hclge_dev * hdev = ae_dev -> priv ;
44744492
4493+ if (!(BIT (rst_type ) & HCLGE_SUPPORT_RESET_TYPE )) {
4494+ /* To prevent reset triggered by hclge_reset_event */
4495+ set_bit (HNAE3_NONE_RESET , & hdev -> default_reset_request );
4496+ dev_warn (& hdev -> pdev -> dev , "unsupported reset type %d\n" ,
4497+ rst_type );
4498+ return ;
4499+ }
4500+
44754501 set_bit (rst_type , & hdev -> default_reset_request );
44764502}
44774503
@@ -11881,9 +11907,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
1188111907
1188211908 hclge_init_rxd_adv_layout (hdev );
1188311909
11884- /* Enable MISC vector(vector0) */
11885- hclge_enable_vector (& hdev -> misc_vector , true);
11886-
1188711910 ret = hclge_init_wol (hdev );
1188811911 if (ret )
1188911912 dev_warn (& pdev -> dev ,
@@ -11896,6 +11919,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
1189611919 hclge_state_init (hdev );
1189711920 hdev -> last_reset_time = jiffies ;
1189811921
11922+ /* Enable MISC vector(vector0) */
11923+ enable_irq (hdev -> misc_vector .vector_irq );
11924+ hclge_enable_vector (& hdev -> misc_vector , true);
11925+
1189911926 dev_info (& hdev -> pdev -> dev , "%s driver initialization finished.\n" ,
1190011927 HCLGE_DRIVER_NAME );
1190111928
@@ -12301,7 +12328,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
1230112328
1230212329 /* Disable MISC vector(vector0) */
1230312330 hclge_enable_vector (& hdev -> misc_vector , false);
12304- synchronize_irq (hdev -> misc_vector .vector_irq );
12331+ disable_irq (hdev -> misc_vector .vector_irq );
1230512332
1230612333 /* Disable all hw interrupts */
1230712334 hclge_config_mac_tnl_int (hdev , false);
0 commit comments