@@ -2226,6 +2226,12 @@ static int hclge_mac_init(struct hclge_dev *hdev)
2226
2226
return hclge_cfg_func_mta_filter (hdev , 0 , hdev -> accept_mta_mc );
2227
2227
}
2228
2228
2229
+ static void hclge_reset_task_schedule (struct hclge_dev * hdev )
2230
+ {
2231
+ if (!test_and_set_bit (HCLGE_STATE_RST_SERVICE_SCHED , & hdev -> state ))
2232
+ schedule_work (& hdev -> rst_service_task );
2233
+ }
2234
+
2229
2235
static void hclge_task_schedule (struct hclge_dev * hdev )
2230
2236
{
2231
2237
if (!test_bit (HCLGE_STATE_DOWN , & hdev -> state ) &&
@@ -2421,7 +2427,7 @@ static irqreturn_t hclge_misc_irq_handle(int irq, void *data)
2421
2427
*/
2422
2428
switch (event_cause ) {
2423
2429
case HCLGE_VECTOR0_EVENT_RST :
2424
- /* reset task to be scheduled here */
2430
+ hclge_reset_task_schedule ( hdev );
2425
2431
break ;
2426
2432
default :
2427
2433
dev_dbg (& hdev -> pdev -> dev ,
@@ -2584,6 +2590,9 @@ static void hclge_do_reset(struct hclge_dev *hdev, enum hnae3_reset_type type)
2584
2590
case HNAE3_FUNC_RESET :
2585
2591
dev_info (& pdev -> dev , "PF Reset requested\n" );
2586
2592
hclge_func_reset_cmd (hdev , 0 );
2593
+ /* schedule again to check later */
2594
+ set_bit (HNAE3_FUNC_RESET , & hdev -> reset_pending );
2595
+ hclge_reset_task_schedule (hdev );
2587
2596
break ;
2588
2597
default :
2589
2598
dev_warn (& pdev -> dev ,
@@ -2605,14 +2614,9 @@ static void hclge_reset_event(struct hnae3_handle *handle,
2605
2614
case HNAE3_FUNC_RESET :
2606
2615
case HNAE3_CORE_RESET :
2607
2616
case HNAE3_GLOBAL_RESET :
2608
- if (test_bit (HCLGE_STATE_RESET_INT , & hdev -> state )) {
2609
- dev_err (& hdev -> pdev -> dev , "Already in reset state" );
2610
- return ;
2611
- }
2612
- hdev -> reset_type = reset ;
2613
- set_bit (HCLGE_STATE_RESET_INT , & hdev -> state );
2614
- set_bit (HCLGE_STATE_SERVICE_SCHED , & hdev -> state );
2615
- schedule_work (& hdev -> service_task );
2617
+ /* request reset & schedule reset task */
2618
+ set_bit (reset , & hdev -> reset_request );
2619
+ hclge_reset_task_schedule (hdev );
2616
2620
break ;
2617
2621
default :
2618
2622
dev_warn (& hdev -> pdev -> dev , "Unsupported reset event:%d" , reset );
@@ -2658,17 +2662,26 @@ static void hclge_reset_subtask(struct hclge_dev *hdev)
2658
2662
hdev -> reset_type = HNAE3_NONE_RESET ;
2659
2663
}
2660
2664
2661
- static void hclge_misc_irq_service_task (struct hclge_dev * hdev )
2665
+ static void hclge_reset_service_task (struct work_struct * work )
2662
2666
{
2667
+ struct hclge_dev * hdev =
2668
+ container_of (work , struct hclge_dev , rst_service_task );
2669
+
2670
+ if (test_and_set_bit (HCLGE_STATE_RST_HANDLING , & hdev -> state ))
2671
+ return ;
2672
+
2673
+ clear_bit (HCLGE_STATE_RST_SERVICE_SCHED , & hdev -> state );
2674
+
2663
2675
hclge_reset_subtask (hdev );
2676
+
2677
+ clear_bit (HCLGE_STATE_RST_HANDLING , & hdev -> state );
2664
2678
}
2665
2679
2666
2680
static void hclge_service_task (struct work_struct * work )
2667
2681
{
2668
2682
struct hclge_dev * hdev =
2669
2683
container_of (work , struct hclge_dev , service_task );
2670
2684
2671
- hclge_misc_irq_service_task (hdev );
2672
2685
hclge_update_speed_duplex (hdev );
2673
2686
hclge_update_link_status (hdev );
2674
2687
hclge_update_stats_for_all (hdev );
@@ -4699,6 +4712,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
4699
4712
hdev -> pdev = pdev ;
4700
4713
hdev -> ae_dev = ae_dev ;
4701
4714
hdev -> reset_type = HNAE3_NONE_RESET ;
4715
+ hdev -> reset_request = 0 ;
4702
4716
hdev -> reset_pending = 0 ;
4703
4717
ae_dev -> priv = hdev ;
4704
4718
@@ -4811,12 +4825,15 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
4811
4825
4812
4826
timer_setup (& hdev -> service_timer , hclge_service_timer , 0 );
4813
4827
INIT_WORK (& hdev -> service_task , hclge_service_task );
4828
+ INIT_WORK (& hdev -> rst_service_task , hclge_reset_service_task );
4814
4829
4815
4830
/* Enable MISC vector(vector0) */
4816
4831
hclge_enable_vector (& hdev -> misc_vector , true);
4817
4832
4818
4833
set_bit (HCLGE_STATE_SERVICE_INITED , & hdev -> state );
4819
4834
set_bit (HCLGE_STATE_DOWN , & hdev -> state );
4835
+ clear_bit (HCLGE_STATE_RST_SERVICE_SCHED , & hdev -> state );
4836
+ clear_bit (HCLGE_STATE_RST_HANDLING , & hdev -> state );
4820
4837
4821
4838
pr_info ("%s driver initialization finished.\n" , HCLGE_DRIVER_NAME );
4822
4839
return 0 ;
@@ -4928,6 +4945,8 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
4928
4945
del_timer_sync (& hdev -> service_timer );
4929
4946
if (hdev -> service_task .func )
4930
4947
cancel_work_sync (& hdev -> service_task );
4948
+ if (hdev -> rst_service_task .func )
4949
+ cancel_work_sync (& hdev -> rst_service_task );
4931
4950
4932
4951
if (mac -> phydev )
4933
4952
mdiobus_unregister (mac -> mdio_bus );
0 commit comments