net: hns3: add set_default_reset_request in the hnae3_ae_ops
authorHuazhong Tan <tanhuazhong@huawei.com>
Wed, 7 Nov 2018 04:06:08 +0000 (12:06 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Nov 2018 19:42:17 +0000 (11:42 -0800)
Currently, when reset_event is called because of tx timeout, it will
upgrade the reset level (For PF, HNAE3_FUNC_RESET -> HNAE3_CORE_RESET
-> HNAE3_GLOBAL_RESET) if the time between the new reset and last reset
is within 20 secs, or restore the reset level to HNAE3_FUNC_RESET if
the time between the new reset and last reset is over 20 secs.

There is requirement that the caller needs to decide the reset level
when triggering a reset, for example, RAS recovery. So this patch
adds the set_default_reset_request to meet this requirement.

Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hnae3.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h

index 055b40606dbc20f358f6445067b33f226d79554e..7deab9270d16c69830491f7290437da02fa0160e 100644 (file)
@@ -403,6 +403,8 @@ struct hnae3_ae_ops {
                                  u16 vlan, u8 qos, __be16 proto);
        int (*enable_hw_strip_rxvtag)(struct hnae3_handle *handle, bool enable);
        void (*reset_event)(struct pci_dev *pdev, struct hnae3_handle *handle);
+       void (*set_default_reset_request)(struct hnae3_ae_dev *ae_dev,
+                                         enum hnae3_reset_type rst_type);
        void (*get_channels)(struct hnae3_handle *handle,
                             struct ethtool_channels *ch);
        void (*get_tqps_and_rss_info)(struct hnae3_handle *h,
index ffdd96020860db0153d467814984d63efb01995e..5e6006b6ed1ad8056a55a99b405dd7103928e49d 100644 (file)
@@ -2517,6 +2517,10 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle)
 
        if (time_before(jiffies, (handle->last_reset_time + 3 * HZ)))
                return;
+       else if (hdev->default_reset_request)
+               handle->reset_level =
+                       hclge_get_reset_level(hdev,
+                                             &hdev->default_reset_request);
        else if (time_after(jiffies, (handle->last_reset_time + 4 * 5 * HZ)))
                handle->reset_level = HNAE3_FUNC_RESET;
 
@@ -2531,6 +2535,14 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle)
                handle->reset_level++;
 }
 
+static void hclge_set_def_reset_request(struct hnae3_ae_dev *ae_dev,
+                                       enum hnae3_reset_type rst_type)
+{
+       struct hclge_dev *hdev = ae_dev->priv;
+
+       set_bit(rst_type, &hdev->default_reset_request);
+}
+
 static void hclge_reset_subtask(struct hclge_dev *hdev)
 {
        /* check if there is any ongoing reset in the hardware. This status can
@@ -7321,6 +7333,7 @@ static const struct hnae3_ae_ops hclge_ops = {
        .set_vf_vlan_filter = hclge_set_vf_vlan_filter,
        .enable_hw_strip_rxvtag = hclge_en_hw_strip_rxvtag,
        .reset_event = hclge_reset_event,
+       .set_default_reset_request = hclge_set_def_reset_request,
        .get_tqps_and_rss_info = hclge_get_tqps_and_rss_info,
        .set_channels = hclge_set_channels,
        .get_channels = hclge_get_channels,
index 0d92154042699c94a41410ab6dc3aa38437c9b3a..7cfb61ebb92ee43e3d535f3620b470e501397abd 100644 (file)
@@ -595,6 +595,7 @@ struct hclge_dev {
        unsigned long state;
 
        enum hnae3_reset_type reset_type;
+       unsigned long default_reset_request;
        unsigned long reset_request;    /* reset has been requested */
        unsigned long reset_pending;    /* client rst is pending to be served */
        u32 fw_version;
index 085edb945389c5fc8aba0d94f8ffe2c74f070f24..42982fc2b5d7f1c4c950bb9a882db40875885a39 100644 (file)
@@ -1219,6 +1219,19 @@ static int hclgevf_do_reset(struct hclgevf_dev *hdev)
        return status;
 }
 
+static enum hnae3_reset_type hclgevf_get_reset_level(struct hclgevf_dev *hdev,
+                                                    unsigned long *addr)
+{
+       enum hnae3_reset_type rst_level = HNAE3_NONE_RESET;
+
+       if (test_bit(HNAE3_VF_RESET, addr)) {
+               rst_level = HNAE3_VF_RESET;
+               clear_bit(HNAE3_VF_RESET, addr);
+       }
+
+       return rst_level;
+}
+
 static void hclgevf_reset_event(struct pci_dev *pdev,
                                struct hnae3_handle *handle)
 {
@@ -1226,7 +1239,12 @@ static void hclgevf_reset_event(struct pci_dev *pdev,
 
        dev_info(&hdev->pdev->dev, "received reset request from VF enet\n");
 
-       handle->reset_level = HNAE3_VF_RESET;
+       if (!hdev->default_reset_request)
+               handle->reset_level =
+                       hclgevf_get_reset_level(hdev,
+                                               &hdev->default_reset_request);
+       else
+               handle->reset_level = HNAE3_VF_RESET;
 
        /* reset of this VF requested */
        set_bit(HCLGEVF_RESET_REQUESTED, &hdev->reset_state);
@@ -1235,6 +1253,14 @@ static void hclgevf_reset_event(struct pci_dev *pdev,
        handle->last_reset_time = jiffies;
 }
 
+static void hclgevf_set_def_reset_request(struct hnae3_ae_dev *ae_dev,
+                                         enum hnae3_reset_type rst_type)
+{
+       struct hclgevf_dev *hdev = ae_dev->priv;
+
+       set_bit(rst_type, &hdev->default_reset_request);
+}
+
 static u32 hclgevf_get_fw_version(struct hnae3_handle *handle)
 {
        struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
@@ -2193,6 +2219,7 @@ static const struct hnae3_ae_ops hclgevf_ops = {
        .set_vlan_filter = hclgevf_set_vlan_filter,
        .enable_hw_strip_rxvtag = hclgevf_en_hw_strip_rxvtag,
        .reset_event = hclgevf_reset_event,
+       .set_default_reset_request = hclgevf_set_def_reset_request,
        .get_channels = hclgevf_get_channels,
        .get_tqps_and_rss_info = hclgevf_get_tqps_and_rss_info,
        .get_status = hclgevf_get_status,
index aed241e8ffab655fbd521b64c5c948b99cded63f..6b2fd5a0326fef7e8eb2165b111127e792791733 100644 (file)
@@ -145,6 +145,7 @@ struct hclgevf_dev {
        struct hclgevf_misc_vector misc_vector;
        struct hclgevf_rss_cfg rss_cfg;
        unsigned long state;
+       unsigned long default_reset_request;
 
 #define HCLGEVF_RESET_REQUESTED                0
 #define HCLGEVF_RESET_PENDING          1