3398 lines · c
1// SPDX-License-Identifier: GPL-2.0+2// Copyright (c) 2016-2017 Hisilicon Limited.3 4#include <linux/etherdevice.h>5#include <linux/iopoll.h>6#include <net/rtnetlink.h>7#include "hclgevf_cmd.h"8#include "hclgevf_main.h"9#include "hclgevf_regs.h"10#include "hclge_mbx.h"11#include "hnae3.h"12#include "hclgevf_devlink.h"13#include "hclge_comm_rss.h"14#include "hclgevf_trace.h"15 16#define HCLGEVF_NAME "hclgevf"17 18#define HCLGEVF_RESET_MAX_FAIL_CNT 519 20static int hclgevf_reset_hdev(struct hclgevf_dev *hdev);21static void hclgevf_task_schedule(struct hclgevf_dev *hdev,22 unsigned long delay);23 24static struct hnae3_ae_algo ae_algovf;25 26static struct workqueue_struct *hclgevf_wq;27 28static const struct pci_device_id ae_algovf_pci_tbl[] = {29 {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_VF), 0},30 {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_RDMA_DCB_PFC_VF),31 HNAE3_DEV_SUPPORT_ROCE_DCB_BITS},32 /* required last entry */33 {0, }34};35 36MODULE_DEVICE_TABLE(pci, ae_algovf_pci_tbl);37 38/* hclgevf_cmd_send - send command to command queue39 * @hw: pointer to the hw struct40 * @desc: prefilled descriptor for describing the command41 * @num : the number of descriptors to be sent42 *43 * This is the main send command for command queue, it44 * sends the queue, cleans the queue, etc45 */46int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclge_desc *desc, int num)47{48 return hclge_comm_cmd_send(&hw->hw, desc, num);49}50 51static void hclgevf_trace_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,52 int num, bool is_special)53{54 int i;55 56 trace_hclge_vf_cmd_send(hw, desc, 0, num);57 58 if (is_special)59 return;60 61 for (i = 1; i < num; i++)62 trace_hclge_vf_cmd_send(hw, &desc[i], i, num);63}64 65static void hclgevf_trace_cmd_get(struct hclge_comm_hw *hw, struct hclge_desc *desc,66 int num, bool is_special)67{68 int i;69 70 if (!HCLGE_COMM_SEND_SYNC(le16_to_cpu(desc->flag)))71 return;72 73 trace_hclge_vf_cmd_get(hw, desc, 0, num);74 75 if (is_special)76 return;77 78 for (i = 1; i < num; i++)79 trace_hclge_vf_cmd_get(hw, &desc[i], i, num);80}81 82static const struct hclge_comm_cmq_ops hclgevf_cmq_ops = {83 .trace_cmd_send = hclgevf_trace_cmd_send,84 .trace_cmd_get = hclgevf_trace_cmd_get,85};86 87void hclgevf_arq_init(struct hclgevf_dev *hdev)88{89 struct hclge_comm_cmq *cmdq = &hdev->hw.hw.cmq;90 91 spin_lock(&cmdq->crq.lock);92 /* initialize the pointers of async rx queue of mailbox */93 hdev->arq.hdev = hdev;94 hdev->arq.head = 0;95 hdev->arq.tail = 0;96 atomic_set(&hdev->arq.count, 0);97 spin_unlock(&cmdq->crq.lock);98}99 100struct hclgevf_dev *hclgevf_ae_get_hdev(struct hnae3_handle *handle)101{102 if (!handle->client)103 return container_of(handle, struct hclgevf_dev, nic);104 else if (handle->client->type == HNAE3_CLIENT_ROCE)105 return container_of(handle, struct hclgevf_dev, roce);106 else107 return container_of(handle, struct hclgevf_dev, nic);108}109 110static void hclgevf_update_stats(struct hnae3_handle *handle)111{112 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);113 int status;114 115 status = hclge_comm_tqps_update_stats(handle, &hdev->hw.hw);116 if (status)117 dev_err(&hdev->pdev->dev,118 "VF update of TQPS stats fail, status = %d.\n",119 status);120}121 122static int hclgevf_get_sset_count(struct hnae3_handle *handle, int strset)123{124 if (strset == ETH_SS_TEST)125 return -EOPNOTSUPP;126 else if (strset == ETH_SS_STATS)127 return hclge_comm_tqps_get_sset_count(handle);128 129 return 0;130}131 132static void hclgevf_get_strings(struct hnae3_handle *handle, u32 strset,133 u8 *data)134{135 u8 *p = (char *)data;136 137 if (strset == ETH_SS_STATS)138 p = hclge_comm_tqps_get_strings(handle, p);139}140 141static void hclgevf_get_stats(struct hnae3_handle *handle, u64 *data)142{143 hclge_comm_tqps_get_stats(handle, data);144}145 146static void hclgevf_build_send_msg(struct hclge_vf_to_pf_msg *msg, u8 code,147 u8 subcode)148{149 if (msg) {150 memset(msg, 0, sizeof(struct hclge_vf_to_pf_msg));151 msg->code = code;152 msg->subcode = subcode;153 }154}155 156static int hclgevf_get_basic_info(struct hclgevf_dev *hdev)157{158 struct hnae3_ae_dev *ae_dev = hdev->ae_dev;159 u8 resp_msg[HCLGE_MBX_MAX_RESP_DATA_SIZE];160 struct hclge_basic_info *basic_info;161 struct hclge_vf_to_pf_msg send_msg;162 unsigned long caps;163 int status;164 165 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_GET_BASIC_INFO, 0);166 status = hclgevf_send_mbx_msg(hdev, &send_msg, true, resp_msg,167 sizeof(resp_msg));168 if (status) {169 dev_err(&hdev->pdev->dev,170 "failed to get basic info from pf, ret = %d", status);171 return status;172 }173 174 basic_info = (struct hclge_basic_info *)resp_msg;175 176 hdev->hw_tc_map = basic_info->hw_tc_map;177 hdev->mbx_api_version = le16_to_cpu(basic_info->mbx_api_version);178 caps = le32_to_cpu(basic_info->pf_caps);179 if (test_bit(HNAE3_PF_SUPPORT_VLAN_FLTR_MDF_B, &caps))180 set_bit(HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, ae_dev->caps);181 182 return 0;183}184 185static int hclgevf_get_port_base_vlan_filter_state(struct hclgevf_dev *hdev)186{187 struct hnae3_handle *nic = &hdev->nic;188 struct hclge_vf_to_pf_msg send_msg;189 u8 resp_msg;190 int ret;191 192 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,193 HCLGE_MBX_GET_PORT_BASE_VLAN_STATE);194 ret = hclgevf_send_mbx_msg(hdev, &send_msg, true, &resp_msg,195 sizeof(u8));196 if (ret) {197 dev_err(&hdev->pdev->dev,198 "VF request to get port based vlan state failed %d",199 ret);200 return ret;201 }202 203 nic->port_base_vlan_state = resp_msg;204 205 return 0;206}207 208static int hclgevf_get_queue_info(struct hclgevf_dev *hdev)209{210#define HCLGEVF_TQPS_RSS_INFO_LEN 6211 212 struct hclge_mbx_vf_queue_info *queue_info;213 u8 resp_msg[HCLGEVF_TQPS_RSS_INFO_LEN];214 struct hclge_vf_to_pf_msg send_msg;215 int status;216 217 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_GET_QINFO, 0);218 status = hclgevf_send_mbx_msg(hdev, &send_msg, true, resp_msg,219 HCLGEVF_TQPS_RSS_INFO_LEN);220 if (status) {221 dev_err(&hdev->pdev->dev,222 "VF request to get tqp info from PF failed %d",223 status);224 return status;225 }226 227 queue_info = (struct hclge_mbx_vf_queue_info *)resp_msg;228 hdev->num_tqps = le16_to_cpu(queue_info->num_tqps);229 hdev->rss_size_max = le16_to_cpu(queue_info->rss_size);230 hdev->rx_buf_len = le16_to_cpu(queue_info->rx_buf_len);231 232 return 0;233}234 235static int hclgevf_get_queue_depth(struct hclgevf_dev *hdev)236{237#define HCLGEVF_TQPS_DEPTH_INFO_LEN 4238 239 struct hclge_mbx_vf_queue_depth *queue_depth;240 u8 resp_msg[HCLGEVF_TQPS_DEPTH_INFO_LEN];241 struct hclge_vf_to_pf_msg send_msg;242 int ret;243 244 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_GET_QDEPTH, 0);245 ret = hclgevf_send_mbx_msg(hdev, &send_msg, true, resp_msg,246 HCLGEVF_TQPS_DEPTH_INFO_LEN);247 if (ret) {248 dev_err(&hdev->pdev->dev,249 "VF request to get tqp depth info from PF failed %d",250 ret);251 return ret;252 }253 254 queue_depth = (struct hclge_mbx_vf_queue_depth *)resp_msg;255 hdev->num_tx_desc = le16_to_cpu(queue_depth->num_tx_desc);256 hdev->num_rx_desc = le16_to_cpu(queue_depth->num_rx_desc);257 258 return 0;259}260 261static u16 hclgevf_get_qid_global(struct hnae3_handle *handle, u16 queue_id)262{263 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);264 struct hclge_vf_to_pf_msg send_msg;265 u16 qid_in_pf = 0;266 u8 resp_data[2];267 int ret;268 269 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_GET_QID_IN_PF, 0);270 *(__le16 *)send_msg.data = cpu_to_le16(queue_id);271 ret = hclgevf_send_mbx_msg(hdev, &send_msg, true, resp_data,272 sizeof(resp_data));273 if (!ret)274 qid_in_pf = le16_to_cpu(*(__le16 *)resp_data);275 276 return qid_in_pf;277}278 279static int hclgevf_get_pf_media_type(struct hclgevf_dev *hdev)280{281 struct hclge_vf_to_pf_msg send_msg;282 u8 resp_msg[2];283 int ret;284 285 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_GET_MEDIA_TYPE, 0);286 ret = hclgevf_send_mbx_msg(hdev, &send_msg, true, resp_msg,287 sizeof(resp_msg));288 if (ret) {289 dev_err(&hdev->pdev->dev,290 "VF request to get the pf port media type failed %d",291 ret);292 return ret;293 }294 295 hdev->hw.mac.media_type = resp_msg[0];296 hdev->hw.mac.module_type = resp_msg[1];297 298 return 0;299}300 301static int hclgevf_alloc_tqps(struct hclgevf_dev *hdev)302{303 struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);304 struct hclge_comm_tqp *tqp;305 int i;306 307 hdev->htqp = devm_kcalloc(&hdev->pdev->dev, hdev->num_tqps,308 sizeof(struct hclge_comm_tqp), GFP_KERNEL);309 if (!hdev->htqp)310 return -ENOMEM;311 312 tqp = hdev->htqp;313 314 for (i = 0; i < hdev->num_tqps; i++) {315 tqp->dev = &hdev->pdev->dev;316 tqp->index = i;317 318 tqp->q.ae_algo = &ae_algovf;319 tqp->q.buf_size = hdev->rx_buf_len;320 tqp->q.tx_desc_num = hdev->num_tx_desc;321 tqp->q.rx_desc_num = hdev->num_rx_desc;322 323 /* need an extended offset to configure queues >=324 * HCLGEVF_TQP_MAX_SIZE_DEV_V2.325 */326 if (i < HCLGEVF_TQP_MAX_SIZE_DEV_V2)327 tqp->q.io_base = hdev->hw.hw.io_base +328 HCLGEVF_TQP_REG_OFFSET +329 i * HCLGEVF_TQP_REG_SIZE;330 else331 tqp->q.io_base = hdev->hw.hw.io_base +332 HCLGEVF_TQP_REG_OFFSET +333 HCLGEVF_TQP_EXT_REG_OFFSET +334 (i - HCLGEVF_TQP_MAX_SIZE_DEV_V2) *335 HCLGEVF_TQP_REG_SIZE;336 337 /* when device supports tx push and has device memory,338 * the queue can execute push mode or doorbell mode on339 * device memory.340 */341 if (test_bit(HNAE3_DEV_SUPPORT_TX_PUSH_B, ae_dev->caps))342 tqp->q.mem_base = hdev->hw.hw.mem_base +343 HCLGEVF_TQP_MEM_OFFSET(hdev, i);344 345 tqp++;346 }347 348 return 0;349}350 351static int hclgevf_knic_setup(struct hclgevf_dev *hdev)352{353 struct hnae3_handle *nic = &hdev->nic;354 struct hnae3_knic_private_info *kinfo;355 u16 new_tqps = hdev->num_tqps;356 unsigned int i;357 u8 num_tc = 0;358 359 kinfo = &nic->kinfo;360 kinfo->num_tx_desc = hdev->num_tx_desc;361 kinfo->num_rx_desc = hdev->num_rx_desc;362 kinfo->rx_buf_len = hdev->rx_buf_len;363 for (i = 0; i < HCLGE_COMM_MAX_TC_NUM; i++)364 if (hdev->hw_tc_map & BIT(i))365 num_tc++;366 367 num_tc = num_tc ? num_tc : 1;368 kinfo->tc_info.num_tc = num_tc;369 kinfo->rss_size = min_t(u16, hdev->rss_size_max, new_tqps / num_tc);370 new_tqps = kinfo->rss_size * num_tc;371 kinfo->num_tqps = min(new_tqps, hdev->num_tqps);372 373 kinfo->tqp = devm_kcalloc(&hdev->pdev->dev, kinfo->num_tqps,374 sizeof(struct hnae3_queue *), GFP_KERNEL);375 if (!kinfo->tqp)376 return -ENOMEM;377 378 for (i = 0; i < kinfo->num_tqps; i++) {379 hdev->htqp[i].q.handle = &hdev->nic;380 hdev->htqp[i].q.tqp_index = i;381 kinfo->tqp[i] = &hdev->htqp[i].q;382 }383 384 /* after init the max rss_size and tqps, adjust the default tqp numbers385 * and rss size with the actual vector numbers386 */387 kinfo->num_tqps = min_t(u16, hdev->num_nic_msix - 1, kinfo->num_tqps);388 kinfo->rss_size = min_t(u16, kinfo->num_tqps / num_tc,389 kinfo->rss_size);390 391 return 0;392}393 394static void hclgevf_request_link_info(struct hclgevf_dev *hdev)395{396 struct hclge_vf_to_pf_msg send_msg;397 int status;398 399 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_GET_LINK_STATUS, 0);400 status = hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);401 if (status)402 dev_err(&hdev->pdev->dev,403 "VF failed to fetch link status(%d) from PF", status);404}405 406void hclgevf_update_link_status(struct hclgevf_dev *hdev, int link_state)407{408 struct hnae3_handle *rhandle = &hdev->roce;409 struct hnae3_handle *handle = &hdev->nic;410 struct hnae3_client *rclient;411 struct hnae3_client *client;412 413 if (test_and_set_bit(HCLGEVF_STATE_LINK_UPDATING, &hdev->state))414 return;415 416 client = handle->client;417 rclient = hdev->roce_client;418 419 link_state =420 test_bit(HCLGEVF_STATE_DOWN, &hdev->state) ? 0 : link_state;421 if (link_state != hdev->hw.mac.link) {422 hdev->hw.mac.link = link_state;423 client->ops->link_status_change(handle, !!link_state);424 if (rclient && rclient->ops->link_status_change)425 rclient->ops->link_status_change(rhandle, !!link_state);426 }427 428 clear_bit(HCLGEVF_STATE_LINK_UPDATING, &hdev->state);429}430 431static void hclgevf_update_link_mode(struct hclgevf_dev *hdev)432{433#define HCLGEVF_ADVERTISING 0434#define HCLGEVF_SUPPORTED 1435 436 struct hclge_vf_to_pf_msg send_msg;437 438 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_GET_LINK_MODE, 0);439 send_msg.data[0] = HCLGEVF_ADVERTISING;440 hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);441 send_msg.data[0] = HCLGEVF_SUPPORTED;442 hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);443}444 445static int hclgevf_set_handle_info(struct hclgevf_dev *hdev)446{447 struct hnae3_handle *nic = &hdev->nic;448 int ret;449 450 nic->ae_algo = &ae_algovf;451 nic->pdev = hdev->pdev;452 bitmap_copy(nic->numa_node_mask.bits, hdev->numa_node_mask.bits,453 MAX_NUMNODES);454 nic->flags |= HNAE3_SUPPORT_VF;455 nic->kinfo.io_base = hdev->hw.hw.io_base;456 457 ret = hclgevf_knic_setup(hdev);458 if (ret)459 dev_err(&hdev->pdev->dev, "VF knic setup failed %d\n",460 ret);461 return ret;462}463 464static void hclgevf_free_vector(struct hclgevf_dev *hdev, int vector_id)465{466 if (hdev->vector_status[vector_id] == HCLGEVF_INVALID_VPORT) {467 dev_warn(&hdev->pdev->dev,468 "vector(vector_id %d) has been freed.\n", vector_id);469 return;470 }471 472 hdev->vector_status[vector_id] = HCLGEVF_INVALID_VPORT;473 hdev->num_msi_left += 1;474 hdev->num_msi_used -= 1;475}476 477static int hclgevf_get_vector(struct hnae3_handle *handle, u16 vector_num,478 struct hnae3_vector_info *vector_info)479{480 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);481 struct hnae3_vector_info *vector = vector_info;482 int alloc = 0;483 int i, j;484 485 vector_num = min_t(u16, hdev->num_nic_msix - 1, vector_num);486 vector_num = min(hdev->num_msi_left, vector_num);487 488 for (j = 0; j < vector_num; j++) {489 for (i = HCLGEVF_MISC_VECTOR_NUM + 1; i < hdev->num_msi; i++) {490 if (hdev->vector_status[i] == HCLGEVF_INVALID_VPORT) {491 vector->vector = pci_irq_vector(hdev->pdev, i);492 vector->io_addr = hdev->hw.hw.io_base +493 HCLGEVF_VECTOR_REG_BASE +494 (i - 1) * HCLGEVF_VECTOR_REG_OFFSET;495 hdev->vector_status[i] = 0;496 hdev->vector_irq[i] = vector->vector;497 498 vector++;499 alloc++;500 501 break;502 }503 }504 }505 hdev->num_msi_left -= alloc;506 hdev->num_msi_used += alloc;507 508 return alloc;509}510 511static int hclgevf_get_vector_index(struct hclgevf_dev *hdev, int vector)512{513 int i;514 515 for (i = 0; i < hdev->num_msi; i++)516 if (vector == hdev->vector_irq[i])517 return i;518 519 return -EINVAL;520}521 522/* for revision 0x20, vf shared the same rss config with pf */523static int hclgevf_get_rss_hash_key(struct hclgevf_dev *hdev)524{525#define HCLGEVF_RSS_MBX_RESP_LEN 8526 struct hclge_comm_rss_cfg *rss_cfg = &hdev->rss_cfg;527 u8 resp_msg[HCLGEVF_RSS_MBX_RESP_LEN];528 struct hclge_vf_to_pf_msg send_msg;529 u16 msg_num, hash_key_index;530 u8 index;531 int ret;532 533 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_GET_RSS_KEY, 0);534 msg_num = (HCLGE_COMM_RSS_KEY_SIZE + HCLGEVF_RSS_MBX_RESP_LEN - 1) /535 HCLGEVF_RSS_MBX_RESP_LEN;536 for (index = 0; index < msg_num; index++) {537 send_msg.data[0] = index;538 ret = hclgevf_send_mbx_msg(hdev, &send_msg, true, resp_msg,539 HCLGEVF_RSS_MBX_RESP_LEN);540 if (ret) {541 dev_err(&hdev->pdev->dev,542 "VF get rss hash key from PF failed, ret=%d",543 ret);544 return ret;545 }546 547 hash_key_index = HCLGEVF_RSS_MBX_RESP_LEN * index;548 if (index == msg_num - 1)549 memcpy(&rss_cfg->rss_hash_key[hash_key_index],550 &resp_msg[0],551 HCLGE_COMM_RSS_KEY_SIZE - hash_key_index);552 else553 memcpy(&rss_cfg->rss_hash_key[hash_key_index],554 &resp_msg[0], HCLGEVF_RSS_MBX_RESP_LEN);555 }556 557 return 0;558}559 560static int hclgevf_get_rss(struct hnae3_handle *handle, u32 *indir, u8 *key,561 u8 *hfunc)562{563 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);564 struct hclge_comm_rss_cfg *rss_cfg = &hdev->rss_cfg;565 int ret;566 567 if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {568 hclge_comm_get_rss_hash_info(rss_cfg, key, hfunc);569 } else {570 if (hfunc)571 *hfunc = ETH_RSS_HASH_TOP;572 if (key) {573 ret = hclgevf_get_rss_hash_key(hdev);574 if (ret)575 return ret;576 memcpy(key, rss_cfg->rss_hash_key,577 HCLGE_COMM_RSS_KEY_SIZE);578 }579 }580 581 hclge_comm_get_rss_indir_tbl(rss_cfg, indir,582 hdev->ae_dev->dev_specs.rss_ind_tbl_size);583 584 return 0;585}586 587static int hclgevf_set_rss(struct hnae3_handle *handle, const u32 *indir,588 const u8 *key, const u8 hfunc)589{590 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);591 struct hclge_comm_rss_cfg *rss_cfg = &hdev->rss_cfg;592 int ret, i;593 594 if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {595 ret = hclge_comm_set_rss_hash_key(rss_cfg, &hdev->hw.hw, key,596 hfunc);597 if (ret)598 return ret;599 }600 601 /* update the shadow RSS table with user specified qids */602 for (i = 0; i < hdev->ae_dev->dev_specs.rss_ind_tbl_size; i++)603 rss_cfg->rss_indirection_tbl[i] = indir[i];604 605 /* update the hardware */606 return hclge_comm_set_rss_indir_table(hdev->ae_dev, &hdev->hw.hw,607 rss_cfg->rss_indirection_tbl);608}609 610static int hclgevf_set_rss_tuple(struct hnae3_handle *handle,611 struct ethtool_rxnfc *nfc)612{613 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);614 int ret;615 616 if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)617 return -EOPNOTSUPP;618 619 ret = hclge_comm_set_rss_tuple(hdev->ae_dev, &hdev->hw.hw,620 &hdev->rss_cfg, nfc);621 if (ret)622 dev_err(&hdev->pdev->dev,623 "failed to set rss tuple, ret = %d.\n", ret);624 625 return ret;626}627 628static int hclgevf_get_rss_tuple(struct hnae3_handle *handle,629 struct ethtool_rxnfc *nfc)630{631 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);632 u8 tuple_sets;633 int ret;634 635 if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)636 return -EOPNOTSUPP;637 638 nfc->data = 0;639 640 ret = hclge_comm_get_rss_tuple(&hdev->rss_cfg, nfc->flow_type,641 &tuple_sets);642 if (ret || !tuple_sets)643 return ret;644 645 nfc->data = hclge_comm_convert_rss_tuple(tuple_sets);646 647 return 0;648}649 650static int hclgevf_get_tc_size(struct hnae3_handle *handle)651{652 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);653 struct hclge_comm_rss_cfg *rss_cfg = &hdev->rss_cfg;654 655 return rss_cfg->rss_size;656}657 658static int hclgevf_bind_ring_to_vector(struct hnae3_handle *handle, bool en,659 int vector_id,660 struct hnae3_ring_chain_node *ring_chain)661{662 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);663 struct hclge_vf_to_pf_msg send_msg;664 struct hnae3_ring_chain_node *node;665 int status;666 int i = 0;667 668 memset(&send_msg, 0, sizeof(send_msg));669 send_msg.code = en ? HCLGE_MBX_MAP_RING_TO_VECTOR :670 HCLGE_MBX_UNMAP_RING_TO_VECTOR;671 send_msg.vector_id = vector_id;672 673 for (node = ring_chain; node; node = node->next) {674 send_msg.param[i].ring_type =675 hnae3_get_bit(node->flag, HNAE3_RING_TYPE_B);676 677 send_msg.param[i].tqp_index = node->tqp_index;678 send_msg.param[i].int_gl_index =679 hnae3_get_field(node->int_gl_idx,680 HNAE3_RING_GL_IDX_M,681 HNAE3_RING_GL_IDX_S);682 683 i++;684 if (i == HCLGE_MBX_MAX_RING_CHAIN_PARAM_NUM || !node->next) {685 send_msg.ring_num = i;686 687 status = hclgevf_send_mbx_msg(hdev, &send_msg, false,688 NULL, 0);689 if (status) {690 dev_err(&hdev->pdev->dev,691 "Map TQP fail, status is %d.\n",692 status);693 return status;694 }695 i = 0;696 }697 }698 699 return 0;700}701 702static int hclgevf_map_ring_to_vector(struct hnae3_handle *handle, int vector,703 struct hnae3_ring_chain_node *ring_chain)704{705 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);706 int vector_id;707 708 vector_id = hclgevf_get_vector_index(hdev, vector);709 if (vector_id < 0) {710 dev_err(&handle->pdev->dev,711 "Get vector index fail. ret =%d\n", vector_id);712 return vector_id;713 }714 715 return hclgevf_bind_ring_to_vector(handle, true, vector_id, ring_chain);716}717 718static int hclgevf_unmap_ring_from_vector(719 struct hnae3_handle *handle,720 int vector,721 struct hnae3_ring_chain_node *ring_chain)722{723 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);724 int ret, vector_id;725 726 if (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state))727 return 0;728 729 vector_id = hclgevf_get_vector_index(hdev, vector);730 if (vector_id < 0) {731 dev_err(&handle->pdev->dev,732 "Get vector index fail. ret =%d\n", vector_id);733 return vector_id;734 }735 736 ret = hclgevf_bind_ring_to_vector(handle, false, vector_id, ring_chain);737 if (ret)738 dev_err(&handle->pdev->dev,739 "Unmap ring from vector fail. vector=%d, ret =%d\n",740 vector_id,741 ret);742 743 return ret;744}745 746static int hclgevf_put_vector(struct hnae3_handle *handle, int vector)747{748 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);749 int vector_id;750 751 vector_id = hclgevf_get_vector_index(hdev, vector);752 if (vector_id < 0) {753 dev_err(&handle->pdev->dev,754 "hclgevf_put_vector get vector index fail. ret =%d\n",755 vector_id);756 return vector_id;757 }758 759 hclgevf_free_vector(hdev, vector_id);760 761 return 0;762}763 764static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev,765 bool en_uc_pmc, bool en_mc_pmc,766 bool en_bc_pmc)767{768 struct hnae3_handle *handle = &hdev->nic;769 struct hclge_vf_to_pf_msg send_msg;770 int ret;771 772 memset(&send_msg, 0, sizeof(send_msg));773 send_msg.code = HCLGE_MBX_SET_PROMISC_MODE;774 send_msg.en_bc = en_bc_pmc ? 1 : 0;775 send_msg.en_uc = en_uc_pmc ? 1 : 0;776 send_msg.en_mc = en_mc_pmc ? 1 : 0;777 send_msg.en_limit_promisc = test_bit(HNAE3_PFLAG_LIMIT_PROMISC,778 &handle->priv_flags) ? 1 : 0;779 780 ret = hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);781 if (ret)782 dev_err(&hdev->pdev->dev,783 "Set promisc mode fail, status is %d.\n", ret);784 785 return ret;786}787 788static int hclgevf_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc,789 bool en_mc_pmc)790{791 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);792 bool en_bc_pmc;793 794 en_bc_pmc = hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2;795 796 return hclgevf_cmd_set_promisc_mode(hdev, en_uc_pmc, en_mc_pmc,797 en_bc_pmc);798}799 800static void hclgevf_request_update_promisc_mode(struct hnae3_handle *handle)801{802 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);803 804 set_bit(HCLGEVF_STATE_PROMISC_CHANGED, &hdev->state);805 hclgevf_task_schedule(hdev, 0);806}807 808static void hclgevf_sync_promisc_mode(struct hclgevf_dev *hdev)809{810 struct hnae3_handle *handle = &hdev->nic;811 bool en_uc_pmc = handle->netdev_flags & HNAE3_UPE;812 bool en_mc_pmc = handle->netdev_flags & HNAE3_MPE;813 int ret;814 815 if (test_bit(HCLGEVF_STATE_PROMISC_CHANGED, &hdev->state)) {816 ret = hclgevf_set_promisc_mode(handle, en_uc_pmc, en_mc_pmc);817 if (!ret)818 clear_bit(HCLGEVF_STATE_PROMISC_CHANGED, &hdev->state);819 }820}821 822static int hclgevf_tqp_enable_cmd_send(struct hclgevf_dev *hdev, u16 tqp_id,823 u16 stream_id, bool enable)824{825 struct hclgevf_cfg_com_tqp_queue_cmd *req;826 struct hclge_desc desc;827 828 req = (struct hclgevf_cfg_com_tqp_queue_cmd *)desc.data;829 830 hclgevf_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_COM_TQP_QUEUE, false);831 req->tqp_id = cpu_to_le16(tqp_id & HCLGEVF_RING_ID_MASK);832 req->stream_id = cpu_to_le16(stream_id);833 if (enable)834 req->enable |= 1U << HCLGEVF_TQP_ENABLE_B;835 836 return hclgevf_cmd_send(&hdev->hw, &desc, 1);837}838 839static int hclgevf_tqp_enable(struct hnae3_handle *handle, bool enable)840{841 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);842 int ret;843 u16 i;844 845 for (i = 0; i < handle->kinfo.num_tqps; i++) {846 ret = hclgevf_tqp_enable_cmd_send(hdev, i, 0, enable);847 if (ret)848 return ret;849 }850 851 return 0;852}853 854static int hclgevf_get_host_mac_addr(struct hclgevf_dev *hdev, u8 *p)855{856 struct hclge_vf_to_pf_msg send_msg;857 u8 host_mac[ETH_ALEN];858 int status;859 860 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_GET_MAC_ADDR, 0);861 status = hclgevf_send_mbx_msg(hdev, &send_msg, true, host_mac,862 ETH_ALEN);863 if (status) {864 dev_err(&hdev->pdev->dev,865 "fail to get VF MAC from host %d", status);866 return status;867 }868 869 ether_addr_copy(p, host_mac);870 871 return 0;872}873 874static void hclgevf_get_mac_addr(struct hnae3_handle *handle, u8 *p)875{876 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);877 u8 host_mac_addr[ETH_ALEN];878 879 if (hclgevf_get_host_mac_addr(hdev, host_mac_addr))880 return;881 882 hdev->has_pf_mac = !is_zero_ether_addr(host_mac_addr);883 if (hdev->has_pf_mac)884 ether_addr_copy(p, host_mac_addr);885 else886 ether_addr_copy(p, hdev->hw.mac.mac_addr);887}888 889static int hclgevf_set_mac_addr(struct hnae3_handle *handle, const void *p,890 bool is_first)891{892 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);893 u8 *old_mac_addr = (u8 *)hdev->hw.mac.mac_addr;894 struct hclge_vf_to_pf_msg send_msg;895 u8 *new_mac_addr = (u8 *)p;896 int status;897 898 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_UNICAST, 0);899 send_msg.subcode = HCLGE_MBX_MAC_VLAN_UC_MODIFY;900 ether_addr_copy(send_msg.data, new_mac_addr);901 if (is_first && !hdev->has_pf_mac)902 eth_zero_addr(&send_msg.data[ETH_ALEN]);903 else904 ether_addr_copy(&send_msg.data[ETH_ALEN], old_mac_addr);905 status = hclgevf_send_mbx_msg(hdev, &send_msg, true, NULL, 0);906 if (!status)907 ether_addr_copy(hdev->hw.mac.mac_addr, new_mac_addr);908 909 return status;910}911 912static struct hclgevf_mac_addr_node *913hclgevf_find_mac_node(struct list_head *list, const u8 *mac_addr)914{915 struct hclgevf_mac_addr_node *mac_node, *tmp;916 917 list_for_each_entry_safe(mac_node, tmp, list, node)918 if (ether_addr_equal(mac_addr, mac_node->mac_addr))919 return mac_node;920 921 return NULL;922}923 924static void hclgevf_update_mac_node(struct hclgevf_mac_addr_node *mac_node,925 enum HCLGEVF_MAC_NODE_STATE state)926{927 switch (state) {928 /* from set_rx_mode or tmp_add_list */929 case HCLGEVF_MAC_TO_ADD:930 if (mac_node->state == HCLGEVF_MAC_TO_DEL)931 mac_node->state = HCLGEVF_MAC_ACTIVE;932 break;933 /* only from set_rx_mode */934 case HCLGEVF_MAC_TO_DEL:935 if (mac_node->state == HCLGEVF_MAC_TO_ADD) {936 list_del(&mac_node->node);937 kfree(mac_node);938 } else {939 mac_node->state = HCLGEVF_MAC_TO_DEL;940 }941 break;942 /* only from tmp_add_list, the mac_node->state won't be943 * HCLGEVF_MAC_ACTIVE944 */945 case HCLGEVF_MAC_ACTIVE:946 if (mac_node->state == HCLGEVF_MAC_TO_ADD)947 mac_node->state = HCLGEVF_MAC_ACTIVE;948 break;949 }950}951 952static int hclgevf_update_mac_list(struct hnae3_handle *handle,953 enum HCLGEVF_MAC_NODE_STATE state,954 enum HCLGEVF_MAC_ADDR_TYPE mac_type,955 const unsigned char *addr)956{957 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);958 struct hclgevf_mac_addr_node *mac_node;959 struct list_head *list;960 961 list = (mac_type == HCLGEVF_MAC_ADDR_UC) ?962 &hdev->mac_table.uc_mac_list : &hdev->mac_table.mc_mac_list;963 964 spin_lock_bh(&hdev->mac_table.mac_list_lock);965 966 /* if the mac addr is already in the mac list, no need to add a new967 * one into it, just check the mac addr state, convert it to a new968 * state, or just remove it, or do nothing.969 */970 mac_node = hclgevf_find_mac_node(list, addr);971 if (mac_node) {972 hclgevf_update_mac_node(mac_node, state);973 spin_unlock_bh(&hdev->mac_table.mac_list_lock);974 return 0;975 }976 /* if this address is never added, unnecessary to delete */977 if (state == HCLGEVF_MAC_TO_DEL) {978 spin_unlock_bh(&hdev->mac_table.mac_list_lock);979 return -ENOENT;980 }981 982 mac_node = kzalloc(sizeof(*mac_node), GFP_ATOMIC);983 if (!mac_node) {984 spin_unlock_bh(&hdev->mac_table.mac_list_lock);985 return -ENOMEM;986 }987 988 mac_node->state = state;989 ether_addr_copy(mac_node->mac_addr, addr);990 list_add_tail(&mac_node->node, list);991 992 spin_unlock_bh(&hdev->mac_table.mac_list_lock);993 return 0;994}995 996static int hclgevf_add_uc_addr(struct hnae3_handle *handle,997 const unsigned char *addr)998{999 return hclgevf_update_mac_list(handle, HCLGEVF_MAC_TO_ADD,1000 HCLGEVF_MAC_ADDR_UC, addr);1001}1002 1003static int hclgevf_rm_uc_addr(struct hnae3_handle *handle,1004 const unsigned char *addr)1005{1006 return hclgevf_update_mac_list(handle, HCLGEVF_MAC_TO_DEL,1007 HCLGEVF_MAC_ADDR_UC, addr);1008}1009 1010static int hclgevf_add_mc_addr(struct hnae3_handle *handle,1011 const unsigned char *addr)1012{1013 return hclgevf_update_mac_list(handle, HCLGEVF_MAC_TO_ADD,1014 HCLGEVF_MAC_ADDR_MC, addr);1015}1016 1017static int hclgevf_rm_mc_addr(struct hnae3_handle *handle,1018 const unsigned char *addr)1019{1020 return hclgevf_update_mac_list(handle, HCLGEVF_MAC_TO_DEL,1021 HCLGEVF_MAC_ADDR_MC, addr);1022}1023 1024static int hclgevf_add_del_mac_addr(struct hclgevf_dev *hdev,1025 struct hclgevf_mac_addr_node *mac_node,1026 enum HCLGEVF_MAC_ADDR_TYPE mac_type)1027{1028 struct hclge_vf_to_pf_msg send_msg;1029 u8 code, subcode;1030 1031 if (mac_type == HCLGEVF_MAC_ADDR_UC) {1032 code = HCLGE_MBX_SET_UNICAST;1033 if (mac_node->state == HCLGEVF_MAC_TO_ADD)1034 subcode = HCLGE_MBX_MAC_VLAN_UC_ADD;1035 else1036 subcode = HCLGE_MBX_MAC_VLAN_UC_REMOVE;1037 } else {1038 code = HCLGE_MBX_SET_MULTICAST;1039 if (mac_node->state == HCLGEVF_MAC_TO_ADD)1040 subcode = HCLGE_MBX_MAC_VLAN_MC_ADD;1041 else1042 subcode = HCLGE_MBX_MAC_VLAN_MC_REMOVE;1043 }1044 1045 hclgevf_build_send_msg(&send_msg, code, subcode);1046 ether_addr_copy(send_msg.data, mac_node->mac_addr);1047 return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);1048}1049 1050static void hclgevf_config_mac_list(struct hclgevf_dev *hdev,1051 struct list_head *list,1052 enum HCLGEVF_MAC_ADDR_TYPE mac_type)1053{1054 char format_mac_addr[HNAE3_FORMAT_MAC_ADDR_LEN];1055 struct hclgevf_mac_addr_node *mac_node, *tmp;1056 int ret;1057 1058 list_for_each_entry_safe(mac_node, tmp, list, node) {1059 ret = hclgevf_add_del_mac_addr(hdev, mac_node, mac_type);1060 if (ret) {1061 hnae3_format_mac_addr(format_mac_addr,1062 mac_node->mac_addr);1063 dev_err(&hdev->pdev->dev,1064 "failed to configure mac %s, state = %d, ret = %d\n",1065 format_mac_addr, mac_node->state, ret);1066 return;1067 }1068 if (mac_node->state == HCLGEVF_MAC_TO_ADD) {1069 mac_node->state = HCLGEVF_MAC_ACTIVE;1070 } else {1071 list_del(&mac_node->node);1072 kfree(mac_node);1073 }1074 }1075}1076 1077static void hclgevf_sync_from_add_list(struct list_head *add_list,1078 struct list_head *mac_list)1079{1080 struct hclgevf_mac_addr_node *mac_node, *tmp, *new_node;1081 1082 list_for_each_entry_safe(mac_node, tmp, add_list, node) {1083 /* if the mac address from tmp_add_list is not in the1084 * uc/mc_mac_list, it means have received a TO_DEL request1085 * during the time window of sending mac config request to PF1086 * If mac_node state is ACTIVE, then change its state to TO_DEL,1087 * then it will be removed at next time. If is TO_ADD, it means1088 * send TO_ADD request failed, so just remove the mac node.1089 */1090 new_node = hclgevf_find_mac_node(mac_list, mac_node->mac_addr);1091 if (new_node) {1092 hclgevf_update_mac_node(new_node, mac_node->state);1093 list_del(&mac_node->node);1094 kfree(mac_node);1095 } else if (mac_node->state == HCLGEVF_MAC_ACTIVE) {1096 mac_node->state = HCLGEVF_MAC_TO_DEL;1097 list_move_tail(&mac_node->node, mac_list);1098 } else {1099 list_del(&mac_node->node);1100 kfree(mac_node);1101 }1102 }1103}1104 1105static void hclgevf_sync_from_del_list(struct list_head *del_list,1106 struct list_head *mac_list)1107{1108 struct hclgevf_mac_addr_node *mac_node, *tmp, *new_node;1109 1110 list_for_each_entry_safe(mac_node, tmp, del_list, node) {1111 new_node = hclgevf_find_mac_node(mac_list, mac_node->mac_addr);1112 if (new_node) {1113 /* If the mac addr is exist in the mac list, it means1114 * received a new request TO_ADD during the time window1115 * of sending mac addr configurrequest to PF, so just1116 * change the mac state to ACTIVE.1117 */1118 new_node->state = HCLGEVF_MAC_ACTIVE;1119 list_del(&mac_node->node);1120 kfree(mac_node);1121 } else {1122 list_move_tail(&mac_node->node, mac_list);1123 }1124 }1125}1126 1127static void hclgevf_clear_list(struct list_head *list)1128{1129 struct hclgevf_mac_addr_node *mac_node, *tmp;1130 1131 list_for_each_entry_safe(mac_node, tmp, list, node) {1132 list_del(&mac_node->node);1133 kfree(mac_node);1134 }1135}1136 1137static void hclgevf_sync_mac_list(struct hclgevf_dev *hdev,1138 enum HCLGEVF_MAC_ADDR_TYPE mac_type)1139{1140 struct hclgevf_mac_addr_node *mac_node, *tmp, *new_node;1141 struct list_head tmp_add_list, tmp_del_list;1142 struct list_head *list;1143 1144 INIT_LIST_HEAD(&tmp_add_list);1145 INIT_LIST_HEAD(&tmp_del_list);1146 1147 /* move the mac addr to the tmp_add_list and tmp_del_list, then1148 * we can add/delete these mac addr outside the spin lock1149 */1150 list = (mac_type == HCLGEVF_MAC_ADDR_UC) ?1151 &hdev->mac_table.uc_mac_list : &hdev->mac_table.mc_mac_list;1152 1153 spin_lock_bh(&hdev->mac_table.mac_list_lock);1154 1155 list_for_each_entry_safe(mac_node, tmp, list, node) {1156 switch (mac_node->state) {1157 case HCLGEVF_MAC_TO_DEL:1158 list_move_tail(&mac_node->node, &tmp_del_list);1159 break;1160 case HCLGEVF_MAC_TO_ADD:1161 new_node = kzalloc(sizeof(*new_node), GFP_ATOMIC);1162 if (!new_node)1163 goto stop_traverse;1164 1165 ether_addr_copy(new_node->mac_addr, mac_node->mac_addr);1166 new_node->state = mac_node->state;1167 list_add_tail(&new_node->node, &tmp_add_list);1168 break;1169 default:1170 break;1171 }1172 }1173 1174stop_traverse:1175 spin_unlock_bh(&hdev->mac_table.mac_list_lock);1176 1177 /* delete first, in order to get max mac table space for adding */1178 hclgevf_config_mac_list(hdev, &tmp_del_list, mac_type);1179 hclgevf_config_mac_list(hdev, &tmp_add_list, mac_type);1180 1181 /* if some mac addresses were added/deleted fail, move back to the1182 * mac_list, and retry at next time.1183 */1184 spin_lock_bh(&hdev->mac_table.mac_list_lock);1185 1186 hclgevf_sync_from_del_list(&tmp_del_list, list);1187 hclgevf_sync_from_add_list(&tmp_add_list, list);1188 1189 spin_unlock_bh(&hdev->mac_table.mac_list_lock);1190}1191 1192static void hclgevf_sync_mac_table(struct hclgevf_dev *hdev)1193{1194 hclgevf_sync_mac_list(hdev, HCLGEVF_MAC_ADDR_UC);1195 hclgevf_sync_mac_list(hdev, HCLGEVF_MAC_ADDR_MC);1196}1197 1198static void hclgevf_uninit_mac_list(struct hclgevf_dev *hdev)1199{1200 spin_lock_bh(&hdev->mac_table.mac_list_lock);1201 1202 hclgevf_clear_list(&hdev->mac_table.uc_mac_list);1203 hclgevf_clear_list(&hdev->mac_table.mc_mac_list);1204 1205 spin_unlock_bh(&hdev->mac_table.mac_list_lock);1206}1207 1208static int hclgevf_enable_vlan_filter(struct hnae3_handle *handle, bool enable)1209{1210 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);1211 struct hnae3_ae_dev *ae_dev = hdev->ae_dev;1212 struct hclge_vf_to_pf_msg send_msg;1213 1214 if (!test_bit(HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, ae_dev->caps))1215 return -EOPNOTSUPP;1216 1217 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,1218 HCLGE_MBX_ENABLE_VLAN_FILTER);1219 send_msg.data[0] = enable ? 1 : 0;1220 1221 return hclgevf_send_mbx_msg(hdev, &send_msg, true, NULL, 0);1222}1223 1224static int hclgevf_set_vlan_filter(struct hnae3_handle *handle,1225 __be16 proto, u16 vlan_id,1226 bool is_kill)1227{1228 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);1229 struct hclge_mbx_vlan_filter *vlan_filter;1230 struct hclge_vf_to_pf_msg send_msg;1231 int ret;1232 1233 if (vlan_id > HCLGEVF_MAX_VLAN_ID)1234 return -EINVAL;1235 1236 if (proto != htons(ETH_P_8021Q))1237 return -EPROTONOSUPPORT;1238 1239 /* When device is resetting or reset failed, firmware is unable to1240 * handle mailbox. Just record the vlan id, and remove it after1241 * reset finished.1242 */1243 if ((test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state) ||1244 test_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state)) && is_kill) {1245 set_bit(vlan_id, hdev->vlan_del_fail_bmap);1246 return -EBUSY;1247 } else if (!is_kill && test_bit(vlan_id, hdev->vlan_del_fail_bmap)) {1248 clear_bit(vlan_id, hdev->vlan_del_fail_bmap);1249 }1250 1251 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,1252 HCLGE_MBX_VLAN_FILTER);1253 vlan_filter = (struct hclge_mbx_vlan_filter *)send_msg.data;1254 vlan_filter->is_kill = is_kill;1255 vlan_filter->vlan_id = cpu_to_le16(vlan_id);1256 vlan_filter->proto = cpu_to_le16(be16_to_cpu(proto));1257 1258 /* when remove hw vlan filter failed, record the vlan id,1259 * and try to remove it from hw later, to be consistence1260 * with stack.1261 */1262 ret = hclgevf_send_mbx_msg(hdev, &send_msg, true, NULL, 0);1263 if (is_kill && ret)1264 set_bit(vlan_id, hdev->vlan_del_fail_bmap);1265 1266 return ret;1267}1268 1269static void hclgevf_sync_vlan_filter(struct hclgevf_dev *hdev)1270{1271#define HCLGEVF_MAX_SYNC_COUNT 601272 struct hnae3_handle *handle = &hdev->nic;1273 int ret, sync_cnt = 0;1274 u16 vlan_id;1275 1276 if (bitmap_empty(hdev->vlan_del_fail_bmap, VLAN_N_VID))1277 return;1278 1279 rtnl_lock();1280 vlan_id = find_first_bit(hdev->vlan_del_fail_bmap, VLAN_N_VID);1281 while (vlan_id != VLAN_N_VID) {1282 ret = hclgevf_set_vlan_filter(handle, htons(ETH_P_8021Q),1283 vlan_id, true);1284 if (ret)1285 break;1286 1287 clear_bit(vlan_id, hdev->vlan_del_fail_bmap);1288 sync_cnt++;1289 if (sync_cnt >= HCLGEVF_MAX_SYNC_COUNT)1290 break;1291 1292 vlan_id = find_first_bit(hdev->vlan_del_fail_bmap, VLAN_N_VID);1293 }1294 rtnl_unlock();1295}1296 1297static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)1298{1299 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);1300 struct hclge_vf_to_pf_msg send_msg;1301 1302 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,1303 HCLGE_MBX_VLAN_RX_OFF_CFG);1304 send_msg.data[0] = enable ? 1 : 0;1305 return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);1306}1307 1308static int hclgevf_reset_tqp(struct hnae3_handle *handle)1309{1310#define HCLGEVF_RESET_ALL_QUEUE_DONE 1U1311 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);1312 struct hclge_vf_to_pf_msg send_msg;1313 u8 return_status = 0;1314 int ret;1315 u16 i;1316 1317 /* disable vf queue before send queue reset msg to PF */1318 ret = hclgevf_tqp_enable(handle, false);1319 if (ret) {1320 dev_err(&hdev->pdev->dev, "failed to disable tqp, ret = %d\n",1321 ret);1322 return ret;1323 }1324 1325 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_QUEUE_RESET, 0);1326 1327 ret = hclgevf_send_mbx_msg(hdev, &send_msg, true, &return_status,1328 sizeof(return_status));1329 if (ret || return_status == HCLGEVF_RESET_ALL_QUEUE_DONE)1330 return ret;1331 1332 for (i = 1; i < handle->kinfo.num_tqps; i++) {1333 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_QUEUE_RESET, 0);1334 *(__le16 *)send_msg.data = cpu_to_le16(i);1335 ret = hclgevf_send_mbx_msg(hdev, &send_msg, true, NULL, 0);1336 if (ret)1337 return ret;1338 }1339 1340 return 0;1341}1342 1343static int hclgevf_set_mtu(struct hnae3_handle *handle, int new_mtu)1344{1345 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);1346 struct hclge_mbx_mtu_info *mtu_info;1347 struct hclge_vf_to_pf_msg send_msg;1348 1349 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_MTU, 0);1350 mtu_info = (struct hclge_mbx_mtu_info *)send_msg.data;1351 mtu_info->mtu = cpu_to_le32(new_mtu);1352 1353 return hclgevf_send_mbx_msg(hdev, &send_msg, true, NULL, 0);1354}1355 1356static int hclgevf_notify_client(struct hclgevf_dev *hdev,1357 enum hnae3_reset_notify_type type)1358{1359 struct hnae3_client *client = hdev->nic_client;1360 struct hnae3_handle *handle = &hdev->nic;1361 int ret;1362 1363 if (!test_bit(HCLGEVF_STATE_NIC_REGISTERED, &hdev->state) ||1364 !client)1365 return 0;1366 1367 if (!client->ops->reset_notify)1368 return -EOPNOTSUPP;1369 1370 ret = client->ops->reset_notify(handle, type);1371 if (ret)1372 dev_err(&hdev->pdev->dev, "notify nic client failed %d(%d)\n",1373 type, ret);1374 1375 return ret;1376}1377 1378static int hclgevf_notify_roce_client(struct hclgevf_dev *hdev,1379 enum hnae3_reset_notify_type type)1380{1381 struct hnae3_client *client = hdev->roce_client;1382 struct hnae3_handle *handle = &hdev->roce;1383 int ret;1384 1385 if (!test_bit(HCLGEVF_STATE_ROCE_REGISTERED, &hdev->state) || !client)1386 return 0;1387 1388 if (!client->ops->reset_notify)1389 return -EOPNOTSUPP;1390 1391 ret = client->ops->reset_notify(handle, type);1392 if (ret)1393 dev_err(&hdev->pdev->dev, "notify roce client failed %d(%d)",1394 type, ret);1395 return ret;1396}1397 1398static int hclgevf_reset_wait(struct hclgevf_dev *hdev)1399{1400#define HCLGEVF_RESET_WAIT_US 200001401#define HCLGEVF_RESET_WAIT_CNT 20001402#define HCLGEVF_RESET_WAIT_TIMEOUT_US \1403 (HCLGEVF_RESET_WAIT_US * HCLGEVF_RESET_WAIT_CNT)1404 1405 u32 val;1406 int ret;1407 1408 if (hdev->reset_type == HNAE3_VF_RESET)1409 ret = readl_poll_timeout(hdev->hw.hw.io_base +1410 HCLGEVF_VF_RST_ING, val,1411 !(val & HCLGEVF_VF_RST_ING_BIT),1412 HCLGEVF_RESET_WAIT_US,1413 HCLGEVF_RESET_WAIT_TIMEOUT_US);1414 else1415 ret = readl_poll_timeout(hdev->hw.hw.io_base +1416 HCLGEVF_RST_ING, val,1417 !(val & HCLGEVF_RST_ING_BITS),1418 HCLGEVF_RESET_WAIT_US,1419 HCLGEVF_RESET_WAIT_TIMEOUT_US);1420 1421 /* hardware completion status should be available by this time */1422 if (ret) {1423 dev_err(&hdev->pdev->dev,1424 "couldn't get reset done status from h/w, timeout!\n");1425 return ret;1426 }1427 1428 /* we will wait a bit more to let reset of the stack to complete. This1429 * might happen in case reset assertion was made by PF. Yes, this also1430 * means we might end up waiting bit more even for VF reset.1431 */1432 if (hdev->reset_type == HNAE3_VF_FULL_RESET)1433 msleep(5000);1434 else1435 msleep(500);1436 1437 return 0;1438}1439 1440static void hclgevf_reset_handshake(struct hclgevf_dev *hdev, bool enable)1441{1442 u32 reg_val;1443 1444 reg_val = hclgevf_read_dev(&hdev->hw, HCLGE_COMM_NIC_CSQ_DEPTH_REG);1445 if (enable)1446 reg_val |= HCLGEVF_NIC_SW_RST_RDY;1447 else1448 reg_val &= ~HCLGEVF_NIC_SW_RST_RDY;1449 1450 hclgevf_write_dev(&hdev->hw, HCLGE_COMM_NIC_CSQ_DEPTH_REG,1451 reg_val);1452}1453 1454static int hclgevf_reset_stack(struct hclgevf_dev *hdev)1455{1456 int ret;1457 1458 /* uninitialize the nic client */1459 ret = hclgevf_notify_client(hdev, HNAE3_UNINIT_CLIENT);1460 if (ret)1461 return ret;1462 1463 /* re-initialize the hclge device */1464 ret = hclgevf_reset_hdev(hdev);1465 if (ret) {1466 dev_err(&hdev->pdev->dev,1467 "hclge device re-init failed, VF is disabled!\n");1468 return ret;1469 }1470 1471 /* bring up the nic client again */1472 ret = hclgevf_notify_client(hdev, HNAE3_INIT_CLIENT);1473 if (ret)1474 return ret;1475 1476 /* clear handshake status with IMP */1477 hclgevf_reset_handshake(hdev, false);1478 1479 /* bring up the nic to enable TX/RX again */1480 return hclgevf_notify_client(hdev, HNAE3_UP_CLIENT);1481}1482 1483static int hclgevf_reset_prepare_wait(struct hclgevf_dev *hdev)1484{1485#define HCLGEVF_RESET_SYNC_TIME 1001486 1487 if (hdev->reset_type == HNAE3_VF_FUNC_RESET) {1488 struct hclge_vf_to_pf_msg send_msg;1489 int ret;1490 1491 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_RESET, 0);1492 ret = hclgevf_send_mbx_msg(hdev, &send_msg, true, NULL, 0);1493 if (ret) {1494 dev_err(&hdev->pdev->dev,1495 "failed to assert VF reset, ret = %d\n", ret);1496 return ret;1497 }1498 hdev->rst_stats.vf_func_rst_cnt++;1499 }1500 1501 set_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hdev->hw.hw.comm_state);1502 /* inform hardware that preparatory work is done */1503 msleep(HCLGEVF_RESET_SYNC_TIME);1504 hclgevf_reset_handshake(hdev, true);1505 dev_info(&hdev->pdev->dev, "prepare reset(%d) wait done\n",1506 hdev->reset_type);1507 1508 return 0;1509}1510 1511static void hclgevf_dump_rst_info(struct hclgevf_dev *hdev)1512{1513 dev_info(&hdev->pdev->dev, "VF function reset count: %u\n",1514 hdev->rst_stats.vf_func_rst_cnt);1515 dev_info(&hdev->pdev->dev, "FLR reset count: %u\n",1516 hdev->rst_stats.flr_rst_cnt);1517 dev_info(&hdev->pdev->dev, "VF reset count: %u\n",1518 hdev->rst_stats.vf_rst_cnt);1519 dev_info(&hdev->pdev->dev, "reset done count: %u\n",1520 hdev->rst_stats.rst_done_cnt);1521 dev_info(&hdev->pdev->dev, "HW reset done count: %u\n",1522 hdev->rst_stats.hw_rst_done_cnt);1523 dev_info(&hdev->pdev->dev, "reset count: %u\n",1524 hdev->rst_stats.rst_cnt);1525 dev_info(&hdev->pdev->dev, "reset fail count: %u\n",1526 hdev->rst_stats.rst_fail_cnt);1527 dev_info(&hdev->pdev->dev, "vector0 interrupt enable status: 0x%x\n",1528 hclgevf_read_dev(&hdev->hw, HCLGEVF_MISC_VECTOR_REG_BASE));1529 dev_info(&hdev->pdev->dev, "vector0 interrupt status: 0x%x\n",1530 hclgevf_read_dev(&hdev->hw, HCLGE_COMM_VECTOR0_CMDQ_STATE_REG));1531 dev_info(&hdev->pdev->dev, "handshake status: 0x%x\n",1532 hclgevf_read_dev(&hdev->hw, HCLGE_COMM_NIC_CSQ_DEPTH_REG));1533 dev_info(&hdev->pdev->dev, "function reset status: 0x%x\n",1534 hclgevf_read_dev(&hdev->hw, HCLGEVF_RST_ING));1535 dev_info(&hdev->pdev->dev, "hdev state: 0x%lx\n", hdev->state);1536}1537 1538static void hclgevf_reset_err_handle(struct hclgevf_dev *hdev)1539{1540 /* recover handshake status with IMP when reset fail */1541 hclgevf_reset_handshake(hdev, true);1542 hdev->rst_stats.rst_fail_cnt++;1543 dev_err(&hdev->pdev->dev, "failed to reset VF(%u)\n",1544 hdev->rst_stats.rst_fail_cnt);1545 1546 if (hdev->rst_stats.rst_fail_cnt < HCLGEVF_RESET_MAX_FAIL_CNT)1547 set_bit(hdev->reset_type, &hdev->reset_pending);1548 1549 if (hclgevf_is_reset_pending(hdev)) {1550 set_bit(HCLGEVF_RESET_PENDING, &hdev->reset_state);1551 hclgevf_reset_task_schedule(hdev);1552 } else {1553 set_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state);1554 hclgevf_dump_rst_info(hdev);1555 }1556}1557 1558static int hclgevf_reset_prepare(struct hclgevf_dev *hdev)1559{1560 int ret;1561 1562 hdev->rst_stats.rst_cnt++;1563 1564 /* perform reset of the stack & ae device for a client */1565 ret = hclgevf_notify_roce_client(hdev, HNAE3_DOWN_CLIENT);1566 if (ret)1567 return ret;1568 1569 rtnl_lock();1570 /* bring down the nic to stop any ongoing TX/RX */1571 ret = hclgevf_notify_client(hdev, HNAE3_DOWN_CLIENT);1572 rtnl_unlock();1573 if (ret)1574 return ret;1575 1576 return hclgevf_reset_prepare_wait(hdev);1577}1578 1579static int hclgevf_reset_rebuild(struct hclgevf_dev *hdev)1580{1581 int ret;1582 1583 hdev->rst_stats.hw_rst_done_cnt++;1584 ret = hclgevf_notify_roce_client(hdev, HNAE3_UNINIT_CLIENT);1585 if (ret)1586 return ret;1587 1588 rtnl_lock();1589 /* now, re-initialize the nic client and ae device */1590 ret = hclgevf_reset_stack(hdev);1591 rtnl_unlock();1592 if (ret) {1593 dev_err(&hdev->pdev->dev, "failed to reset VF stack\n");1594 return ret;1595 }1596 1597 ret = hclgevf_notify_roce_client(hdev, HNAE3_INIT_CLIENT);1598 /* ignore RoCE notify error if it fails HCLGEVF_RESET_MAX_FAIL_CNT - 11599 * times1600 */1601 if (ret &&1602 hdev->rst_stats.rst_fail_cnt < HCLGEVF_RESET_MAX_FAIL_CNT - 1)1603 return ret;1604 1605 ret = hclgevf_notify_roce_client(hdev, HNAE3_UP_CLIENT);1606 if (ret)1607 return ret;1608 1609 hdev->last_reset_time = jiffies;1610 hdev->rst_stats.rst_done_cnt++;1611 hdev->rst_stats.rst_fail_cnt = 0;1612 clear_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state);1613 1614 return 0;1615}1616 1617static void hclgevf_reset(struct hclgevf_dev *hdev)1618{1619 if (hclgevf_reset_prepare(hdev))1620 goto err_reset;1621 1622 /* check if VF could successfully fetch the hardware reset completion1623 * status from the hardware1624 */1625 if (hclgevf_reset_wait(hdev)) {1626 /* can't do much in this situation, will disable VF */1627 dev_err(&hdev->pdev->dev,1628 "failed to fetch H/W reset completion status\n");1629 goto err_reset;1630 }1631 1632 if (hclgevf_reset_rebuild(hdev))1633 goto err_reset;1634 1635 return;1636 1637err_reset:1638 hclgevf_reset_err_handle(hdev);1639}1640 1641static enum hnae3_reset_type hclgevf_get_reset_level(unsigned long *addr)1642{1643 enum hnae3_reset_type rst_level = HNAE3_NONE_RESET;1644 1645 /* return the highest priority reset level amongst all */1646 if (test_bit(HNAE3_VF_RESET, addr)) {1647 rst_level = HNAE3_VF_RESET;1648 clear_bit(HNAE3_VF_RESET, addr);1649 clear_bit(HNAE3_VF_PF_FUNC_RESET, addr);1650 clear_bit(HNAE3_VF_FUNC_RESET, addr);1651 } else if (test_bit(HNAE3_VF_FULL_RESET, addr)) {1652 rst_level = HNAE3_VF_FULL_RESET;1653 clear_bit(HNAE3_VF_FULL_RESET, addr);1654 clear_bit(HNAE3_VF_FUNC_RESET, addr);1655 } else if (test_bit(HNAE3_VF_PF_FUNC_RESET, addr)) {1656 rst_level = HNAE3_VF_PF_FUNC_RESET;1657 clear_bit(HNAE3_VF_PF_FUNC_RESET, addr);1658 clear_bit(HNAE3_VF_FUNC_RESET, addr);1659 } else if (test_bit(HNAE3_VF_FUNC_RESET, addr)) {1660 rst_level = HNAE3_VF_FUNC_RESET;1661 clear_bit(HNAE3_VF_FUNC_RESET, addr);1662 } else if (test_bit(HNAE3_FLR_RESET, addr)) {1663 rst_level = HNAE3_FLR_RESET;1664 clear_bit(HNAE3_FLR_RESET, addr);1665 }1666 1667 return rst_level;1668}1669 1670static void hclgevf_reset_event(struct pci_dev *pdev,1671 struct hnae3_handle *handle)1672{1673 struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);1674 struct hclgevf_dev *hdev = ae_dev->priv;1675 1676 dev_info(&hdev->pdev->dev, "received reset request from VF enet\n");1677 1678 if (hdev->default_reset_request)1679 hdev->reset_level =1680 hclgevf_get_reset_level(&hdev->default_reset_request);1681 else1682 hdev->reset_level = HNAE3_VF_FUNC_RESET;1683 1684 /* reset of this VF requested */1685 set_bit(HCLGEVF_RESET_REQUESTED, &hdev->reset_state);1686 hclgevf_reset_task_schedule(hdev);1687 1688 hdev->last_reset_time = jiffies;1689}1690 1691static void hclgevf_set_def_reset_request(struct hnae3_ae_dev *ae_dev,1692 enum hnae3_reset_type rst_type)1693{1694 struct hclgevf_dev *hdev = ae_dev->priv;1695 1696 set_bit(rst_type, &hdev->default_reset_request);1697}1698 1699static void hclgevf_enable_vector(struct hclgevf_misc_vector *vector, bool en)1700{1701 writel(en ? 1 : 0, vector->addr);1702}1703 1704static void hclgevf_reset_prepare_general(struct hnae3_ae_dev *ae_dev,1705 enum hnae3_reset_type rst_type)1706{1707#define HCLGEVF_RESET_RETRY_WAIT_MS 5001708#define HCLGEVF_RESET_RETRY_CNT 51709 1710 struct hclgevf_dev *hdev = ae_dev->priv;1711 int retry_cnt = 0;1712 int ret;1713 1714 while (retry_cnt++ < HCLGEVF_RESET_RETRY_CNT) {1715 down(&hdev->reset_sem);1716 set_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state);1717 hdev->reset_type = rst_type;1718 ret = hclgevf_reset_prepare(hdev);1719 if (!ret && !hdev->reset_pending)1720 break;1721 1722 dev_err(&hdev->pdev->dev,1723 "failed to prepare to reset, ret=%d, reset_pending:0x%lx, retry_cnt:%d\n",1724 ret, hdev->reset_pending, retry_cnt);1725 clear_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state);1726 up(&hdev->reset_sem);1727 msleep(HCLGEVF_RESET_RETRY_WAIT_MS);1728 }1729 1730 /* disable misc vector before reset done */1731 hclgevf_enable_vector(&hdev->misc_vector, false);1732 1733 if (hdev->reset_type == HNAE3_FLR_RESET)1734 hdev->rst_stats.flr_rst_cnt++;1735}1736 1737static void hclgevf_reset_done(struct hnae3_ae_dev *ae_dev)1738{1739 struct hclgevf_dev *hdev = ae_dev->priv;1740 int ret;1741 1742 hclgevf_enable_vector(&hdev->misc_vector, true);1743 1744 ret = hclgevf_reset_rebuild(hdev);1745 if (ret)1746 dev_warn(&hdev->pdev->dev, "fail to rebuild, ret=%d\n",1747 ret);1748 1749 hdev->reset_type = HNAE3_NONE_RESET;1750 if (test_and_clear_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state))1751 up(&hdev->reset_sem);1752}1753 1754static u32 hclgevf_get_fw_version(struct hnae3_handle *handle)1755{1756 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);1757 1758 return hdev->fw_version;1759}1760 1761static void hclgevf_get_misc_vector(struct hclgevf_dev *hdev)1762{1763 struct hclgevf_misc_vector *vector = &hdev->misc_vector;1764 1765 vector->vector_irq = pci_irq_vector(hdev->pdev,1766 HCLGEVF_MISC_VECTOR_NUM);1767 vector->addr = hdev->hw.hw.io_base + HCLGEVF_MISC_VECTOR_REG_BASE;1768 /* vector status always valid for Vector 0 */1769 hdev->vector_status[HCLGEVF_MISC_VECTOR_NUM] = 0;1770 hdev->vector_irq[HCLGEVF_MISC_VECTOR_NUM] = vector->vector_irq;1771 1772 hdev->num_msi_left -= 1;1773 hdev->num_msi_used += 1;1774}1775 1776void hclgevf_reset_task_schedule(struct hclgevf_dev *hdev)1777{1778 if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state) &&1779 test_bit(HCLGEVF_STATE_SERVICE_INITED, &hdev->state) &&1780 !test_and_set_bit(HCLGEVF_STATE_RST_SERVICE_SCHED,1781 &hdev->state))1782 mod_delayed_work(hclgevf_wq, &hdev->service_task, 0);1783}1784 1785void hclgevf_mbx_task_schedule(struct hclgevf_dev *hdev)1786{1787 if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state) &&1788 !test_and_set_bit(HCLGEVF_STATE_MBX_SERVICE_SCHED,1789 &hdev->state))1790 mod_delayed_work(hclgevf_wq, &hdev->service_task, 0);1791}1792 1793static void hclgevf_task_schedule(struct hclgevf_dev *hdev,1794 unsigned long delay)1795{1796 if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state) &&1797 !test_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state))1798 mod_delayed_work(hclgevf_wq, &hdev->service_task, delay);1799}1800 1801static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)1802{1803#define HCLGEVF_MAX_RESET_ATTEMPTS_CNT 31804 1805 if (!test_and_clear_bit(HCLGEVF_STATE_RST_SERVICE_SCHED, &hdev->state))1806 return;1807 1808 down(&hdev->reset_sem);1809 set_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state);1810 1811 if (test_and_clear_bit(HCLGEVF_RESET_PENDING,1812 &hdev->reset_state)) {1813 /* PF has intimated that it is about to reset the hardware.1814 * We now have to poll & check if hardware has actually1815 * completed the reset sequence. On hardware reset completion,1816 * VF needs to reset the client and ae device.1817 */1818 hdev->reset_attempts = 0;1819 1820 hdev->last_reset_time = jiffies;1821 hdev->reset_type =1822 hclgevf_get_reset_level(&hdev->reset_pending);1823 if (hdev->reset_type != HNAE3_NONE_RESET)1824 hclgevf_reset(hdev);1825 } else if (test_and_clear_bit(HCLGEVF_RESET_REQUESTED,1826 &hdev->reset_state)) {1827 /* we could be here when either of below happens:1828 * 1. reset was initiated due to watchdog timeout caused by1829 * a. IMP was earlier reset and our TX got choked down and1830 * which resulted in watchdog reacting and inducing VF1831 * reset. This also means our cmdq would be unreliable.1832 * b. problem in TX due to other lower layer(example link1833 * layer not functioning properly etc.)1834 * 2. VF reset might have been initiated due to some config1835 * change.1836 *1837 * NOTE: Theres no clear way to detect above cases than to react1838 * to the response of PF for this reset request. PF will ack the1839 * 1b and 2. cases but we will not get any intimation about 1a1840 * from PF as cmdq would be in unreliable state i.e. mailbox1841 * communication between PF and VF would be broken.1842 *1843 * if we are never geting into pending state it means either:1844 * 1. PF is not receiving our request which could be due to IMP1845 * reset1846 * 2. PF is screwed1847 * We cannot do much for 2. but to check first we can try reset1848 * our PCIe + stack and see if it alleviates the problem.1849 */1850 if (hdev->reset_attempts > HCLGEVF_MAX_RESET_ATTEMPTS_CNT) {1851 /* prepare for full reset of stack + pcie interface */1852 set_bit(HNAE3_VF_FULL_RESET, &hdev->reset_pending);1853 1854 /* "defer" schedule the reset task again */1855 set_bit(HCLGEVF_RESET_PENDING, &hdev->reset_state);1856 } else {1857 hdev->reset_attempts++;1858 1859 set_bit(hdev->reset_level, &hdev->reset_pending);1860 set_bit(HCLGEVF_RESET_PENDING, &hdev->reset_state);1861 }1862 hclgevf_reset_task_schedule(hdev);1863 }1864 1865 hdev->reset_type = HNAE3_NONE_RESET;1866 clear_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state);1867 up(&hdev->reset_sem);1868}1869 1870static void hclgevf_mailbox_service_task(struct hclgevf_dev *hdev)1871{1872 if (!test_and_clear_bit(HCLGEVF_STATE_MBX_SERVICE_SCHED, &hdev->state))1873 return;1874 1875 if (test_and_set_bit(HCLGEVF_STATE_MBX_HANDLING, &hdev->state))1876 return;1877 1878 hclgevf_mbx_async_handler(hdev);1879 1880 clear_bit(HCLGEVF_STATE_MBX_HANDLING, &hdev->state);1881}1882 1883static void hclgevf_keep_alive(struct hclgevf_dev *hdev)1884{1885 struct hclge_vf_to_pf_msg send_msg;1886 int ret;1887 1888 if (test_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hdev->hw.hw.comm_state))1889 return;1890 1891 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_KEEP_ALIVE, 0);1892 ret = hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);1893 if (ret)1894 dev_err(&hdev->pdev->dev,1895 "VF sends keep alive cmd failed(=%d)\n", ret);1896}1897 1898static void hclgevf_periodic_service_task(struct hclgevf_dev *hdev)1899{1900 unsigned long delta = round_jiffies_relative(HZ);1901 struct hnae3_handle *handle = &hdev->nic;1902 1903 if (test_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state) ||1904 test_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hdev->hw.hw.comm_state))1905 return;1906 1907 if (time_is_after_jiffies(hdev->last_serv_processed + HZ)) {1908 delta = jiffies - hdev->last_serv_processed;1909 1910 if (delta < round_jiffies_relative(HZ)) {1911 delta = round_jiffies_relative(HZ) - delta;1912 goto out;1913 }1914 }1915 1916 hdev->serv_processed_cnt++;1917 if (!(hdev->serv_processed_cnt % HCLGEVF_KEEP_ALIVE_TASK_INTERVAL))1918 hclgevf_keep_alive(hdev);1919 1920 if (test_bit(HCLGEVF_STATE_DOWN, &hdev->state)) {1921 hdev->last_serv_processed = jiffies;1922 goto out;1923 }1924 1925 if (!(hdev->serv_processed_cnt % HCLGEVF_STATS_TIMER_INTERVAL))1926 hclge_comm_tqps_update_stats(handle, &hdev->hw.hw);1927 1928 /* VF does not need to request link status when this bit is set, because1929 * PF will push its link status to VFs when link status changed.1930 */1931 if (!test_bit(HCLGEVF_STATE_PF_PUSH_LINK_STATUS, &hdev->state))1932 hclgevf_request_link_info(hdev);1933 1934 hclgevf_update_link_mode(hdev);1935 1936 hclgevf_sync_vlan_filter(hdev);1937 1938 hclgevf_sync_mac_table(hdev);1939 1940 hclgevf_sync_promisc_mode(hdev);1941 1942 hdev->last_serv_processed = jiffies;1943 1944out:1945 hclgevf_task_schedule(hdev, delta);1946}1947 1948static void hclgevf_service_task(struct work_struct *work)1949{1950 struct hclgevf_dev *hdev = container_of(work, struct hclgevf_dev,1951 service_task.work);1952 1953 hclgevf_reset_service_task(hdev);1954 hclgevf_mailbox_service_task(hdev);1955 hclgevf_periodic_service_task(hdev);1956 1957 /* Handle reset and mbx again in case periodical task delays the1958 * handling by calling hclgevf_task_schedule() in1959 * hclgevf_periodic_service_task()1960 */1961 hclgevf_reset_service_task(hdev);1962 hclgevf_mailbox_service_task(hdev);1963}1964 1965static void hclgevf_clear_event_cause(struct hclgevf_dev *hdev, u32 regclr)1966{1967 hclgevf_write_dev(&hdev->hw, HCLGE_COMM_VECTOR0_CMDQ_SRC_REG, regclr);1968}1969 1970static enum hclgevf_evt_cause hclgevf_check_evt_cause(struct hclgevf_dev *hdev,1971 u32 *clearval)1972{1973 u32 val, cmdq_stat_reg, rst_ing_reg;1974 1975 /* fetch the events from their corresponding regs */1976 cmdq_stat_reg = hclgevf_read_dev(&hdev->hw,1977 HCLGE_COMM_VECTOR0_CMDQ_STATE_REG);1978 if (BIT(HCLGEVF_VECTOR0_RST_INT_B) & cmdq_stat_reg) {1979 rst_ing_reg = hclgevf_read_dev(&hdev->hw, HCLGEVF_RST_ING);1980 dev_info(&hdev->pdev->dev,1981 "receive reset interrupt 0x%x!\n", rst_ing_reg);1982 set_bit(HNAE3_VF_RESET, &hdev->reset_pending);1983 set_bit(HCLGEVF_RESET_PENDING, &hdev->reset_state);1984 set_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hdev->hw.hw.comm_state);1985 *clearval = ~(1U << HCLGEVF_VECTOR0_RST_INT_B);1986 hdev->rst_stats.vf_rst_cnt++;1987 /* set up VF hardware reset status, its PF will clear1988 * this status when PF has initialized done.1989 */1990 val = hclgevf_read_dev(&hdev->hw, HCLGEVF_VF_RST_ING);1991 hclgevf_write_dev(&hdev->hw, HCLGEVF_VF_RST_ING,1992 val | HCLGEVF_VF_RST_ING_BIT);1993 return HCLGEVF_VECTOR0_EVENT_RST;1994 }1995 1996 /* check for vector0 mailbox(=CMDQ RX) event source */1997 if (BIT(HCLGEVF_VECTOR0_RX_CMDQ_INT_B) & cmdq_stat_reg) {1998 /* for revision 0x21, clearing interrupt is writing bit 01999 * to the clear register, writing bit 1 means to keep the2000 * old value.2001 * for revision 0x20, the clear register is a read & write2002 * register, so we should just write 0 to the bit we are2003 * handling, and keep other bits as cmdq_stat_reg.2004 */2005 if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)2006 *clearval = ~(1U << HCLGEVF_VECTOR0_RX_CMDQ_INT_B);2007 else2008 *clearval = cmdq_stat_reg &2009 ~BIT(HCLGEVF_VECTOR0_RX_CMDQ_INT_B);2010 2011 return HCLGEVF_VECTOR0_EVENT_MBX;2012 }2013 2014 /* print other vector0 event source */2015 dev_info(&hdev->pdev->dev,2016 "vector 0 interrupt from unknown source, cmdq_src = %#x\n",2017 cmdq_stat_reg);2018 2019 return HCLGEVF_VECTOR0_EVENT_OTHER;2020}2021 2022static void hclgevf_reset_timer(struct timer_list *t)2023{2024 struct hclgevf_dev *hdev = from_timer(hdev, t, reset_timer);2025 2026 hclgevf_clear_event_cause(hdev, HCLGEVF_VECTOR0_EVENT_RST);2027 hclgevf_reset_task_schedule(hdev);2028}2029 2030static irqreturn_t hclgevf_misc_irq_handle(int irq, void *data)2031{2032#define HCLGEVF_RESET_DELAY 52033 2034 enum hclgevf_evt_cause event_cause;2035 struct hclgevf_dev *hdev = data;2036 u32 clearval;2037 2038 hclgevf_enable_vector(&hdev->misc_vector, false);2039 event_cause = hclgevf_check_evt_cause(hdev, &clearval);2040 if (event_cause != HCLGEVF_VECTOR0_EVENT_OTHER)2041 hclgevf_clear_event_cause(hdev, clearval);2042 2043 switch (event_cause) {2044 case HCLGEVF_VECTOR0_EVENT_RST:2045 mod_timer(&hdev->reset_timer,2046 jiffies + msecs_to_jiffies(HCLGEVF_RESET_DELAY));2047 break;2048 case HCLGEVF_VECTOR0_EVENT_MBX:2049 hclgevf_mbx_handler(hdev);2050 break;2051 default:2052 break;2053 }2054 2055 hclgevf_enable_vector(&hdev->misc_vector, true);2056 2057 return IRQ_HANDLED;2058}2059 2060static int hclgevf_configure(struct hclgevf_dev *hdev)2061{2062 int ret;2063 2064 hdev->gro_en = true;2065 2066 ret = hclgevf_get_basic_info(hdev);2067 if (ret)2068 return ret;2069 2070 /* get current port based vlan state from PF */2071 ret = hclgevf_get_port_base_vlan_filter_state(hdev);2072 if (ret)2073 return ret;2074 2075 /* get queue configuration from PF */2076 ret = hclgevf_get_queue_info(hdev);2077 if (ret)2078 return ret;2079 2080 /* get queue depth info from PF */2081 ret = hclgevf_get_queue_depth(hdev);2082 if (ret)2083 return ret;2084 2085 return hclgevf_get_pf_media_type(hdev);2086}2087 2088static int hclgevf_alloc_hdev(struct hnae3_ae_dev *ae_dev)2089{2090 struct pci_dev *pdev = ae_dev->pdev;2091 struct hclgevf_dev *hdev;2092 2093 hdev = devm_kzalloc(&pdev->dev, sizeof(*hdev), GFP_KERNEL);2094 if (!hdev)2095 return -ENOMEM;2096 2097 hdev->pdev = pdev;2098 hdev->ae_dev = ae_dev;2099 ae_dev->priv = hdev;2100 2101 return 0;2102}2103 2104static int hclgevf_init_roce_base_info(struct hclgevf_dev *hdev)2105{2106 struct hnae3_handle *roce = &hdev->roce;2107 struct hnae3_handle *nic = &hdev->nic;2108 2109 roce->rinfo.num_vectors = hdev->num_roce_msix;2110 2111 if (hdev->num_msi_left < roce->rinfo.num_vectors ||2112 hdev->num_msi_left == 0)2113 return -EINVAL;2114 2115 roce->rinfo.base_vector = hdev->roce_base_msix_offset;2116 2117 roce->rinfo.netdev = nic->kinfo.netdev;2118 roce->rinfo.roce_io_base = hdev->hw.hw.io_base;2119 roce->rinfo.roce_mem_base = hdev->hw.hw.mem_base;2120 2121 roce->pdev = nic->pdev;2122 roce->ae_algo = nic->ae_algo;2123 bitmap_copy(roce->numa_node_mask.bits, nic->numa_node_mask.bits,2124 MAX_NUMNODES);2125 return 0;2126}2127 2128static int hclgevf_config_gro(struct hclgevf_dev *hdev)2129{2130 struct hclgevf_cfg_gro_status_cmd *req;2131 struct hclge_desc desc;2132 int ret;2133 2134 if (!hnae3_ae_dev_gro_supported(hdev->ae_dev))2135 return 0;2136 2137 hclgevf_cmd_setup_basic_desc(&desc, HCLGE_OPC_GRO_GENERIC_CONFIG,2138 false);2139 req = (struct hclgevf_cfg_gro_status_cmd *)desc.data;2140 2141 req->gro_en = hdev->gro_en ? 1 : 0;2142 2143 ret = hclgevf_cmd_send(&hdev->hw, &desc, 1);2144 if (ret)2145 dev_err(&hdev->pdev->dev,2146 "VF GRO hardware config cmd failed, ret = %d.\n", ret);2147 2148 return ret;2149}2150 2151static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)2152{2153 struct hclge_comm_rss_cfg *rss_cfg = &hdev->rss_cfg;2154 u16 tc_offset[HCLGE_COMM_MAX_TC_NUM];2155 u16 tc_valid[HCLGE_COMM_MAX_TC_NUM];2156 u16 tc_size[HCLGE_COMM_MAX_TC_NUM];2157 int ret;2158 2159 if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {2160 ret = hclge_comm_set_rss_algo_key(&hdev->hw.hw,2161 rss_cfg->rss_algo,2162 rss_cfg->rss_hash_key);2163 if (ret)2164 return ret;2165 2166 ret = hclge_comm_set_rss_input_tuple(&hdev->hw.hw, rss_cfg);2167 if (ret)2168 return ret;2169 }2170 2171 ret = hclge_comm_set_rss_indir_table(hdev->ae_dev, &hdev->hw.hw,2172 rss_cfg->rss_indirection_tbl);2173 if (ret)2174 return ret;2175 2176 hclge_comm_get_rss_tc_info(rss_cfg->rss_size, hdev->hw_tc_map,2177 tc_offset, tc_valid, tc_size);2178 2179 return hclge_comm_set_rss_tc_mode(&hdev->hw.hw, tc_offset,2180 tc_valid, tc_size);2181}2182 2183static int hclgevf_init_vlan_config(struct hclgevf_dev *hdev)2184{2185 struct hnae3_handle *nic = &hdev->nic;2186 int ret;2187 2188 ret = hclgevf_en_hw_strip_rxvtag(nic, true);2189 if (ret) {2190 dev_err(&hdev->pdev->dev,2191 "failed to enable rx vlan offload, ret = %d\n", ret);2192 return ret;2193 }2194 2195 return hclgevf_set_vlan_filter(&hdev->nic, htons(ETH_P_8021Q), 0,2196 false);2197}2198 2199static void hclgevf_flush_link_update(struct hclgevf_dev *hdev)2200{2201#define HCLGEVF_FLUSH_LINK_TIMEOUT 1000002202 2203 unsigned long last = hdev->serv_processed_cnt;2204 int i = 0;2205 2206 while (test_bit(HCLGEVF_STATE_LINK_UPDATING, &hdev->state) &&2207 i++ < HCLGEVF_FLUSH_LINK_TIMEOUT &&2208 last == hdev->serv_processed_cnt)2209 usleep_range(1, 1);2210}2211 2212static void hclgevf_set_timer_task(struct hnae3_handle *handle, bool enable)2213{2214 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);2215 2216 if (enable) {2217 hclgevf_task_schedule(hdev, 0);2218 } else {2219 set_bit(HCLGEVF_STATE_DOWN, &hdev->state);2220 2221 smp_mb__after_atomic(); /* flush memory to make sure DOWN is seen by service task */2222 hclgevf_flush_link_update(hdev);2223 }2224}2225 2226static int hclgevf_ae_start(struct hnae3_handle *handle)2227{2228 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);2229 2230 clear_bit(HCLGEVF_STATE_DOWN, &hdev->state);2231 clear_bit(HCLGEVF_STATE_PF_PUSH_LINK_STATUS, &hdev->state);2232 2233 hclge_comm_reset_tqp_stats(handle);2234 2235 hclgevf_request_link_info(hdev);2236 2237 hclgevf_update_link_mode(hdev);2238 2239 return 0;2240}2241 2242static void hclgevf_ae_stop(struct hnae3_handle *handle)2243{2244 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);2245 2246 set_bit(HCLGEVF_STATE_DOWN, &hdev->state);2247 2248 if (hdev->reset_type != HNAE3_VF_RESET)2249 hclgevf_reset_tqp(handle);2250 2251 hclge_comm_reset_tqp_stats(handle);2252 hclgevf_update_link_status(hdev, 0);2253}2254 2255static int hclgevf_set_alive(struct hnae3_handle *handle, bool alive)2256{2257#define HCLGEVF_STATE_ALIVE 12258#define HCLGEVF_STATE_NOT_ALIVE 02259 2260 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);2261 struct hclge_vf_to_pf_msg send_msg;2262 2263 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_ALIVE, 0);2264 send_msg.data[0] = alive ? HCLGEVF_STATE_ALIVE :2265 HCLGEVF_STATE_NOT_ALIVE;2266 return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);2267}2268 2269static int hclgevf_client_start(struct hnae3_handle *handle)2270{2271 return hclgevf_set_alive(handle, true);2272}2273 2274static void hclgevf_client_stop(struct hnae3_handle *handle)2275{2276 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);2277 int ret;2278 2279 ret = hclgevf_set_alive(handle, false);2280 if (ret)2281 dev_warn(&hdev->pdev->dev,2282 "%s failed %d\n", __func__, ret);2283}2284 2285static void hclgevf_state_init(struct hclgevf_dev *hdev)2286{2287 clear_bit(HCLGEVF_STATE_MBX_SERVICE_SCHED, &hdev->state);2288 clear_bit(HCLGEVF_STATE_MBX_HANDLING, &hdev->state);2289 clear_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state);2290 2291 INIT_DELAYED_WORK(&hdev->service_task, hclgevf_service_task);2292 2293 mutex_init(&hdev->mbx_resp.mbx_mutex);2294 sema_init(&hdev->reset_sem, 1);2295 2296 spin_lock_init(&hdev->mac_table.mac_list_lock);2297 INIT_LIST_HEAD(&hdev->mac_table.uc_mac_list);2298 INIT_LIST_HEAD(&hdev->mac_table.mc_mac_list);2299 2300 /* bring the device down */2301 set_bit(HCLGEVF_STATE_DOWN, &hdev->state);2302}2303 2304static void hclgevf_state_uninit(struct hclgevf_dev *hdev)2305{2306 set_bit(HCLGEVF_STATE_DOWN, &hdev->state);2307 set_bit(HCLGEVF_STATE_REMOVING, &hdev->state);2308 2309 if (hdev->service_task.work.func)2310 cancel_delayed_work_sync(&hdev->service_task);2311 2312 mutex_destroy(&hdev->mbx_resp.mbx_mutex);2313}2314 2315static int hclgevf_init_msi(struct hclgevf_dev *hdev)2316{2317 struct pci_dev *pdev = hdev->pdev;2318 int vectors;2319 int i;2320 2321 if (hnae3_dev_roce_supported(hdev))2322 vectors = pci_alloc_irq_vectors(pdev,2323 hdev->roce_base_msix_offset + 1,2324 hdev->num_msi,2325 PCI_IRQ_MSIX);2326 else2327 vectors = pci_alloc_irq_vectors(pdev, HNAE3_MIN_VECTOR_NUM,2328 hdev->num_msi,2329 PCI_IRQ_MSI | PCI_IRQ_MSIX);2330 2331 if (vectors < 0) {2332 dev_err(&pdev->dev,2333 "failed(%d) to allocate MSI/MSI-X vectors\n",2334 vectors);2335 return vectors;2336 }2337 if (vectors < hdev->num_msi)2338 dev_warn(&hdev->pdev->dev,2339 "requested %u MSI/MSI-X, but allocated %d MSI/MSI-X\n",2340 hdev->num_msi, vectors);2341 2342 hdev->num_msi = vectors;2343 hdev->num_msi_left = vectors;2344 2345 hdev->vector_status = devm_kcalloc(&pdev->dev, hdev->num_msi,2346 sizeof(u16), GFP_KERNEL);2347 if (!hdev->vector_status) {2348 pci_free_irq_vectors(pdev);2349 return -ENOMEM;2350 }2351 2352 for (i = 0; i < hdev->num_msi; i++)2353 hdev->vector_status[i] = HCLGEVF_INVALID_VPORT;2354 2355 hdev->vector_irq = devm_kcalloc(&pdev->dev, hdev->num_msi,2356 sizeof(int), GFP_KERNEL);2357 if (!hdev->vector_irq) {2358 devm_kfree(&pdev->dev, hdev->vector_status);2359 pci_free_irq_vectors(pdev);2360 return -ENOMEM;2361 }2362 2363 return 0;2364}2365 2366static void hclgevf_uninit_msi(struct hclgevf_dev *hdev)2367{2368 struct pci_dev *pdev = hdev->pdev;2369 2370 devm_kfree(&pdev->dev, hdev->vector_status);2371 devm_kfree(&pdev->dev, hdev->vector_irq);2372 pci_free_irq_vectors(pdev);2373}2374 2375static int hclgevf_misc_irq_init(struct hclgevf_dev *hdev)2376{2377 int ret;2378 2379 hclgevf_get_misc_vector(hdev);2380 2381 snprintf(hdev->misc_vector.name, HNAE3_INT_NAME_LEN, "%s-misc-%s",2382 HCLGEVF_NAME, pci_name(hdev->pdev));2383 ret = request_irq(hdev->misc_vector.vector_irq, hclgevf_misc_irq_handle,2384 0, hdev->misc_vector.name, hdev);2385 if (ret) {2386 dev_err(&hdev->pdev->dev, "VF failed to request misc irq(%d)\n",2387 hdev->misc_vector.vector_irq);2388 return ret;2389 }2390 2391 hclgevf_clear_event_cause(hdev, 0);2392 2393 /* enable misc. vector(vector 0) */2394 hclgevf_enable_vector(&hdev->misc_vector, true);2395 2396 return ret;2397}2398 2399static void hclgevf_misc_irq_uninit(struct hclgevf_dev *hdev)2400{2401 /* disable misc vector(vector 0) */2402 hclgevf_enable_vector(&hdev->misc_vector, false);2403 synchronize_irq(hdev->misc_vector.vector_irq);2404 free_irq(hdev->misc_vector.vector_irq, hdev);2405 hclgevf_free_vector(hdev, 0);2406}2407 2408static void hclgevf_info_show(struct hclgevf_dev *hdev)2409{2410 struct device *dev = &hdev->pdev->dev;2411 2412 dev_info(dev, "VF info begin:\n");2413 2414 dev_info(dev, "Task queue pairs numbers: %u\n", hdev->num_tqps);2415 dev_info(dev, "Desc num per TX queue: %u\n", hdev->num_tx_desc);2416 dev_info(dev, "Desc num per RX queue: %u\n", hdev->num_rx_desc);2417 dev_info(dev, "Numbers of vports: %u\n", hdev->num_alloc_vport);2418 dev_info(dev, "HW tc map: 0x%x\n", hdev->hw_tc_map);2419 dev_info(dev, "PF media type of this VF: %u\n",2420 hdev->hw.mac.media_type);2421 2422 dev_info(dev, "VF info end.\n");2423}2424 2425static int hclgevf_init_nic_client_instance(struct hnae3_ae_dev *ae_dev,2426 struct hnae3_client *client)2427{2428 struct hclgevf_dev *hdev = ae_dev->priv;2429 int rst_cnt = hdev->rst_stats.rst_cnt;2430 int ret;2431 2432 ret = client->ops->init_instance(&hdev->nic);2433 if (ret)2434 return ret;2435 2436 set_bit(HCLGEVF_STATE_NIC_REGISTERED, &hdev->state);2437 if (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state) ||2438 rst_cnt != hdev->rst_stats.rst_cnt) {2439 clear_bit(HCLGEVF_STATE_NIC_REGISTERED, &hdev->state);2440 2441 client->ops->uninit_instance(&hdev->nic, 0);2442 return -EBUSY;2443 }2444 2445 hnae3_set_client_init_flag(client, ae_dev, 1);2446 2447 if (netif_msg_drv(&hdev->nic))2448 hclgevf_info_show(hdev);2449 2450 return 0;2451}2452 2453static int hclgevf_init_roce_client_instance(struct hnae3_ae_dev *ae_dev,2454 struct hnae3_client *client)2455{2456 struct hclgevf_dev *hdev = ae_dev->priv;2457 int ret;2458 2459 if (!hnae3_dev_roce_supported(hdev) || !hdev->roce_client ||2460 !hdev->nic_client)2461 return 0;2462 2463 ret = hclgevf_init_roce_base_info(hdev);2464 if (ret)2465 return ret;2466 2467 ret = client->ops->init_instance(&hdev->roce);2468 if (ret)2469 return ret;2470 2471 set_bit(HCLGEVF_STATE_ROCE_REGISTERED, &hdev->state);2472 hnae3_set_client_init_flag(client, ae_dev, 1);2473 2474 return 0;2475}2476 2477static int hclgevf_init_client_instance(struct hnae3_client *client,2478 struct hnae3_ae_dev *ae_dev)2479{2480 struct hclgevf_dev *hdev = ae_dev->priv;2481 int ret;2482 2483 switch (client->type) {2484 case HNAE3_CLIENT_KNIC:2485 hdev->nic_client = client;2486 hdev->nic.client = client;2487 2488 ret = hclgevf_init_nic_client_instance(ae_dev, client);2489 if (ret)2490 goto clear_nic;2491 2492 ret = hclgevf_init_roce_client_instance(ae_dev,2493 hdev->roce_client);2494 if (ret)2495 goto clear_roce;2496 2497 break;2498 case HNAE3_CLIENT_ROCE:2499 if (hnae3_dev_roce_supported(hdev)) {2500 hdev->roce_client = client;2501 hdev->roce.client = client;2502 }2503 2504 ret = hclgevf_init_roce_client_instance(ae_dev, client);2505 if (ret)2506 goto clear_roce;2507 2508 break;2509 default:2510 return -EINVAL;2511 }2512 2513 return 0;2514 2515clear_nic:2516 hdev->nic_client = NULL;2517 hdev->nic.client = NULL;2518 return ret;2519clear_roce:2520 hdev->roce_client = NULL;2521 hdev->roce.client = NULL;2522 return ret;2523}2524 2525static void hclgevf_uninit_client_instance(struct hnae3_client *client,2526 struct hnae3_ae_dev *ae_dev)2527{2528 struct hclgevf_dev *hdev = ae_dev->priv;2529 2530 /* un-init roce, if it exists */2531 if (hdev->roce_client) {2532 while (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state))2533 msleep(HCLGEVF_WAIT_RESET_DONE);2534 clear_bit(HCLGEVF_STATE_ROCE_REGISTERED, &hdev->state);2535 2536 hdev->roce_client->ops->uninit_instance(&hdev->roce, 0);2537 hdev->roce_client = NULL;2538 hdev->roce.client = NULL;2539 }2540 2541 /* un-init nic/unic, if this was not called by roce client */2542 if (client->ops->uninit_instance && hdev->nic_client &&2543 client->type != HNAE3_CLIENT_ROCE) {2544 while (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state))2545 msleep(HCLGEVF_WAIT_RESET_DONE);2546 clear_bit(HCLGEVF_STATE_NIC_REGISTERED, &hdev->state);2547 2548 client->ops->uninit_instance(&hdev->nic, 0);2549 hdev->nic_client = NULL;2550 hdev->nic.client = NULL;2551 }2552}2553 2554static int hclgevf_dev_mem_map(struct hclgevf_dev *hdev)2555{2556 struct pci_dev *pdev = hdev->pdev;2557 struct hclgevf_hw *hw = &hdev->hw;2558 2559 /* for device does not have device memory, return directly */2560 if (!(pci_select_bars(pdev, IORESOURCE_MEM) & BIT(HCLGEVF_MEM_BAR)))2561 return 0;2562 2563 hw->hw.mem_base =2564 devm_ioremap_wc(&pdev->dev,2565 pci_resource_start(pdev, HCLGEVF_MEM_BAR),2566 pci_resource_len(pdev, HCLGEVF_MEM_BAR));2567 if (!hw->hw.mem_base) {2568 dev_err(&pdev->dev, "failed to map device memory\n");2569 return -EFAULT;2570 }2571 2572 return 0;2573}2574 2575static int hclgevf_pci_init(struct hclgevf_dev *hdev)2576{2577 struct pci_dev *pdev = hdev->pdev;2578 struct hclgevf_hw *hw;2579 int ret;2580 2581 ret = pci_enable_device(pdev);2582 if (ret) {2583 dev_err(&pdev->dev, "failed to enable PCI device\n");2584 return ret;2585 }2586 2587 ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));2588 if (ret) {2589 dev_err(&pdev->dev, "can't set consistent PCI DMA, exiting");2590 goto err_disable_device;2591 }2592 2593 ret = pci_request_regions(pdev, HCLGEVF_DRIVER_NAME);2594 if (ret) {2595 dev_err(&pdev->dev, "PCI request regions failed %d\n", ret);2596 goto err_disable_device;2597 }2598 2599 pci_set_master(pdev);2600 hw = &hdev->hw;2601 hw->hw.io_base = pci_iomap(pdev, 2, 0);2602 if (!hw->hw.io_base) {2603 dev_err(&pdev->dev, "can't map configuration register space\n");2604 ret = -ENOMEM;2605 goto err_release_regions;2606 }2607 2608 ret = hclgevf_dev_mem_map(hdev);2609 if (ret)2610 goto err_unmap_io_base;2611 2612 return 0;2613 2614err_unmap_io_base:2615 pci_iounmap(pdev, hdev->hw.hw.io_base);2616err_release_regions:2617 pci_release_regions(pdev);2618err_disable_device:2619 pci_disable_device(pdev);2620 2621 return ret;2622}2623 2624static void hclgevf_pci_uninit(struct hclgevf_dev *hdev)2625{2626 struct pci_dev *pdev = hdev->pdev;2627 2628 if (hdev->hw.hw.mem_base)2629 devm_iounmap(&pdev->dev, hdev->hw.hw.mem_base);2630 2631 pci_iounmap(pdev, hdev->hw.hw.io_base);2632 pci_release_regions(pdev);2633 pci_disable_device(pdev);2634}2635 2636static int hclgevf_query_vf_resource(struct hclgevf_dev *hdev)2637{2638 struct hclgevf_query_res_cmd *req;2639 struct hclge_desc desc;2640 int ret;2641 2642 hclgevf_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_VF_RSRC, true);2643 ret = hclgevf_cmd_send(&hdev->hw, &desc, 1);2644 if (ret) {2645 dev_err(&hdev->pdev->dev,2646 "query vf resource failed, ret = %d.\n", ret);2647 return ret;2648 }2649 2650 req = (struct hclgevf_query_res_cmd *)desc.data;2651 2652 if (hnae3_dev_roce_supported(hdev)) {2653 hdev->roce_base_msix_offset =2654 hnae3_get_field(le16_to_cpu(req->msixcap_localid_ba_rocee),2655 HCLGEVF_MSIX_OFT_ROCEE_M,2656 HCLGEVF_MSIX_OFT_ROCEE_S);2657 hdev->num_roce_msix =2658 hnae3_get_field(le16_to_cpu(req->vf_intr_vector_number),2659 HCLGEVF_VEC_NUM_M, HCLGEVF_VEC_NUM_S);2660 2661 /* nic's msix numbers is always equals to the roce's. */2662 hdev->num_nic_msix = hdev->num_roce_msix;2663 2664 /* VF should have NIC vectors and Roce vectors, NIC vectors2665 * are queued before Roce vectors. The offset is fixed to 64.2666 */2667 hdev->num_msi = hdev->num_roce_msix +2668 hdev->roce_base_msix_offset;2669 } else {2670 hdev->num_msi =2671 hnae3_get_field(le16_to_cpu(req->vf_intr_vector_number),2672 HCLGEVF_VEC_NUM_M, HCLGEVF_VEC_NUM_S);2673 2674 hdev->num_nic_msix = hdev->num_msi;2675 }2676 2677 if (hdev->num_nic_msix < HNAE3_MIN_VECTOR_NUM) {2678 dev_err(&hdev->pdev->dev,2679 "Just %u msi resources, not enough for vf(min:2).\n",2680 hdev->num_nic_msix);2681 return -EINVAL;2682 }2683 2684 return 0;2685}2686 2687static void hclgevf_set_default_dev_specs(struct hclgevf_dev *hdev)2688{2689#define HCLGEVF_MAX_NON_TSO_BD_NUM 8U2690 2691 struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);2692 2693 ae_dev->dev_specs.max_non_tso_bd_num =2694 HCLGEVF_MAX_NON_TSO_BD_NUM;2695 ae_dev->dev_specs.rss_ind_tbl_size = HCLGEVF_RSS_IND_TBL_SIZE;2696 ae_dev->dev_specs.rss_key_size = HCLGE_COMM_RSS_KEY_SIZE;2697 ae_dev->dev_specs.max_int_gl = HCLGEVF_DEF_MAX_INT_GL;2698 ae_dev->dev_specs.max_frm_size = HCLGEVF_MAC_MAX_FRAME;2699}2700 2701static void hclgevf_parse_dev_specs(struct hclgevf_dev *hdev,2702 struct hclge_desc *desc)2703{2704 struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);2705 struct hclgevf_dev_specs_0_cmd *req0;2706 struct hclgevf_dev_specs_1_cmd *req1;2707 2708 req0 = (struct hclgevf_dev_specs_0_cmd *)desc[0].data;2709 req1 = (struct hclgevf_dev_specs_1_cmd *)desc[1].data;2710 2711 ae_dev->dev_specs.max_non_tso_bd_num = req0->max_non_tso_bd_num;2712 ae_dev->dev_specs.rss_ind_tbl_size =2713 le16_to_cpu(req0->rss_ind_tbl_size);2714 ae_dev->dev_specs.int_ql_max = le16_to_cpu(req0->int_ql_max);2715 ae_dev->dev_specs.rss_key_size = le16_to_cpu(req0->rss_key_size);2716 ae_dev->dev_specs.max_int_gl = le16_to_cpu(req1->max_int_gl);2717 ae_dev->dev_specs.max_frm_size = le16_to_cpu(req1->max_frm_size);2718}2719 2720static void hclgevf_check_dev_specs(struct hclgevf_dev *hdev)2721{2722 struct hnae3_dev_specs *dev_specs = &hdev->ae_dev->dev_specs;2723 2724 if (!dev_specs->max_non_tso_bd_num)2725 dev_specs->max_non_tso_bd_num = HCLGEVF_MAX_NON_TSO_BD_NUM;2726 if (!dev_specs->rss_ind_tbl_size)2727 dev_specs->rss_ind_tbl_size = HCLGEVF_RSS_IND_TBL_SIZE;2728 if (!dev_specs->rss_key_size)2729 dev_specs->rss_key_size = HCLGE_COMM_RSS_KEY_SIZE;2730 if (!dev_specs->max_int_gl)2731 dev_specs->max_int_gl = HCLGEVF_DEF_MAX_INT_GL;2732 if (!dev_specs->max_frm_size)2733 dev_specs->max_frm_size = HCLGEVF_MAC_MAX_FRAME;2734}2735 2736static int hclgevf_query_dev_specs(struct hclgevf_dev *hdev)2737{2738 struct hclge_desc desc[HCLGEVF_QUERY_DEV_SPECS_BD_NUM];2739 int ret;2740 int i;2741 2742 /* set default specifications as devices lower than version V3 do not2743 * support querying specifications from firmware.2744 */2745 if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V3) {2746 hclgevf_set_default_dev_specs(hdev);2747 return 0;2748 }2749 2750 for (i = 0; i < HCLGEVF_QUERY_DEV_SPECS_BD_NUM - 1; i++) {2751 hclgevf_cmd_setup_basic_desc(&desc[i],2752 HCLGE_OPC_QUERY_DEV_SPECS, true);2753 desc[i].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT);2754 }2755 hclgevf_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_QUERY_DEV_SPECS, true);2756 2757 ret = hclgevf_cmd_send(&hdev->hw, desc, HCLGEVF_QUERY_DEV_SPECS_BD_NUM);2758 if (ret)2759 return ret;2760 2761 hclgevf_parse_dev_specs(hdev, desc);2762 hclgevf_check_dev_specs(hdev);2763 2764 return 0;2765}2766 2767static int hclgevf_pci_reset(struct hclgevf_dev *hdev)2768{2769 struct pci_dev *pdev = hdev->pdev;2770 int ret = 0;2771 2772 if ((hdev->reset_type == HNAE3_VF_FULL_RESET ||2773 hdev->reset_type == HNAE3_FLR_RESET) &&2774 test_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state)) {2775 hclgevf_misc_irq_uninit(hdev);2776 hclgevf_uninit_msi(hdev);2777 clear_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state);2778 }2779 2780 if (!test_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state)) {2781 pci_set_master(pdev);2782 ret = hclgevf_init_msi(hdev);2783 if (ret) {2784 dev_err(&pdev->dev,2785 "failed(%d) to init MSI/MSI-X\n", ret);2786 return ret;2787 }2788 2789 ret = hclgevf_misc_irq_init(hdev);2790 if (ret) {2791 hclgevf_uninit_msi(hdev);2792 dev_err(&pdev->dev, "failed(%d) to init Misc IRQ(vector0)\n",2793 ret);2794 return ret;2795 }2796 2797 set_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state);2798 }2799 2800 return ret;2801}2802 2803static int hclgevf_clear_vport_list(struct hclgevf_dev *hdev)2804{2805 struct hclge_vf_to_pf_msg send_msg;2806 2807 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_HANDLE_VF_TBL,2808 HCLGE_MBX_VPORT_LIST_CLEAR);2809 return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);2810}2811 2812static void hclgevf_init_rxd_adv_layout(struct hclgevf_dev *hdev)2813{2814 if (hnae3_ae_dev_rxd_adv_layout_supported(hdev->ae_dev))2815 hclgevf_write_dev(&hdev->hw, HCLGEVF_RXD_ADV_LAYOUT_EN_REG, 1);2816}2817 2818static void hclgevf_uninit_rxd_adv_layout(struct hclgevf_dev *hdev)2819{2820 if (hnae3_ae_dev_rxd_adv_layout_supported(hdev->ae_dev))2821 hclgevf_write_dev(&hdev->hw, HCLGEVF_RXD_ADV_LAYOUT_EN_REG, 0);2822}2823 2824static int hclgevf_reset_hdev(struct hclgevf_dev *hdev)2825{2826 struct pci_dev *pdev = hdev->pdev;2827 int ret;2828 2829 ret = hclgevf_pci_reset(hdev);2830 if (ret) {2831 dev_err(&pdev->dev, "pci reset failed %d\n", ret);2832 return ret;2833 }2834 2835 hclgevf_arq_init(hdev);2836 2837 ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw,2838 &hdev->fw_version, false,2839 hdev->reset_pending);2840 if (ret) {2841 dev_err(&pdev->dev, "cmd failed %d\n", ret);2842 return ret;2843 }2844 2845 ret = hclgevf_rss_init_hw(hdev);2846 if (ret) {2847 dev_err(&hdev->pdev->dev,2848 "failed(%d) to initialize RSS\n", ret);2849 return ret;2850 }2851 2852 ret = hclgevf_config_gro(hdev);2853 if (ret)2854 return ret;2855 2856 ret = hclgevf_init_vlan_config(hdev);2857 if (ret) {2858 dev_err(&hdev->pdev->dev,2859 "failed(%d) to initialize VLAN config\n", ret);2860 return ret;2861 }2862 2863 /* get current port based vlan state from PF */2864 ret = hclgevf_get_port_base_vlan_filter_state(hdev);2865 if (ret)2866 return ret;2867 2868 set_bit(HCLGEVF_STATE_PROMISC_CHANGED, &hdev->state);2869 2870 hclgevf_init_rxd_adv_layout(hdev);2871 2872 dev_info(&hdev->pdev->dev, "Reset done\n");2873 2874 return 0;2875}2876 2877static int hclgevf_init_hdev(struct hclgevf_dev *hdev)2878{2879 struct pci_dev *pdev = hdev->pdev;2880 int ret;2881 2882 ret = hclgevf_pci_init(hdev);2883 if (ret)2884 return ret;2885 2886 ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw);2887 if (ret)2888 goto err_cmd_queue_init;2889 2890 hclgevf_arq_init(hdev);2891 2892 hclge_comm_cmd_init_ops(&hdev->hw.hw, &hclgevf_cmq_ops);2893 ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw,2894 &hdev->fw_version, false,2895 hdev->reset_pending);2896 if (ret)2897 goto err_cmd_init;2898 2899 /* Get vf resource */2900 ret = hclgevf_query_vf_resource(hdev);2901 if (ret)2902 goto err_cmd_init;2903 2904 ret = hclgevf_query_dev_specs(hdev);2905 if (ret) {2906 dev_err(&pdev->dev,2907 "failed to query dev specifications, ret = %d\n", ret);2908 goto err_cmd_init;2909 }2910 2911 ret = hclgevf_init_msi(hdev);2912 if (ret) {2913 dev_err(&pdev->dev, "failed(%d) to init MSI/MSI-X\n", ret);2914 goto err_cmd_init;2915 }2916 2917 hclgevf_state_init(hdev);2918 hdev->reset_level = HNAE3_VF_FUNC_RESET;2919 hdev->reset_type = HNAE3_NONE_RESET;2920 2921 ret = hclgevf_misc_irq_init(hdev);2922 if (ret)2923 goto err_misc_irq_init;2924 2925 set_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state);2926 2927 ret = hclgevf_configure(hdev);2928 if (ret) {2929 dev_err(&pdev->dev, "failed(%d) to fetch configuration\n", ret);2930 goto err_config;2931 }2932 2933 ret = hclgevf_alloc_tqps(hdev);2934 if (ret) {2935 dev_err(&pdev->dev, "failed(%d) to allocate TQPs\n", ret);2936 goto err_config;2937 }2938 2939 ret = hclgevf_set_handle_info(hdev);2940 if (ret)2941 goto err_config;2942 2943 ret = hclgevf_config_gro(hdev);2944 if (ret)2945 goto err_config;2946 2947 /* Initialize RSS for this VF */2948 ret = hclge_comm_rss_init_cfg(&hdev->nic, hdev->ae_dev,2949 &hdev->rss_cfg);2950 if (ret) {2951 dev_err(&pdev->dev, "failed to init rss cfg, ret = %d\n", ret);2952 goto err_config;2953 }2954 2955 ret = hclgevf_rss_init_hw(hdev);2956 if (ret) {2957 dev_err(&hdev->pdev->dev,2958 "failed(%d) to initialize RSS\n", ret);2959 goto err_config;2960 }2961 2962 /* ensure vf tbl list as empty before init */2963 ret = hclgevf_clear_vport_list(hdev);2964 if (ret) {2965 dev_err(&pdev->dev,2966 "failed to clear tbl list configuration, ret = %d.\n",2967 ret);2968 goto err_config;2969 }2970 2971 ret = hclgevf_init_vlan_config(hdev);2972 if (ret) {2973 dev_err(&hdev->pdev->dev,2974 "failed(%d) to initialize VLAN config\n", ret);2975 goto err_config;2976 }2977 2978 hclgevf_init_rxd_adv_layout(hdev);2979 2980 ret = hclgevf_devlink_init(hdev);2981 if (ret)2982 goto err_config;2983 2984 set_bit(HCLGEVF_STATE_SERVICE_INITED, &hdev->state);2985 2986 hdev->last_reset_time = jiffies;2987 dev_info(&hdev->pdev->dev, "finished initializing %s driver\n",2988 HCLGEVF_DRIVER_NAME);2989 2990 hclgevf_task_schedule(hdev, round_jiffies_relative(HZ));2991 timer_setup(&hdev->reset_timer, hclgevf_reset_timer, 0);2992 2993 return 0;2994 2995err_config:2996 hclgevf_misc_irq_uninit(hdev);2997err_misc_irq_init:2998 hclgevf_state_uninit(hdev);2999 hclgevf_uninit_msi(hdev);3000err_cmd_init:3001 hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw);3002err_cmd_queue_init:3003 hclgevf_pci_uninit(hdev);3004 clear_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state);3005 return ret;3006}3007 3008static void hclgevf_uninit_hdev(struct hclgevf_dev *hdev)3009{3010 struct hclge_vf_to_pf_msg send_msg;3011 3012 hclgevf_state_uninit(hdev);3013 hclgevf_uninit_rxd_adv_layout(hdev);3014 3015 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_VF_UNINIT, 0);3016 hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);3017 3018 if (test_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state)) {3019 hclgevf_misc_irq_uninit(hdev);3020 hclgevf_uninit_msi(hdev);3021 }3022 3023 hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw);3024 hclgevf_devlink_uninit(hdev);3025 hclgevf_pci_uninit(hdev);3026 hclgevf_uninit_mac_list(hdev);3027}3028 3029static int hclgevf_init_ae_dev(struct hnae3_ae_dev *ae_dev)3030{3031 struct pci_dev *pdev = ae_dev->pdev;3032 int ret;3033 3034 ret = hclgevf_alloc_hdev(ae_dev);3035 if (ret) {3036 dev_err(&pdev->dev, "hclge device allocation failed\n");3037 return ret;3038 }3039 3040 ret = hclgevf_init_hdev(ae_dev->priv);3041 if (ret) {3042 dev_err(&pdev->dev, "hclge device initialization failed\n");3043 return ret;3044 }3045 3046 return 0;3047}3048 3049static void hclgevf_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)3050{3051 struct hclgevf_dev *hdev = ae_dev->priv;3052 3053 hclgevf_uninit_hdev(hdev);3054 ae_dev->priv = NULL;3055}3056 3057static u32 hclgevf_get_max_channels(struct hclgevf_dev *hdev)3058{3059 struct hnae3_handle *nic = &hdev->nic;3060 struct hnae3_knic_private_info *kinfo = &nic->kinfo;3061 3062 return min_t(u32, hdev->rss_size_max,3063 hdev->num_tqps / kinfo->tc_info.num_tc);3064}3065 3066/**3067 * hclgevf_get_channels - Get the current channels enabled and max supported.3068 * @handle: hardware information for network interface3069 * @ch: ethtool channels structure3070 *3071 * We don't support separate tx and rx queues as channels. The other count3072 * represents how many queues are being used for control. max_combined counts3073 * how many queue pairs we can support. They may not be mapped 1 to 1 with3074 * q_vectors since we support a lot more queue pairs than q_vectors.3075 **/3076static void hclgevf_get_channels(struct hnae3_handle *handle,3077 struct ethtool_channels *ch)3078{3079 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3080 3081 ch->max_combined = hclgevf_get_max_channels(hdev);3082 ch->other_count = 0;3083 ch->max_other = 0;3084 ch->combined_count = handle->kinfo.rss_size;3085}3086 3087static void hclgevf_get_tqps_and_rss_info(struct hnae3_handle *handle,3088 u16 *alloc_tqps, u16 *max_rss_size)3089{3090 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3091 3092 *alloc_tqps = hdev->num_tqps;3093 *max_rss_size = hdev->rss_size_max;3094}3095 3096static void hclgevf_update_rss_size(struct hnae3_handle *handle,3097 u32 new_tqps_num)3098{3099 struct hnae3_knic_private_info *kinfo = &handle->kinfo;3100 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3101 u16 max_rss_size;3102 3103 kinfo->req_rss_size = new_tqps_num;3104 3105 max_rss_size = min_t(u16, hdev->rss_size_max,3106 hdev->num_tqps / kinfo->tc_info.num_tc);3107 3108 /* Use the user's configuration when it is not larger than3109 * max_rss_size, otherwise, use the maximum specification value.3110 */3111 if (kinfo->req_rss_size != kinfo->rss_size && kinfo->req_rss_size &&3112 kinfo->req_rss_size <= max_rss_size)3113 kinfo->rss_size = kinfo->req_rss_size;3114 else if (kinfo->rss_size > max_rss_size ||3115 (!kinfo->req_rss_size && kinfo->rss_size < max_rss_size))3116 kinfo->rss_size = max_rss_size;3117 3118 kinfo->num_tqps = kinfo->tc_info.num_tc * kinfo->rss_size;3119}3120 3121static int hclgevf_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,3122 bool rxfh_configured)3123{3124 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3125 struct hnae3_knic_private_info *kinfo = &handle->kinfo;3126 u16 tc_offset[HCLGE_COMM_MAX_TC_NUM];3127 u16 tc_valid[HCLGE_COMM_MAX_TC_NUM];3128 u16 tc_size[HCLGE_COMM_MAX_TC_NUM];3129 u16 cur_rss_size = kinfo->rss_size;3130 u16 cur_tqps = kinfo->num_tqps;3131 u32 *rss_indir;3132 unsigned int i;3133 int ret;3134 3135 hclgevf_update_rss_size(handle, new_tqps_num);3136 3137 hclge_comm_get_rss_tc_info(kinfo->rss_size, hdev->hw_tc_map,3138 tc_offset, tc_valid, tc_size);3139 ret = hclge_comm_set_rss_tc_mode(&hdev->hw.hw, tc_offset,3140 tc_valid, tc_size);3141 if (ret)3142 return ret;3143 3144 /* RSS indirection table has been configured by user */3145 if (rxfh_configured)3146 goto out;3147 3148 /* Reinitializes the rss indirect table according to the new RSS size */3149 rss_indir = kcalloc(hdev->ae_dev->dev_specs.rss_ind_tbl_size,3150 sizeof(u32), GFP_KERNEL);3151 if (!rss_indir)3152 return -ENOMEM;3153 3154 for (i = 0; i < hdev->ae_dev->dev_specs.rss_ind_tbl_size; i++)3155 rss_indir[i] = i % kinfo->rss_size;3156 3157 hdev->rss_cfg.rss_size = kinfo->rss_size;3158 3159 ret = hclgevf_set_rss(handle, rss_indir, NULL, 0);3160 if (ret)3161 dev_err(&hdev->pdev->dev, "set rss indir table fail, ret=%d\n",3162 ret);3163 3164 kfree(rss_indir);3165 3166out:3167 if (!ret)3168 dev_info(&hdev->pdev->dev,3169 "Channels changed, rss_size from %u to %u, tqps from %u to %u",3170 cur_rss_size, kinfo->rss_size,3171 cur_tqps, kinfo->rss_size * kinfo->tc_info.num_tc);3172 3173 return ret;3174}3175 3176static int hclgevf_get_status(struct hnae3_handle *handle)3177{3178 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3179 3180 return hdev->hw.mac.link;3181}3182 3183static void hclgevf_get_ksettings_an_result(struct hnae3_handle *handle,3184 u8 *auto_neg, u32 *speed,3185 u8 *duplex, u32 *lane_num)3186{3187 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3188 3189 if (speed)3190 *speed = hdev->hw.mac.speed;3191 if (duplex)3192 *duplex = hdev->hw.mac.duplex;3193 if (auto_neg)3194 *auto_neg = AUTONEG_DISABLE;3195}3196 3197void hclgevf_update_speed_duplex(struct hclgevf_dev *hdev, u32 speed,3198 u8 duplex)3199{3200 hdev->hw.mac.speed = speed;3201 hdev->hw.mac.duplex = duplex;3202}3203 3204static int hclgevf_gro_en(struct hnae3_handle *handle, bool enable)3205{3206 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3207 bool gro_en_old = hdev->gro_en;3208 int ret;3209 3210 hdev->gro_en = enable;3211 ret = hclgevf_config_gro(hdev);3212 if (ret)3213 hdev->gro_en = gro_en_old;3214 3215 return ret;3216}3217 3218static void hclgevf_get_media_type(struct hnae3_handle *handle, u8 *media_type,3219 u8 *module_type)3220{3221 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3222 3223 if (media_type)3224 *media_type = hdev->hw.mac.media_type;3225 3226 if (module_type)3227 *module_type = hdev->hw.mac.module_type;3228}3229 3230static bool hclgevf_get_hw_reset_stat(struct hnae3_handle *handle)3231{3232 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3233 3234 return !!hclgevf_read_dev(&hdev->hw, HCLGEVF_RST_ING);3235}3236 3237static bool hclgevf_get_cmdq_stat(struct hnae3_handle *handle)3238{3239 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3240 3241 return test_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hdev->hw.hw.comm_state);3242}3243 3244static bool hclgevf_ae_dev_resetting(struct hnae3_handle *handle)3245{3246 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3247 3248 return test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state);3249}3250 3251static unsigned long hclgevf_ae_dev_reset_cnt(struct hnae3_handle *handle)3252{3253 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3254 3255 return hdev->rst_stats.hw_rst_done_cnt;3256}3257 3258static void hclgevf_get_link_mode(struct hnae3_handle *handle,3259 unsigned long *supported,3260 unsigned long *advertising)3261{3262 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);3263 3264 *supported = hdev->hw.mac.supported;3265 *advertising = hdev->hw.mac.advertising;3266}3267 3268void hclgevf_update_port_base_vlan_info(struct hclgevf_dev *hdev, u16 state,3269 struct hclge_mbx_port_base_vlan *port_base_vlan)3270{3271 struct hnae3_handle *nic = &hdev->nic;3272 struct hclge_vf_to_pf_msg send_msg;3273 int ret;3274 3275 rtnl_lock();3276 3277 if (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state) ||3278 test_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state)) {3279 dev_warn(&hdev->pdev->dev,3280 "is resetting when updating port based vlan info\n");3281 rtnl_unlock();3282 return;3283 }3284 3285 ret = hclgevf_notify_client(hdev, HNAE3_DOWN_CLIENT);3286 if (ret) {3287 rtnl_unlock();3288 return;3289 }3290 3291 /* send msg to PF and wait update port based vlan info */3292 hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,3293 HCLGE_MBX_PORT_BASE_VLAN_CFG);3294 memcpy(send_msg.data, port_base_vlan, sizeof(*port_base_vlan));3295 ret = hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);3296 if (!ret) {3297 if (state == HNAE3_PORT_BASE_VLAN_DISABLE)3298 nic->port_base_vlan_state = state;3299 else3300 nic->port_base_vlan_state = HNAE3_PORT_BASE_VLAN_ENABLE;3301 }3302 3303 hclgevf_notify_client(hdev, HNAE3_UP_CLIENT);3304 rtnl_unlock();3305}3306 3307static const struct hnae3_ae_ops hclgevf_ops = {3308 .init_ae_dev = hclgevf_init_ae_dev,3309 .uninit_ae_dev = hclgevf_uninit_ae_dev,3310 .reset_prepare = hclgevf_reset_prepare_general,3311 .reset_done = hclgevf_reset_done,3312 .init_client_instance = hclgevf_init_client_instance,3313 .uninit_client_instance = hclgevf_uninit_client_instance,3314 .start = hclgevf_ae_start,3315 .stop = hclgevf_ae_stop,3316 .client_start = hclgevf_client_start,3317 .client_stop = hclgevf_client_stop,3318 .map_ring_to_vector = hclgevf_map_ring_to_vector,3319 .unmap_ring_from_vector = hclgevf_unmap_ring_from_vector,3320 .get_vector = hclgevf_get_vector,3321 .put_vector = hclgevf_put_vector,3322 .reset_queue = hclgevf_reset_tqp,3323 .get_mac_addr = hclgevf_get_mac_addr,3324 .set_mac_addr = hclgevf_set_mac_addr,3325 .add_uc_addr = hclgevf_add_uc_addr,3326 .rm_uc_addr = hclgevf_rm_uc_addr,3327 .add_mc_addr = hclgevf_add_mc_addr,3328 .rm_mc_addr = hclgevf_rm_mc_addr,3329 .get_stats = hclgevf_get_stats,3330 .update_stats = hclgevf_update_stats,3331 .get_strings = hclgevf_get_strings,3332 .get_sset_count = hclgevf_get_sset_count,3333 .get_rss_key_size = hclge_comm_get_rss_key_size,3334 .get_rss = hclgevf_get_rss,3335 .set_rss = hclgevf_set_rss,3336 .get_rss_tuple = hclgevf_get_rss_tuple,3337 .set_rss_tuple = hclgevf_set_rss_tuple,3338 .get_tc_size = hclgevf_get_tc_size,3339 .get_fw_version = hclgevf_get_fw_version,3340 .set_vlan_filter = hclgevf_set_vlan_filter,3341 .enable_vlan_filter = hclgevf_enable_vlan_filter,3342 .enable_hw_strip_rxvtag = hclgevf_en_hw_strip_rxvtag,3343 .reset_event = hclgevf_reset_event,3344 .set_default_reset_request = hclgevf_set_def_reset_request,3345 .set_channels = hclgevf_set_channels,3346 .get_channels = hclgevf_get_channels,3347 .get_tqps_and_rss_info = hclgevf_get_tqps_and_rss_info,3348 .get_regs_len = hclgevf_get_regs_len,3349 .get_regs = hclgevf_get_regs,3350 .get_status = hclgevf_get_status,3351 .get_ksettings_an_result = hclgevf_get_ksettings_an_result,3352 .get_media_type = hclgevf_get_media_type,3353 .get_hw_reset_stat = hclgevf_get_hw_reset_stat,3354 .ae_dev_resetting = hclgevf_ae_dev_resetting,3355 .ae_dev_reset_cnt = hclgevf_ae_dev_reset_cnt,3356 .set_gro_en = hclgevf_gro_en,3357 .set_mtu = hclgevf_set_mtu,3358 .get_global_queue_id = hclgevf_get_qid_global,3359 .set_timer_task = hclgevf_set_timer_task,3360 .get_link_mode = hclgevf_get_link_mode,3361 .set_promisc_mode = hclgevf_set_promisc_mode,3362 .request_update_promisc_mode = hclgevf_request_update_promisc_mode,3363 .get_cmdq_stat = hclgevf_get_cmdq_stat,3364};3365 3366static struct hnae3_ae_algo ae_algovf = {3367 .ops = &hclgevf_ops,3368 .pdev_id_table = ae_algovf_pci_tbl,3369};3370 3371static int __init hclgevf_init(void)3372{3373 pr_info("%s is initializing\n", HCLGEVF_NAME);3374 3375 hclgevf_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, HCLGEVF_NAME);3376 if (!hclgevf_wq) {3377 pr_err("%s: failed to create workqueue\n", HCLGEVF_NAME);3378 return -ENOMEM;3379 }3380 3381 hnae3_register_ae_algo(&ae_algovf);3382 3383 return 0;3384}3385 3386static void __exit hclgevf_exit(void)3387{3388 hnae3_unregister_ae_algo(&ae_algovf);3389 destroy_workqueue(hclgevf_wq);3390}3391module_init(hclgevf_init);3392module_exit(hclgevf_exit);3393 3394MODULE_LICENSE("GPL");3395MODULE_AUTHOR("Huawei Tech. Co., Ltd.");3396MODULE_DESCRIPTION("HCLGEVF Driver");3397MODULE_VERSION(HCLGEVF_MOD_VERSION);3398