aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h7
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3_enet.c65
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3_enet.h7
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c10
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c4
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c7
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c5
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c2
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c8
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c9
10 files changed, 69 insertions, 55 deletions
diff --git a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
index 360463a40ba9..83e19c6b974e 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
@@ -84,12 +84,15 @@ struct hclgevf_mbx_resp_status {
84struct hclge_mbx_vf_to_pf_cmd { 84struct hclge_mbx_vf_to_pf_cmd {
85 u8 rsv; 85 u8 rsv;
86 u8 mbx_src_vfid; /* Auto filled by IMP */ 86 u8 mbx_src_vfid; /* Auto filled by IMP */
87 u8 rsv1[2]; 87 u8 mbx_need_resp;
88 u8 rsv1[1];
88 u8 msg_len; 89 u8 msg_len;
89 u8 rsv2[3]; 90 u8 rsv2[3];
90 u8 msg[HCLGE_MBX_MAX_MSG_SIZE]; 91 u8 msg[HCLGE_MBX_MAX_MSG_SIZE];
91}; 92};
92 93
94#define HCLGE_MBX_NEED_RESP_BIT BIT(0)
95
93struct hclge_mbx_pf_to_vf_cmd { 96struct hclge_mbx_pf_to_vf_cmd {
94 u8 dest_vfid; 97 u8 dest_vfid;
95 u8 rsv[3]; 98 u8 rsv[3];
@@ -111,7 +114,7 @@ struct hclgevf_mbx_arq_ring {
111 struct hclgevf_dev *hdev; 114 struct hclgevf_dev *hdev;
112 u32 head; 115 u32 head;
113 u32 tail; 116 u32 tail;
114 u32 count; 117 atomic_t count;
115 u16 msg_q[HCLGE_MBX_MAX_ARQ_MSG_NUM][HCLGE_MBX_MAX_ARQ_MSG_SIZE]; 118 u16 msg_q[HCLGE_MBX_MAX_ARQ_MSG_NUM][HCLGE_MBX_MAX_ARQ_MSG_SIZE];
116}; 119};
117 120
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
index 176d4b965709..b0f31eb481ea 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
@@ -2214,14 +2214,22 @@ static void hns3_reuse_buffer(struct hns3_enet_ring *ring, int i)
2214static void hns3_nic_reclaim_one_desc(struct hns3_enet_ring *ring, int *bytes, 2214static void hns3_nic_reclaim_one_desc(struct hns3_enet_ring *ring, int *bytes,
2215 int *pkts) 2215 int *pkts)
2216{ 2216{
2217 struct hns3_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_clean]; 2217 int ntc = ring->next_to_clean;
2218 struct hns3_desc_cb *desc_cb;
2218 2219
2220 desc_cb = &ring->desc_cb[ntc];
2219 (*pkts) += (desc_cb->type == DESC_TYPE_SKB); 2221 (*pkts) += (desc_cb->type == DESC_TYPE_SKB);
2220 (*bytes) += desc_cb->length; 2222 (*bytes) += desc_cb->length;
2221 /* desc_cb will be cleaned, after hnae3_free_buffer_detach*/ 2223 /* desc_cb will be cleaned, after hnae3_free_buffer_detach*/
2222 hns3_free_buffer_detach(ring, ring->next_to_clean); 2224 hns3_free_buffer_detach(ring, ntc);
2223 2225
2224 ring_ptr_move_fw(ring, next_to_clean); 2226 if (++ntc == ring->desc_num)
2227 ntc = 0;
2228
2229 /* This smp_store_release() pairs with smp_load_acquire() in
2230 * ring_space called by hns3_nic_net_xmit.
2231 */
2232 smp_store_release(&ring->next_to_clean, ntc);
2225} 2233}
2226 2234
2227static int is_valid_clean_head(struct hns3_enet_ring *ring, int h) 2235static int is_valid_clean_head(struct hns3_enet_ring *ring, int h)
@@ -2689,36 +2697,37 @@ static int hns3_set_gro_and_checksum(struct hns3_enet_ring *ring,
2689} 2697}
2690 2698
2691static void hns3_set_rx_skb_rss_type(struct hns3_enet_ring *ring, 2699static void hns3_set_rx_skb_rss_type(struct hns3_enet_ring *ring,
2692 struct sk_buff *skb) 2700 struct sk_buff *skb, u32 rss_hash)
2693{ 2701{
2694 struct hnae3_handle *handle = ring->tqp->handle; 2702 struct hnae3_handle *handle = ring->tqp->handle;
2695 enum pkt_hash_types rss_type; 2703 enum pkt_hash_types rss_type;
2696 struct hns3_desc *desc;
2697 int last_bd;
2698 2704
2699 /* When driver handle the rss type, ring->next_to_clean indicates the 2705 if (rss_hash)
2700 * first descriptor of next packet, need -1 here.
2701 */
2702 last_bd = (ring->next_to_clean - 1 + ring->desc_num) % ring->desc_num;
2703 desc = &ring->desc[last_bd];
2704
2705 if (le32_to_cpu(desc->rx.rss_hash))
2706 rss_type = handle->kinfo.rss_type; 2706 rss_type = handle->kinfo.rss_type;
2707 else 2707 else
2708 rss_type = PKT_HASH_TYPE_NONE; 2708 rss_type = PKT_HASH_TYPE_NONE;
2709 2709
2710 skb_set_hash(skb, le32_to_cpu(desc->rx.rss_hash), rss_type); 2710 skb_set_hash(skb, rss_hash, rss_type);
2711} 2711}
2712 2712
2713static int hns3_handle_bdinfo(struct hns3_enet_ring *ring, struct sk_buff *skb, 2713static int hns3_handle_bdinfo(struct hns3_enet_ring *ring, struct sk_buff *skb)
2714 struct hns3_desc *desc)
2715{ 2714{
2716 struct net_device *netdev = ring->tqp->handle->kinfo.netdev; 2715 struct net_device *netdev = ring->tqp->handle->kinfo.netdev;
2717 u32 bd_base_info = le32_to_cpu(desc->rx.bd_base_info);
2718 u32 l234info = le32_to_cpu(desc->rx.l234_info);
2719 enum hns3_pkt_l2t_type l2_frame_type; 2716 enum hns3_pkt_l2t_type l2_frame_type;
2717 u32 bd_base_info, l234info;
2718 struct hns3_desc *desc;
2720 unsigned int len; 2719 unsigned int len;
2721 int ret; 2720 int pre_ntc, ret;
2721
2722 /* bdinfo handled below is only valid on the last BD of the
2723 * current packet, and ring->next_to_clean indicates the first
2724 * descriptor of next packet, so need - 1 below.
2725 */
2726 pre_ntc = ring->next_to_clean ? (ring->next_to_clean - 1) :
2727 (ring->desc_num - 1);
2728 desc = &ring->desc[pre_ntc];
2729 bd_base_info = le32_to_cpu(desc->rx.bd_base_info);
2730 l234info = le32_to_cpu(desc->rx.l234_info);
2722 2731
2723 /* Based on hw strategy, the tag offloaded will be stored at 2732 /* Based on hw strategy, the tag offloaded will be stored at
2724 * ot_vlan_tag in two layer tag case, and stored at vlan_tag 2733 * ot_vlan_tag in two layer tag case, and stored at vlan_tag
@@ -2779,6 +2788,8 @@ static int hns3_handle_bdinfo(struct hns3_enet_ring *ring, struct sk_buff *skb,
2779 u64_stats_update_end(&ring->syncp); 2788 u64_stats_update_end(&ring->syncp);
2780 2789
2781 ring->tqp_vector->rx_group.total_bytes += len; 2790 ring->tqp_vector->rx_group.total_bytes += len;
2791
2792 hns3_set_rx_skb_rss_type(ring, skb, le32_to_cpu(desc->rx.rss_hash));
2782 return 0; 2793 return 0;
2783} 2794}
2784 2795
@@ -2848,14 +2859,13 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
2848 ALIGN(ring->pull_len, sizeof(long))); 2859 ALIGN(ring->pull_len, sizeof(long)));
2849 } 2860 }
2850 2861
2851 ret = hns3_handle_bdinfo(ring, skb, desc); 2862 ret = hns3_handle_bdinfo(ring, skb);
2852 if (unlikely(ret)) { 2863 if (unlikely(ret)) {
2853 dev_kfree_skb_any(skb); 2864 dev_kfree_skb_any(skb);
2854 return ret; 2865 return ret;
2855 } 2866 }
2856 2867
2857 *out_skb = skb; 2868 *out_skb = skb;
2858 hns3_set_rx_skb_rss_type(ring, skb);
2859 2869
2860 return 0; 2870 return 0;
2861} 2871}
@@ -2866,7 +2876,7 @@ int hns3_clean_rx_ring(
2866{ 2876{
2867#define RCB_NOF_ALLOC_RX_BUFF_ONCE 16 2877#define RCB_NOF_ALLOC_RX_BUFF_ONCE 16
2868 int recv_pkts, recv_bds, clean_count, err; 2878 int recv_pkts, recv_bds, clean_count, err;
2869 int unused_count = hns3_desc_unused(ring) - ring->pending_buf; 2879 int unused_count = hns3_desc_unused(ring);
2870 struct sk_buff *skb = ring->skb; 2880 struct sk_buff *skb = ring->skb;
2871 int num; 2881 int num;
2872 2882
@@ -2875,6 +2885,7 @@ int hns3_clean_rx_ring(
2875 2885
2876 recv_pkts = 0, recv_bds = 0, clean_count = 0; 2886 recv_pkts = 0, recv_bds = 0, clean_count = 0;
2877 num -= unused_count; 2887 num -= unused_count;
2888 unused_count -= ring->pending_buf;
2878 2889
2879 while (recv_pkts < budget && recv_bds < num) { 2890 while (recv_pkts < budget && recv_bds < num) {
2880 /* Reuse or realloc buffers */ 2891 /* Reuse or realloc buffers */
@@ -3476,6 +3487,7 @@ err:
3476 } 3487 }
3477 3488
3478 devm_kfree(&pdev->dev, priv->ring_data); 3489 devm_kfree(&pdev->dev, priv->ring_data);
3490 priv->ring_data = NULL;
3479 return ret; 3491 return ret;
3480} 3492}
3481 3493
@@ -3484,12 +3496,16 @@ static void hns3_put_ring_config(struct hns3_nic_priv *priv)
3484 struct hnae3_handle *h = priv->ae_handle; 3496 struct hnae3_handle *h = priv->ae_handle;
3485 int i; 3497 int i;
3486 3498
3499 if (!priv->ring_data)
3500 return;
3501
3487 for (i = 0; i < h->kinfo.num_tqps; i++) { 3502 for (i = 0; i < h->kinfo.num_tqps; i++) {
3488 devm_kfree(priv->dev, priv->ring_data[i].ring); 3503 devm_kfree(priv->dev, priv->ring_data[i].ring);
3489 devm_kfree(priv->dev, 3504 devm_kfree(priv->dev,
3490 priv->ring_data[i + h->kinfo.num_tqps].ring); 3505 priv->ring_data[i + h->kinfo.num_tqps].ring);
3491 } 3506 }
3492 devm_kfree(priv->dev, priv->ring_data); 3507 devm_kfree(priv->dev, priv->ring_data);
3508 priv->ring_data = NULL;
3493} 3509}
3494 3510
3495static int hns3_alloc_ring_memory(struct hns3_enet_ring *ring) 3511static int hns3_alloc_ring_memory(struct hns3_enet_ring *ring)
@@ -3909,8 +3925,6 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
3909 3925
3910 hns3_dbg_uninit(handle); 3926 hns3_dbg_uninit(handle);
3911 3927
3912 priv->ring_data = NULL;
3913
3914out_netdev_free: 3928out_netdev_free:
3915 free_netdev(netdev); 3929 free_netdev(netdev);
3916} 3930}
@@ -4257,12 +4271,10 @@ err_uninit_ring:
4257 hns3_uninit_all_ring(priv); 4271 hns3_uninit_all_ring(priv);
4258err_uninit_vector: 4272err_uninit_vector:
4259 hns3_nic_uninit_vector_data(priv); 4273 hns3_nic_uninit_vector_data(priv);
4260 priv->ring_data = NULL;
4261err_dealloc_vector: 4274err_dealloc_vector:
4262 hns3_nic_dealloc_vector_data(priv); 4275 hns3_nic_dealloc_vector_data(priv);
4263err_put_ring: 4276err_put_ring:
4264 hns3_put_ring_config(priv); 4277 hns3_put_ring_config(priv);
4265 priv->ring_data = NULL;
4266 4278
4267 return ret; 4279 return ret;
4268} 4280}
@@ -4324,7 +4336,6 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
4324 netdev_err(netdev, "uninit ring error\n"); 4336 netdev_err(netdev, "uninit ring error\n");
4325 4337
4326 hns3_put_ring_config(priv); 4338 hns3_put_ring_config(priv);
4327 priv->ring_data = NULL;
4328 4339
4329 return ret; 4340 return ret;
4330} 4341}
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
index cec56a505e85..2b4f5ea3fddf 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
@@ -581,8 +581,11 @@ union l4_hdr_info {
581 581
582static inline int ring_space(struct hns3_enet_ring *ring) 582static inline int ring_space(struct hns3_enet_ring *ring)
583{ 583{
584 int begin = ring->next_to_clean; 584 /* This smp_load_acquire() pairs with smp_store_release() in
585 int end = ring->next_to_use; 585 * hns3_nic_reclaim_one_desc called by hns3_clean_tx_ring.
586 */
587 int begin = smp_load_acquire(&ring->next_to_clean);
588 int end = READ_ONCE(ring->next_to_use);
586 589
587 return ((end >= begin) ? (ring->desc_num - end + begin) : 590 return ((end >= begin) ? (ring->desc_num - end + begin) :
588 (begin - end)) - 1; 591 (begin - end)) - 1;
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
index 804c87041cf7..4ac80634c984 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
@@ -1653,8 +1653,6 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
1653 if (ret) { 1653 if (ret) {
1654 dev_err(dev, "fail(%d) to query msix int status bd num\n", 1654 dev_err(dev, "fail(%d) to query msix int status bd num\n",
1655 ret); 1655 ret);
1656 /* reset everything for now */
1657 set_bit(HNAE3_GLOBAL_RESET, reset_requests);
1658 return ret; 1656 return ret;
1659 } 1657 }
1660 1658
@@ -1675,8 +1673,6 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
1675 if (ret) { 1673 if (ret) {
1676 dev_err(dev, "query all mpf msix int cmd failed (%d)\n", 1674 dev_err(dev, "query all mpf msix int cmd failed (%d)\n",
1677 ret); 1675 ret);
1678 /* reset everything for now */
1679 set_bit(HNAE3_GLOBAL_RESET, reset_requests);
1680 goto msi_error; 1676 goto msi_error;
1681 } 1677 }
1682 1678
@@ -1710,8 +1706,6 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
1710 if (ret) { 1706 if (ret) {
1711 dev_err(dev, "clear all mpf msix int cmd failed (%d)\n", 1707 dev_err(dev, "clear all mpf msix int cmd failed (%d)\n",
1712 ret); 1708 ret);
1713 /* reset everything for now */
1714 set_bit(HNAE3_GLOBAL_RESET, reset_requests);
1715 goto msi_error; 1709 goto msi_error;
1716 } 1710 }
1717 1711
@@ -1725,8 +1719,6 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
1725 if (ret) { 1719 if (ret) {
1726 dev_err(dev, "query all pf msix int cmd failed (%d)\n", 1720 dev_err(dev, "query all pf msix int cmd failed (%d)\n",
1727 ret); 1721 ret);
1728 /* reset everything for now */
1729 set_bit(HNAE3_GLOBAL_RESET, reset_requests);
1730 goto msi_error; 1722 goto msi_error;
1731 } 1723 }
1732 1724
@@ -1767,8 +1759,6 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
1767 if (ret) { 1759 if (ret) {
1768 dev_err(dev, "clear all pf msix int cmd failed (%d)\n", 1760 dev_err(dev, "clear all pf msix int cmd failed (%d)\n",
1769 ret); 1761 ret);
1770 /* reset everything for now */
1771 set_bit(HNAE3_GLOBAL_RESET, reset_requests);
1772 } 1762 }
1773 1763
1774 /* query and clear mac tnl interruptions */ 1764 /* query and clear mac tnl interruptions */
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
index 4d5568ede04e..effe89fa10dd 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -5337,8 +5337,8 @@ static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en,
5337#define HCLGE_SERDES_RETRY_MS 10 5337#define HCLGE_SERDES_RETRY_MS 10
5338#define HCLGE_SERDES_RETRY_NUM 100 5338#define HCLGE_SERDES_RETRY_NUM 100
5339 5339
5340#define HCLGE_MAC_LINK_STATUS_MS 20 5340#define HCLGE_MAC_LINK_STATUS_MS 10
5341#define HCLGE_MAC_LINK_STATUS_NUM 10 5341#define HCLGE_MAC_LINK_STATUS_NUM 100
5342#define HCLGE_MAC_LINK_STATUS_DOWN 0 5342#define HCLGE_MAC_LINK_STATUS_DOWN 0
5343#define HCLGE_MAC_LINK_STATUS_UP 1 5343#define HCLGE_MAC_LINK_STATUS_UP 1
5344 5344
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
index 24386bd894f7..fe48c5634a87 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
@@ -212,8 +212,7 @@ static int hclge_set_vf_promisc_mode(struct hclge_vport *vport,
212} 212}
213 213
214static int hclge_set_vf_uc_mac_addr(struct hclge_vport *vport, 214static int hclge_set_vf_uc_mac_addr(struct hclge_vport *vport,
215 struct hclge_mbx_vf_to_pf_cmd *mbx_req, 215 struct hclge_mbx_vf_to_pf_cmd *mbx_req)
216 bool gen_resp)
217{ 216{
218 const u8 *mac_addr = (const u8 *)(&mbx_req->msg[2]); 217 const u8 *mac_addr = (const u8 *)(&mbx_req->msg[2]);
219 struct hclge_dev *hdev = vport->back; 218 struct hclge_dev *hdev = vport->back;
@@ -249,7 +248,7 @@ static int hclge_set_vf_uc_mac_addr(struct hclge_vport *vport,
249 return -EIO; 248 return -EIO;
250 } 249 }
251 250
252 if (gen_resp) 251 if (mbx_req->mbx_need_resp & HCLGE_MBX_NEED_RESP_BIT)
253 hclge_gen_resp_to_vf(vport, mbx_req, status, NULL, 0); 252 hclge_gen_resp_to_vf(vport, mbx_req, status, NULL, 0);
254 253
255 return 0; 254 return 0;
@@ -597,7 +596,7 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
597 ret); 596 ret);
598 break; 597 break;
599 case HCLGE_MBX_SET_UNICAST: 598 case HCLGE_MBX_SET_UNICAST:
600 ret = hclge_set_vf_uc_mac_addr(vport, req, true); 599 ret = hclge_set_vf_uc_mac_addr(vport, req);
601 if (ret) 600 if (ret)
602 dev_err(&hdev->pdev->dev, 601 dev_err(&hdev->pdev->dev,
603 "PF fail(%d) to set VF UC MAC Addr\n", 602 "PF fail(%d) to set VF UC MAC Addr\n",
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
index aafc69f4bfdd..a7bbb6d3091a 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
@@ -1331,8 +1331,11 @@ int hclge_pause_setup_hw(struct hclge_dev *hdev, bool init)
1331 ret = hclge_pfc_setup_hw(hdev); 1331 ret = hclge_pfc_setup_hw(hdev);
1332 if (init && ret == -EOPNOTSUPP) 1332 if (init && ret == -EOPNOTSUPP)
1333 dev_warn(&hdev->pdev->dev, "GE MAC does not support pfc\n"); 1333 dev_warn(&hdev->pdev->dev, "GE MAC does not support pfc\n");
1334 else 1334 else if (ret) {
1335 dev_err(&hdev->pdev->dev, "config pfc failed! ret = %d\n",
1336 ret);
1335 return ret; 1337 return ret;
1338 }
1336 1339
1337 return hclge_tm_bp_setup(hdev); 1340 return hclge_tm_bp_setup(hdev);
1338} 1341}
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
index 1b428d4a1132..71f356fc2446 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
@@ -340,7 +340,7 @@ int hclgevf_cmd_init(struct hclgevf_dev *hdev)
340 hdev->arq.hdev = hdev; 340 hdev->arq.hdev = hdev;
341 hdev->arq.head = 0; 341 hdev->arq.head = 0;
342 hdev->arq.tail = 0; 342 hdev->arq.tail = 0;
343 hdev->arq.count = 0; 343 atomic_set(&hdev->arq.count, 0);
344 hdev->hw.cmq.csq.next_to_clean = 0; 344 hdev->hw.cmq.csq.next_to_clean = 0;
345 hdev->hw.cmq.csq.next_to_use = 0; 345 hdev->hw.cmq.csq.next_to_use = 0;
346 hdev->hw.cmq.crq.next_to_clean = 0; 346 hdev->hw.cmq.crq.next_to_clean = 0;
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
index f9d98f8863ad..6ce5b036fbf4 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
@@ -1758,7 +1758,7 @@ static void hclgevf_keep_alive_task(struct work_struct *work)
1758 1758
1759 hdev = container_of(work, struct hclgevf_dev, keep_alive_task); 1759 hdev = container_of(work, struct hclgevf_dev, keep_alive_task);
1760 1760
1761 if (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state)) 1761 if (test_bit(HCLGEVF_STATE_CMD_DISABLE, &hdev->state))
1762 return; 1762 return;
1763 1763
1764 ret = hclgevf_send_mbx_msg(hdev, HCLGE_MBX_KEEP_ALIVE, 0, NULL, 1764 ret = hclgevf_send_mbx_msg(hdev, HCLGE_MBX_KEEP_ALIVE, 0, NULL,
@@ -2050,8 +2050,10 @@ static void hclgevf_ae_stop(struct hnae3_handle *handle)
2050 2050
2051 set_bit(HCLGEVF_STATE_DOWN, &hdev->state); 2051 set_bit(HCLGEVF_STATE_DOWN, &hdev->state);
2052 2052
2053 for (i = 0; i < handle->kinfo.num_tqps; i++) 2053 if (hdev->reset_type != HNAE3_VF_RESET)
2054 hclgevf_reset_tqp(handle, i); 2054 for (i = 0; i < handle->kinfo.num_tqps; i++)
2055 if (hclgevf_reset_tqp(handle, i))
2056 break;
2055 2057
2056 /* reset tqp stats */ 2058 /* reset tqp stats */
2057 hclgevf_reset_tqp_stats(handle); 2059 hclgevf_reset_tqp_stats(handle);
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
index eb5628794d23..30f2e9352cf3 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
@@ -98,6 +98,8 @@ int hclgevf_send_mbx_msg(struct hclgevf_dev *hdev, u16 code, u16 subcode,
98 } 98 }
99 99
100 hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_MBX_VF_TO_PF, false); 100 hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_MBX_VF_TO_PF, false);
101 req->mbx_need_resp |= need_resp ? HCLGE_MBX_NEED_RESP_BIT :
102 ~HCLGE_MBX_NEED_RESP_BIT;
101 req->msg[0] = code; 103 req->msg[0] = code;
102 req->msg[1] = subcode; 104 req->msg[1] = subcode;
103 memcpy(&req->msg[2], msg_data, msg_len); 105 memcpy(&req->msg[2], msg_data, msg_len);
@@ -212,7 +214,8 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
212 /* we will drop the async msg if we find ARQ as full 214 /* we will drop the async msg if we find ARQ as full
213 * and continue with next message 215 * and continue with next message
214 */ 216 */
215 if (hdev->arq.count >= HCLGE_MBX_MAX_ARQ_MSG_NUM) { 217 if (atomic_read(&hdev->arq.count) >=
218 HCLGE_MBX_MAX_ARQ_MSG_NUM) {
216 dev_warn(&hdev->pdev->dev, 219 dev_warn(&hdev->pdev->dev,
217 "Async Q full, dropping msg(%d)\n", 220 "Async Q full, dropping msg(%d)\n",
218 req->msg[1]); 221 req->msg[1]);
@@ -224,7 +227,7 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
224 memcpy(&msg_q[0], req->msg, 227 memcpy(&msg_q[0], req->msg,
225 HCLGE_MBX_MAX_ARQ_MSG_SIZE * sizeof(u16)); 228 HCLGE_MBX_MAX_ARQ_MSG_SIZE * sizeof(u16));
226 hclge_mbx_tail_ptr_move_arq(hdev->arq); 229 hclge_mbx_tail_ptr_move_arq(hdev->arq);
227 hdev->arq.count++; 230 atomic_inc(&hdev->arq.count);
228 231
229 hclgevf_mbx_task_schedule(hdev); 232 hclgevf_mbx_task_schedule(hdev);
230 233
@@ -317,7 +320,7 @@ void hclgevf_mbx_async_handler(struct hclgevf_dev *hdev)
317 } 320 }
318 321
319 hclge_mbx_head_ptr_move_arq(hdev->arq); 322 hclge_mbx_head_ptr_move_arq(hdev->arq);
320 hdev->arq.count--; 323 atomic_dec(&hdev->arq.count);
321 msg_q = hdev->arq.msg_q[hdev->arq.head]; 324 msg_q = hdev->arq.msg_q[hdev->arq.head];
322 } 325 }
323} 326}