@@ -1523,7 +1523,8 @@ static int hclgevf_reset_stack(struct hclgevf_dev *hdev)
1523
1523
/* clear handshake status with IMP */
1524
1524
hclgevf_reset_handshake (hdev , false);
1525
1525
1526
- return 0 ;
1526
+ /* bring up the nic to enable TX/RX again */
1527
+ return hclgevf_notify_client (hdev , HNAE3_UP_CLIENT );
1527
1528
}
1528
1529
1529
1530
static int hclgevf_reset_prepare_wait (struct hclgevf_dev * hdev )
@@ -1603,7 +1604,7 @@ static void hclgevf_reset_err_handle(struct hclgevf_dev *hdev)
1603
1604
}
1604
1605
}
1605
1606
1606
- static int hclgevf_reset (struct hclgevf_dev * hdev )
1607
+ static int hclgevf_reset_prepare (struct hclgevf_dev * hdev )
1607
1608
{
1608
1609
struct hnae3_ae_dev * ae_dev = pci_get_drvdata (hdev -> pdev );
1609
1610
int ret ;
@@ -1613,62 +1614,64 @@ static int hclgevf_reset(struct hclgevf_dev *hdev)
1613
1614
*/
1614
1615
ae_dev -> reset_type = hdev -> reset_type ;
1615
1616
hdev -> rst_stats .rst_cnt ++ ;
1616
- rtnl_lock ();
1617
1617
1618
+ rtnl_lock ();
1618
1619
/* bring down the nic to stop any ongoing TX/RX */
1619
1620
ret = hclgevf_notify_client (hdev , HNAE3_DOWN_CLIENT );
1620
- if (ret )
1621
- goto err_reset_lock ;
1622
-
1623
1621
rtnl_unlock ();
1624
-
1625
- ret = hclgevf_reset_prepare_wait (hdev );
1626
1622
if (ret )
1627
- goto err_reset ;
1623
+ return ret ;
1628
1624
1629
- /* check if VF could successfully fetch the hardware reset completion
1630
- * status from the hardware
1631
- */
1632
- ret = hclgevf_reset_wait (hdev );
1633
- if (ret ) {
1634
- /* can't do much in this situation, will disable VF */
1635
- dev_err (& hdev -> pdev -> dev ,
1636
- "VF failed(=%d) to fetch H/W reset completion status\n" ,
1637
- ret );
1638
- goto err_reset ;
1639
- }
1625
+ return hclgevf_reset_prepare_wait (hdev );
1626
+ }
1627
+
1628
+ static int hclgevf_reset_rebuild (struct hclgevf_dev * hdev )
1629
+ {
1630
+ struct hnae3_ae_dev * ae_dev = pci_get_drvdata (hdev -> pdev );
1631
+ int ret ;
1640
1632
1641
1633
hdev -> rst_stats .hw_rst_done_cnt ++ ;
1642
1634
1643
1635
rtnl_lock ();
1644
-
1645
1636
/* now, re-initialize the nic client and ae device */
1646
1637
ret = hclgevf_reset_stack (hdev );
1638
+ rtnl_unlock ();
1647
1639
if (ret ) {
1648
1640
dev_err (& hdev -> pdev -> dev , "failed to reset VF stack\n" );
1649
- goto err_reset_lock ;
1641
+ return ret ;
1650
1642
}
1651
1643
1652
- /* bring up the nic to enable TX/RX again */
1653
- ret = hclgevf_notify_client (hdev , HNAE3_UP_CLIENT );
1654
- if (ret )
1655
- goto err_reset_lock ;
1656
-
1657
- rtnl_unlock ();
1658
-
1659
1644
hdev -> last_reset_time = jiffies ;
1660
1645
ae_dev -> reset_type = HNAE3_NONE_RESET ;
1661
1646
hdev -> rst_stats .rst_done_cnt ++ ;
1662
1647
hdev -> rst_stats .rst_fail_cnt = 0 ;
1663
1648
clear_bit (HCLGEVF_STATE_RST_FAIL , & hdev -> state );
1664
1649
1665
- return ret ;
1666
- err_reset_lock :
1667
- rtnl_unlock ();
1650
+ return 0 ;
1651
+ }
1652
+
1653
+ static void hclgevf_reset (struct hclgevf_dev * hdev )
1654
+ {
1655
+ if (hclgevf_reset_prepare (hdev ))
1656
+ goto err_reset ;
1657
+
1658
+ /* check if VF could successfully fetch the hardware reset completion
1659
+ * status from the hardware
1660
+ */
1661
+ if (hclgevf_reset_wait (hdev )) {
1662
+ /* can't do much in this situation, will disable VF */
1663
+ dev_err (& hdev -> pdev -> dev ,
1664
+ "failed to fetch H/W reset completion status\n" );
1665
+ goto err_reset ;
1666
+ }
1667
+
1668
+ if (hclgevf_reset_rebuild (hdev ))
1669
+ goto err_reset ;
1670
+
1671
+ return ;
1672
+
1668
1673
err_reset :
1669
1674
hclgevf_reset_err_handle (hdev );
1670
-
1671
- return ret ;
1672
1675
}
1673
1676
1674
1677
static enum hnae3_reset_type hclgevf_get_reset_level (struct hclgevf_dev * hdev ,
@@ -1802,8 +1805,6 @@ static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)
1802
1805
{
1803
1806
#define HCLGEVF_MAX_RESET_ATTEMPTS_CNT 3
1804
1807
1805
- int ret ;
1806
-
1807
1808
if (!test_and_clear_bit (HCLGEVF_STATE_RST_SERVICE_SCHED , & hdev -> state ))
1808
1809
return ;
1809
1810
@@ -1822,12 +1823,8 @@ static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)
1822
1823
hdev -> last_reset_time = jiffies ;
1823
1824
while ((hdev -> reset_type =
1824
1825
hclgevf_get_reset_level (hdev , & hdev -> reset_pending ))
1825
- != HNAE3_NONE_RESET ) {
1826
- ret = hclgevf_reset (hdev );
1827
- if (ret )
1828
- dev_err (& hdev -> pdev -> dev ,
1829
- "VF stack reset failed %d.\n" , ret );
1830
- }
1826
+ != HNAE3_NONE_RESET )
1827
+ hclgevf_reset (hdev );
1831
1828
} else if (test_and_clear_bit (HCLGEVF_RESET_REQUESTED ,
1832
1829
& hdev -> reset_state )) {
1833
1830
/* we could be here when either of below happens:
0 commit comments