diff options
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 { | |||
| 84 | struct hclge_mbx_vf_to_pf_cmd { | 84 | struct 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 | |||
| 93 | struct hclge_mbx_pf_to_vf_cmd { | 96 | struct 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) | |||
| 2214 | static void hns3_nic_reclaim_one_desc(struct hns3_enet_ring *ring, int *bytes, | 2214 | static 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 | ||
| 2227 | static int is_valid_clean_head(struct hns3_enet_ring *ring, int h) | 2235 | static 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 | ||
| 2691 | static void hns3_set_rx_skb_rss_type(struct hns3_enet_ring *ring, | 2699 | static 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 | ||
| 2713 | static int hns3_handle_bdinfo(struct hns3_enet_ring *ring, struct sk_buff *skb, | 2713 | static 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 | ||
| 3495 | static int hns3_alloc_ring_memory(struct hns3_enet_ring *ring) | 3511 | static 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 | |||
| 3914 | out_netdev_free: | 3928 | out_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); |
| 4258 | err_uninit_vector: | 4272 | err_uninit_vector: |
| 4259 | hns3_nic_uninit_vector_data(priv); | 4273 | hns3_nic_uninit_vector_data(priv); |
| 4260 | priv->ring_data = NULL; | ||
| 4261 | err_dealloc_vector: | 4274 | err_dealloc_vector: |
| 4262 | hns3_nic_dealloc_vector_data(priv); | 4275 | hns3_nic_dealloc_vector_data(priv); |
| 4263 | err_put_ring: | 4276 | err_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 | ||
| 582 | static inline int ring_space(struct hns3_enet_ring *ring) | 582 | static 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 | ||
| 214 | static int hclge_set_vf_uc_mac_addr(struct hclge_vport *vport, | 214 | static 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 | } |
