···42104210 }4211421142124212out:42134213+ /* sync head pointer before exiting, since hardware will calculate42144214+ * FBD number with head pointer42154215+ */42164216+ if (unused_count > 0)42174217+ failure = failure ||42184218+ hns3_nic_alloc_rx_buffers(ring, unused_count);42194219+42134220 return failure ? budget : recv_pkts;42144221}42154222
···2626#include "hclge_devlink.h"27272828#define HCLGE_NAME "hclge"2929-#define HCLGE_STATS_READ(p, offset) (*(u64 *)((u8 *)(p) + (offset)))3030-#define HCLGE_MAC_STATS_FIELD_OFF(f) (offsetof(struct hclge_mac_stats, f))31293230#define HCLGE_BUF_SIZE_UNIT 256U3331#define HCLGE_BUF_MUL_BY 2···566568 struct hclge_desc desc;567569 int ret;568570571571+ /* Driver needs total register number of both valid registers and572572+ * reserved registers, but the old firmware only returns number573573+ * of valid registers in device V2. To be compatible with these574574+ * devices, driver uses a fixed value.575575+ */576576+ if (hdev->ae_dev->dev_version == HNAE3_DEVICE_VERSION_V2) {577577+ *reg_num = HCLGE_MAC_STATS_MAX_NUM_V1;578578+ return 0;579579+ }580580+569581 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_MAC_REG_NUM, true);570582 ret = hclge_cmd_send(&hdev->hw, &desc, 1);571583 if (ret) {···595587 return 0;596588}597589598598-static int hclge_mac_update_stats(struct hclge_dev *hdev)590590+int hclge_mac_update_stats(struct hclge_dev *hdev)599591{600592 /* The firmware supports the new statistics acquisition method */601593 if (hdev->ae_dev->dev_specs.mac_stats_num)···25892581 if (hdev->num_msi < hdev->num_nic_msi + hdev->num_roce_msi)25902582 return -EINVAL;2591258325922592- roce->rinfo.base_vector = hdev->roce_base_vector;25842584+ roce->rinfo.base_vector = hdev->num_nic_msi;2593258525942586 roce->rinfo.netdev = nic->kinfo.netdev;25952587 roce->rinfo.roce_io_base = hdev->hw.io_base;···2624261626252617 hdev->num_msi = vectors;26262618 hdev->num_msi_left = vectors;26272627-26282628- hdev->base_msi_vector = pdev->irq;26292629- hdev->roce_base_vector = hdev->base_msi_vector +26302630- hdev->num_nic_msi;2631261926322620 hdev->vector_status = devm_kcalloc(&pdev->dev, hdev->num_msi,26332621 sizeof(u16), GFP_KERNEL);···8953894989548950err_no_space:89558951 /* if already overflow, not to print each time */89568956- if (!(vport->overflow_promisc_flags & HNAE3_OVERFLOW_MPE))89528952+ if (!(vport->overflow_promisc_flags & HNAE3_OVERFLOW_MPE)) {89538953+ vport->overflow_promisc_flags |= HNAE3_OVERFLOW_MPE;89578954 dev_err(&hdev->pdev->dev, "mc mac vlan table is full\n");89558955+ }89568956+89588957 return -ENOSPC;89598958}89608959···9013900690149007static void hclge_sync_vport_mac_list(struct hclge_vport *vport,90159008 struct list_head *list,90169016- int (*sync)(struct hclge_vport *,90179017- const unsigned char *))90099009+ enum HCLGE_MAC_ADDR_TYPE mac_type)90189010{90119011+ int (*sync)(struct hclge_vport *vport, const unsigned char *addr);90199012 struct hclge_mac_node *mac_node, *tmp;90209013 int ret;90149014+90159015+ if (mac_type == HCLGE_MAC_ADDR_UC)90169016+ sync = hclge_add_uc_addr_common;90179017+ else90189018+ sync = hclge_add_mc_addr_common;9021901990229020 list_for_each_entry_safe(mac_node, tmp, list, node) {90239021 ret = sync(vport, mac_node->mac_addr);···90359023 /* If one unicast mac address is existing in hardware,90369024 * we need to try whether other unicast mac addresses90379025 * are new addresses that can be added.90269026+ * Multicast mac address can be reusable, even though90279027+ * there is no space to add new multicast mac address,90289028+ * we should check whether other mac addresses are90299029+ * existing in hardware for reuse.90389030 */90399039- if (ret != -EEXIST)90319031+ if ((mac_type == HCLGE_MAC_ADDR_UC && ret != -EEXIST) ||90329032+ (mac_type == HCLGE_MAC_ADDR_MC && ret != -ENOSPC))90409033 break;90419034 }90429035 }···9049903290509033static void hclge_unsync_vport_mac_list(struct hclge_vport *vport,90519034 struct list_head *list,90529052- int (*unsync)(struct hclge_vport *,90539053- const unsigned char *))90359035+ enum HCLGE_MAC_ADDR_TYPE mac_type)90549036{90379037+ int (*unsync)(struct hclge_vport *vport, const unsigned char *addr);90559038 struct hclge_mac_node *mac_node, *tmp;90569039 int ret;90409040+90419041+ if (mac_type == HCLGE_MAC_ADDR_UC)90429042+ unsync = hclge_rm_uc_addr_common;90439043+ else90449044+ unsync = hclge_rm_mc_addr_common;9057904590589046 list_for_each_entry_safe(mac_node, tmp, list, node) {90599047 ret = unsync(vport, mac_node->mac_addr);···91909168 spin_unlock_bh(&vport->mac_list_lock);9191916991929170 /* delete first, in order to get max mac table space for adding */91939193- if (mac_type == HCLGE_MAC_ADDR_UC) {91949194- hclge_unsync_vport_mac_list(vport, &tmp_del_list,91959195- hclge_rm_uc_addr_common);91969196- hclge_sync_vport_mac_list(vport, &tmp_add_list,91979197- hclge_add_uc_addr_common);91989198- } else {91999199- hclge_unsync_vport_mac_list(vport, &tmp_del_list,92009200- hclge_rm_mc_addr_common);92019201- hclge_sync_vport_mac_list(vport, &tmp_add_list,92029202- hclge_add_mc_addr_common);92039203- }91719171+ hclge_unsync_vport_mac_list(vport, &tmp_del_list, mac_type);91729172+ hclge_sync_vport_mac_list(vport, &tmp_add_list, mac_type);9204917392059174 /* if some mac addresses were added/deleted fail, move back to the92069175 * mac_list, and retry at next time.···9350933793519338 spin_unlock_bh(&vport->mac_list_lock);9352933993539353- if (mac_type == HCLGE_MAC_ADDR_UC)93549354- hclge_unsync_vport_mac_list(vport, &tmp_del_list,93559355- hclge_rm_uc_addr_common);93569356- else93579357- hclge_unsync_vport_mac_list(vport, &tmp_del_list,93589358- hclge_rm_mc_addr_common);93409340+ hclge_unsync_vport_mac_list(vport, &tmp_del_list, mac_type);9359934193609342 if (!list_empty(&tmp_del_list))93619343 dev_warn(&hdev->pdev->dev,···94189410 return return_status;94199411}9420941294219421-static bool hclge_check_vf_mac_exist(struct hclge_vport *vport, int vf_idx,94229422- u8 *mac_addr)94239423-{94249424- struct hclge_mac_vlan_tbl_entry_cmd req;94259425- struct hclge_dev *hdev = vport->back;94269426- struct hclge_desc desc;94279427- u16 egress_port = 0;94289428- int i;94299429-94309430- if (is_zero_ether_addr(mac_addr))94319431- return false;94329432-94339433- memset(&req, 0, sizeof(req));94349434- hnae3_set_field(egress_port, HCLGE_MAC_EPORT_VFID_M,94359435- HCLGE_MAC_EPORT_VFID_S, vport->vport_id);94369436- req.egress_port = cpu_to_le16(egress_port);94379437- hclge_prepare_mac_addr(&req, mac_addr, false);94389438-94399439- if (hclge_lookup_mac_vlan_tbl(vport, &req, &desc, false) != -ENOENT)94409440- return true;94419441-94429442- vf_idx += HCLGE_VF_VPORT_START_NUM;94439443- for (i = HCLGE_VF_VPORT_START_NUM; i < hdev->num_alloc_vport; i++)94449444- if (i != vf_idx &&94459445- ether_addr_equal(mac_addr, hdev->vport[i].vf_info.mac))94469446- return true;94479447-94489448- return false;94499449-}94509450-94519413static int hclge_set_vf_mac(struct hnae3_handle *handle, int vf,94529414 u8 *mac_addr)94539415{···94339455 "Specified MAC(=%pM) is same as before, no change committed!\n",94349456 mac_addr);94359457 return 0;94369436- }94379437-94389438- if (hclge_check_vf_mac_exist(vport, vf, mac_addr)) {94399439- dev_err(&hdev->pdev->dev, "Specified MAC(=%pM) exists!\n",94409440- mac_addr);94419441- return -EEXIST;94429458 }9443945994449460 ether_addr_copy(vport->vf_info.mac, mac_addr);
···404404};405405406406/* max number of mac statistics on each version */407407-#define HCLGE_MAC_STATS_MAX_NUM_V1 84407407+#define HCLGE_MAC_STATS_MAX_NUM_V1 87408408#define HCLGE_MAC_STATS_MAX_NUM_V2 105409409410410struct hclge_comm_stats_str {···852852 (y) = (_k_ ^ ~_v_) & (_k_); \853853 } while (0)854854855855+#define HCLGE_MAC_STATS_FIELD_OFF(f) (offsetof(struct hclge_mac_stats, f))856856+#define HCLGE_STATS_READ(p, offset) (*(u64 *)((u8 *)(p) + (offset)))857857+855858#define HCLGE_MAC_TNL_LOG_SIZE 8856859#define HCLGE_VPORT_NUM 256857860struct hclge_dev {···907904 u16 num_msi;908905 u16 num_msi_left;909906 u16 num_msi_used;910910- u32 base_msi_vector;911907 u16 *vector_status;912908 int *vector_irq;913909 u16 num_nic_msi; /* Num of nic vectors for this PF */914910 u16 num_roce_msi; /* Num of roce vectors for this PF */915915- int roce_base_vector;916911917912 unsigned long service_timer_period;918913 unsigned long service_timer_previous;···11691168int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len);11701169int hclge_push_vf_link_status(struct hclge_vport *vport);11711170int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en);11711171+int hclge_mac_update_stats(struct hclge_dev *hdev);11721172#endif
···109109#define HCLGEVF_VF_RST_ING 0x07008110110#define HCLGEVF_VF_RST_ING_BIT BIT(16)111111112112+#define HCLGEVF_WAIT_RESET_DONE 100113113+112114#define HCLGEVF_RSS_IND_TBL_SIZE 512113115#define HCLGEVF_RSS_SET_BITMAP_MSK 0xffff114116#define HCLGEVF_RSS_KEY_SIZE 40···310308 u16 num_nic_msix; /* Num of nic vectors for this VF */311309 u16 num_roce_msix; /* Num of roce vectors for this VF */312310 u16 roce_base_msix_offset;313313- int roce_base_vector;314314- u32 base_msi_vector;315311 u16 *vector_status;316312 int *vector_irq;317313