1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright(c) 2013 - 2018 Intel Corporation. */ 3 4 #include <linux/list.h> 5 #include <linux/errno.h> 6 #include <linux/net/intel/i40e_client.h> 7 8 #include "i40e.h" 9 #include "i40e_prototype.h" 10 11 static const char i40e_client_interface_version_str[] = I40E_CLIENT_VERSION_STR; 12 static struct i40e_client *registered_client; 13 static LIST_HEAD(i40e_devices); 14 static DEFINE_MUTEX(i40e_device_mutex); 15 16 static int i40e_client_virtchnl_send(struct i40e_info *ldev, 17 struct i40e_client *client, 18 u32 vf_id, u8 *msg, u16 len); 19 20 static int i40e_client_setup_qvlist(struct i40e_info *ldev, 21 struct i40e_client *client, 22 struct i40e_qvlist_info *qvlist_info); 23 24 static void i40e_client_request_reset(struct i40e_info *ldev, 25 struct i40e_client *client, 26 u32 reset_level); 27 28 static int i40e_client_update_vsi_ctxt(struct i40e_info *ldev, 29 struct i40e_client *client, 30 bool is_vf, u32 vf_id, 31 u32 flag, u32 valid_flag); 32 33 static struct i40e_ops i40e_lan_ops = { 34 .virtchnl_send = i40e_client_virtchnl_send, 35 .setup_qvlist = i40e_client_setup_qvlist, 36 .request_reset = i40e_client_request_reset, 37 .update_vsi_ctxt = i40e_client_update_vsi_ctxt, 38 }; 39 40 /** 41 * i40e_client_get_params - Get the params that can change at runtime 42 * @vsi: the VSI with the message 43 * @params: client param struct 44 * 45 **/ 46 static 47 int i40e_client_get_params(struct i40e_vsi *vsi, struct i40e_params *params) 48 { 49 struct i40e_dcbx_config *dcb_cfg = &vsi->back->hw.local_dcbx_config; 50 int i = 0; 51 52 for (i = 0; i < I40E_MAX_USER_PRIORITY; i++) { 53 u8 tc = dcb_cfg->etscfg.prioritytable[i]; 54 u16 qs_handle; 55 56 /* If TC is not enabled for VSI use TC0 for UP */ 57 if (!(vsi->tc_config.enabled_tc & BIT(tc))) 58 tc = 0; 59 60 qs_handle = le16_to_cpu(vsi->info.qs_handle[tc]); 61 params->qos.prio_qos[i].tc = tc; 62 params->qos.prio_qos[i].qs_handle = qs_handle; 63 if (qs_handle == I40E_AQ_VSI_QS_HANDLE_INVALID) { 64 dev_err(&vsi->back->pdev->dev, "Invalid queue set handle for TC = %d, vsi id = %d\n", 65 tc, vsi->id); 66 return -EINVAL; 67 } 68 } 69 70 params->mtu = vsi->netdev->mtu; 71 return 0; 72 } 73 74 /** 75 * i40e_notify_client_of_vf_msg - call the client vf message callback 76 * @vsi: the VSI with the message 77 * @vf_id: the absolute VF id that sent the message 78 * @msg: message buffer 79 * @len: length of the message 80 * 81 * If there is a client to this VSI, call the client 82 **/ 83 void 84 i40e_notify_client_of_vf_msg(struct i40e_vsi *vsi, u32 vf_id, u8 *msg, u16 len) 85 { 86 struct i40e_pf *pf = vsi->back; 87 struct i40e_client_instance *cdev = pf->cinst; 88 89 if (!cdev || !cdev->client) 90 return; 91 if (!cdev->client->ops || !cdev->client->ops->virtchnl_receive) { 92 dev_dbg(&pf->pdev->dev, 93 "Cannot locate client instance virtual channel receive routine\n"); 94 return; 95 } 96 if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) { 97 dev_dbg(&pf->pdev->dev, "Client is not open, abort virtchnl_receive\n"); 98 return; 99 } 100 cdev->client->ops->virtchnl_receive(&cdev->lan_info, cdev->client, 101 vf_id, msg, len); 102 } 103 104 /** 105 * i40e_notify_client_of_l2_param_changes - call the client notify callback 106 * @vsi: the VSI with l2 param changes 107 * 108 * If there is a client to this VSI, call the client 109 **/ 110 void i40e_notify_client_of_l2_param_changes(struct i40e_vsi *vsi) 111 { 112 struct i40e_pf *pf = vsi->back; 113 struct i40e_client_instance *cdev = pf->cinst; 114 struct i40e_params params; 115 116 if (!cdev || !cdev->client) 117 return; 118 if (!cdev->client->ops || !cdev->client->ops->l2_param_change) { 119 dev_dbg(&vsi->back->pdev->dev, 120 "Cannot locate client instance l2_param_change routine\n"); 121 return; 122 } 123 if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) { 124 dev_dbg(&vsi->back->pdev->dev, "Client is not open, abort l2 param change\n"); 125 return; 126 } 127 memset(¶ms, 0, sizeof(params)); 128 i40e_client_get_params(vsi, ¶ms); 129 memcpy(&cdev->lan_info.params, ¶ms, sizeof(struct i40e_params)); 130 cdev->client->ops->l2_param_change(&cdev->lan_info, cdev->client, 131 ¶ms); 132 } 133 134 /** 135 * i40e_client_release_qvlist - release MSI-X vector mapping for client 136 * @ldev: pointer to L2 context. 137 * 138 **/ 139 static void i40e_client_release_qvlist(struct i40e_info *ldev) 140 { 141 struct i40e_qvlist_info *qvlist_info = ldev->qvlist_info; 142 u32 i; 143 144 if (!ldev->qvlist_info) 145 return; 146 147 for (i = 0; i < qvlist_info->num_vectors; i++) { 148 struct i40e_pf *pf = ldev->pf; 149 struct i40e_qv_info *qv_info; 150 u32 reg_idx; 151 152 qv_info = &qvlist_info->qv_info[i]; 153 if (!qv_info) 154 continue; 155 reg_idx = I40E_PFINT_LNKLSTN(qv_info->v_idx - 1); 156 wr32(&pf->hw, reg_idx, I40E_PFINT_LNKLSTN_FIRSTQ_INDX_MASK); 157 } 158 kfree(ldev->qvlist_info); 159 ldev->qvlist_info = NULL; 160 } 161 162 /** 163 * i40e_notify_client_of_netdev_close - call the client close callback 164 * @vsi: the VSI with netdev closed 165 * @reset: true when close called due to a reset pending 166 * 167 * If there is a client to this netdev, call the client with close 168 **/ 169 void i40e_notify_client_of_netdev_close(struct i40e_vsi *vsi, bool reset) 170 { 171 struct i40e_pf *pf = vsi->back; 172 struct i40e_client_instance *cdev = pf->cinst; 173 174 if (!cdev || !cdev->client) 175 return; 176 if (!cdev->client->ops || !cdev->client->ops->close) { 177 dev_dbg(&vsi->back->pdev->dev, 178 "Cannot locate client instance close routine\n"); 179 return; 180 } 181 cdev->client->ops->close(&cdev->lan_info, cdev->client, reset); 182 clear_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state); 183 i40e_client_release_qvlist(&cdev->lan_info); 184 } 185 186 /** 187 * i40e_notify_client_of_vf_reset - call the client vf reset callback 188 * @pf: PF device pointer 189 * @vf_id: asolute id of VF being reset 190 * 191 * If there is a client attached to this PF, notify when a VF is reset 192 **/ 193 void i40e_notify_client_of_vf_reset(struct i40e_pf *pf, u32 vf_id) 194 { 195 struct i40e_client_instance *cdev = pf->cinst; 196 197 if (!cdev || !cdev->client) 198 return; 199 if (!cdev->client->ops || !cdev->client->ops->vf_reset) { 200 dev_dbg(&pf->pdev->dev, 201 "Cannot locate client instance VF reset routine\n"); 202 return; 203 } 204 if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) { 205 dev_dbg(&pf->pdev->dev, "Client is not open, abort vf-reset\n"); 206 return; 207 } 208 cdev->client->ops->vf_reset(&cdev->lan_info, cdev->client, vf_id); 209 } 210 211 /** 212 * i40e_notify_client_of_vf_enable - call the client vf notification callback 213 * @pf: PF device pointer 214 * @num_vfs: the number of VFs currently enabled, 0 for disable 215 * 216 * If there is a client attached to this PF, call its VF notification routine 217 **/ 218 void i40e_notify_client_of_vf_enable(struct i40e_pf *pf, u32 num_vfs) 219 { 220 struct i40e_client_instance *cdev = pf->cinst; 221 222 if (!cdev || !cdev->client) 223 return; 224 if (!cdev->client->ops || !cdev->client->ops->vf_enable) { 225 dev_dbg(&pf->pdev->dev, 226 "Cannot locate client instance VF enable routine\n"); 227 return; 228 } 229 if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, 230 &cdev->state)) { 231 dev_dbg(&pf->pdev->dev, "Client is not open, abort vf-enable\n"); 232 return; 233 } 234 cdev->client->ops->vf_enable(&cdev->lan_info, cdev->client, num_vfs); 235 } 236 237 /** 238 * i40e_vf_client_capable - ask the client if it likes the specified VF 239 * @pf: PF device pointer 240 * @vf_id: the VF in question 241 * 242 * If there is a client of the specified type attached to this PF, call 243 * its vf_capable routine 244 **/ 245 int i40e_vf_client_capable(struct i40e_pf *pf, u32 vf_id) 246 { 247 struct i40e_client_instance *cdev = pf->cinst; 248 int capable = false; 249 250 if (!cdev || !cdev->client) 251 goto out; 252 if (!cdev->client->ops || !cdev->client->ops->vf_capable) { 253 dev_dbg(&pf->pdev->dev, 254 "Cannot locate client instance VF capability routine\n"); 255 goto out; 256 } 257 if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) 258 goto out; 259 260 capable = cdev->client->ops->vf_capable(&cdev->lan_info, 261 cdev->client, 262 vf_id); 263 out: 264 return capable; 265 } 266 267 void i40e_client_update_msix_info(struct i40e_pf *pf) 268 { 269 struct i40e_client_instance *cdev = pf->cinst; 270 271 if (!cdev || !cdev->client) 272 return; 273 274 cdev->lan_info.msix_count = pf->num_iwarp_msix; 275 cdev->lan_info.msix_entries = &pf->msix_entries[pf->iwarp_base_vector]; 276 } 277 278 /** 279 * i40e_client_add_instance - add a client instance struct to the instance list 280 * @pf: pointer to the board struct 281 * 282 **/ 283 static void i40e_client_add_instance(struct i40e_pf *pf) 284 { 285 struct i40e_client_instance *cdev = NULL; 286 struct netdev_hw_addr *mac = NULL; 287 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; 288 289 if (!registered_client || pf->cinst) 290 return; 291 292 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); 293 if (!cdev) 294 return; 295 296 cdev->lan_info.pf = (void *)pf; 297 cdev->lan_info.netdev = vsi->netdev; 298 cdev->lan_info.pcidev = pf->pdev; 299 cdev->lan_info.fid = pf->hw.pf_id; 300 cdev->lan_info.ftype = I40E_CLIENT_FTYPE_PF; 301 cdev->lan_info.hw_addr = pf->hw.hw_addr; 302 cdev->lan_info.ops = &i40e_lan_ops; 303 cdev->lan_info.version.major = I40E_CLIENT_VERSION_MAJOR; 304 cdev->lan_info.version.minor = I40E_CLIENT_VERSION_MINOR; 305 cdev->lan_info.version.build = I40E_CLIENT_VERSION_BUILD; 306 cdev->lan_info.fw_maj_ver = pf->hw.aq.fw_maj_ver; 307 cdev->lan_info.fw_min_ver = pf->hw.aq.fw_min_ver; 308 cdev->lan_info.fw_build = pf->hw.aq.fw_build; 309 set_bit(__I40E_CLIENT_INSTANCE_NONE, &cdev->state); 310 311 if (i40e_client_get_params(vsi, &cdev->lan_info.params)) { 312 kfree(cdev); 313 cdev = NULL; 314 return; 315 } 316 317 mac = list_first_entry(&cdev->lan_info.netdev->dev_addrs.list, 318 struct netdev_hw_addr, list); 319 if (mac) 320 ether_addr_copy(cdev->lan_info.lanmac, mac->addr); 321 else 322 dev_err(&pf->pdev->dev, "MAC address list is empty!\n"); 323 324 cdev->client = registered_client; 325 pf->cinst = cdev; 326 327 i40e_client_update_msix_info(pf); 328 } 329 330 /** 331 * i40e_client_del_instance - removes a client instance from the list 332 * @pf: pointer to the board struct 333 * 334 **/ 335 static 336 void i40e_client_del_instance(struct i40e_pf *pf) 337 { 338 kfree(pf->cinst); 339 pf->cinst = NULL; 340 } 341 342 /** 343 * i40e_client_subtask - client maintenance work 344 * @pf: board private structure 345 **/ 346 void i40e_client_subtask(struct i40e_pf *pf) 347 { 348 struct i40e_client *client = registered_client; 349 struct i40e_client_instance *cdev; 350 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; 351 int ret = 0; 352 353 if (!test_and_clear_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state)) 354 return; 355 cdev = pf->cinst; 356 357 /* If we're down or resetting, just bail */ 358 if (test_bit(__I40E_DOWN, pf->state) || 359 test_bit(__I40E_CONFIG_BUSY, pf->state)) 360 return; 361 362 if (!client || !cdev) 363 return; 364 365 /* Here we handle client opens. If the client is down, and 366 * the netdev is registered, then open the client. 367 */ 368 if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) { 369 if (vsi->netdev_registered && 370 client->ops && client->ops->open) { 371 set_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state); 372 ret = client->ops->open(&cdev->lan_info, client); 373 if (ret) { 374 /* Remove failed client instance */ 375 clear_bit(__I40E_CLIENT_INSTANCE_OPENED, 376 &cdev->state); 377 i40e_client_del_instance(pf); 378 return; 379 } 380 } 381 } 382 383 /* enable/disable PE TCP_ENA flag based on netdev down/up 384 */ 385 if (test_bit(__I40E_VSI_DOWN, vsi->state)) 386 i40e_client_update_vsi_ctxt(&cdev->lan_info, client, 387 0, 0, 0, 388 I40E_CLIENT_VSI_FLAG_TCP_ENABLE); 389 else 390 i40e_client_update_vsi_ctxt(&cdev->lan_info, client, 391 0, 0, 392 I40E_CLIENT_VSI_FLAG_TCP_ENABLE, 393 I40E_CLIENT_VSI_FLAG_TCP_ENABLE); 394 } 395 396 /** 397 * i40e_lan_add_device - add a lan device struct to the list of lan devices 398 * @pf: pointer to the board struct 399 * 400 * Returns 0 on success or none 0 on error 401 **/ 402 int i40e_lan_add_device(struct i40e_pf *pf) 403 { 404 struct i40e_device *ldev; 405 int ret = 0; 406 407 mutex_lock(&i40e_device_mutex); 408 list_for_each_entry(ldev, &i40e_devices, list) { 409 if (ldev->pf == pf) { 410 ret = -EEXIST; 411 goto out; 412 } 413 } 414 ldev = kzalloc(sizeof(*ldev), GFP_KERNEL); 415 if (!ldev) { 416 ret = -ENOMEM; 417 goto out; 418 } 419 ldev->pf = pf; 420 INIT_LIST_HEAD(&ldev->list); 421 list_add(&ldev->list, &i40e_devices); 422 dev_info(&pf->pdev->dev, "Added LAN device PF%d bus=0x%02x dev=0x%02x func=0x%02x\n", 423 pf->hw.pf_id, pf->hw.bus.bus_id, 424 pf->hw.bus.device, pf->hw.bus.func); 425 426 /* If a client has already been registered, we need to add an instance 427 * of it to our new LAN device. 428 */ 429 if (registered_client) 430 i40e_client_add_instance(pf); 431 432 /* Since in some cases register may have happened before a device gets 433 * added, we can schedule a subtask to go initiate the clients if 434 * they can be launched at probe time. 435 */ 436 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); 437 i40e_service_event_schedule(pf); 438 439 out: 440 mutex_unlock(&i40e_device_mutex); 441 return ret; 442 } 443 444 /** 445 * i40e_lan_del_device - removes a lan device from the device list 446 * @pf: pointer to the board struct 447 * 448 * Returns 0 on success or non-0 on error 449 **/ 450 int i40e_lan_del_device(struct i40e_pf *pf) 451 { 452 struct i40e_device *ldev, *tmp; 453 int ret = -ENODEV; 454 455 /* First, remove any client instance. */ 456 i40e_client_del_instance(pf); 457 458 mutex_lock(&i40e_device_mutex); 459 list_for_each_entry_safe(ldev, tmp, &i40e_devices, list) { 460 if (ldev->pf == pf) { 461 dev_info(&pf->pdev->dev, "Deleted LAN device PF%d bus=0x%02x dev=0x%02x func=0x%02x\n", 462 pf->hw.pf_id, pf->hw.bus.bus_id, 463 pf->hw.bus.device, pf->hw.bus.func); 464 list_del(&ldev->list); 465 kfree(ldev); 466 ret = 0; 467 break; 468 } 469 } 470 mutex_unlock(&i40e_device_mutex); 471 return ret; 472 } 473 474 /** 475 * i40e_client_release - release client specific resources 476 * @client: pointer to the registered client 477 * 478 **/ 479 static void i40e_client_release(struct i40e_client *client) 480 { 481 struct i40e_client_instance *cdev; 482 struct i40e_device *ldev; 483 struct i40e_pf *pf; 484 485 mutex_lock(&i40e_device_mutex); 486 list_for_each_entry(ldev, &i40e_devices, list) { 487 pf = ldev->pf; 488 cdev = pf->cinst; 489 if (!cdev) 490 continue; 491 492 while (test_and_set_bit(__I40E_SERVICE_SCHED, 493 pf->state)) 494 usleep_range(500, 1000); 495 496 if (test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) { 497 if (client->ops && client->ops->close) 498 client->ops->close(&cdev->lan_info, client, 499 false); 500 i40e_client_release_qvlist(&cdev->lan_info); 501 clear_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state); 502 503 dev_warn(&pf->pdev->dev, 504 "Client %s instance for PF id %d closed\n", 505 client->name, pf->hw.pf_id); 506 } 507 /* delete the client instance */ 508 i40e_client_del_instance(pf); 509 dev_info(&pf->pdev->dev, "Deleted client instance of Client %s\n", 510 client->name); 511 clear_bit(__I40E_SERVICE_SCHED, pf->state); 512 } 513 mutex_unlock(&i40e_device_mutex); 514 } 515 516 /** 517 * i40e_client_prepare - prepare client specific resources 518 * @client: pointer to the registered client 519 * 520 **/ 521 static void i40e_client_prepare(struct i40e_client *client) 522 { 523 struct i40e_device *ldev; 524 struct i40e_pf *pf; 525 526 mutex_lock(&i40e_device_mutex); 527 list_for_each_entry(ldev, &i40e_devices, list) { 528 pf = ldev->pf; 529 i40e_client_add_instance(pf); 530 /* Start the client subtask */ 531 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); 532 i40e_service_event_schedule(pf); 533 } 534 mutex_unlock(&i40e_device_mutex); 535 } 536 537 /** 538 * i40e_client_virtchnl_send - TBD 539 * @ldev: pointer to L2 context 540 * @client: Client pointer 541 * @vf_id: absolute VF identifier 542 * @msg: message buffer 543 * @len: length of message buffer 544 * 545 * Return 0 on success or < 0 on error 546 **/ 547 static int i40e_client_virtchnl_send(struct i40e_info *ldev, 548 struct i40e_client *client, 549 u32 vf_id, u8 *msg, u16 len) 550 { 551 struct i40e_pf *pf = ldev->pf; 552 struct i40e_hw *hw = &pf->hw; 553 i40e_status err; 554 555 err = i40e_aq_send_msg_to_vf(hw, vf_id, VIRTCHNL_OP_IWARP, 556 0, msg, len, NULL); 557 if (err) 558 dev_err(&pf->pdev->dev, "Unable to send iWarp message to VF, error %d, aq status %d\n", 559 err, hw->aq.asq_last_status); 560 561 return err; 562 } 563 564 /** 565 * i40e_client_setup_qvlist 566 * @ldev: pointer to L2 context. 567 * @client: Client pointer. 568 * @qvlist_info: queue and vector list 569 * 570 * Return 0 on success or < 0 on error 571 **/ 572 static int i40e_client_setup_qvlist(struct i40e_info *ldev, 573 struct i40e_client *client, 574 struct i40e_qvlist_info *qvlist_info) 575 { 576 struct i40e_pf *pf = ldev->pf; 577 struct i40e_hw *hw = &pf->hw; 578 struct i40e_qv_info *qv_info; 579 u32 v_idx, i, reg_idx, reg; 580 581 ldev->qvlist_info = kzalloc(struct_size(ldev->qvlist_info, qv_info, 582 qvlist_info->num_vectors - 1), GFP_KERNEL); 583 if (!ldev->qvlist_info) 584 return -ENOMEM; 585 ldev->qvlist_info->num_vectors = qvlist_info->num_vectors; 586 587 for (i = 0; i < qvlist_info->num_vectors; i++) { 588 qv_info = &qvlist_info->qv_info[i]; 589 if (!qv_info) 590 continue; 591 v_idx = qv_info->v_idx; 592 593 /* Validate vector id belongs to this client */ 594 if ((v_idx >= (pf->iwarp_base_vector + pf->num_iwarp_msix)) || 595 (v_idx < pf->iwarp_base_vector)) 596 goto err; 597 598 ldev->qvlist_info->qv_info[i] = *qv_info; 599 reg_idx = I40E_PFINT_LNKLSTN(v_idx - 1); 600 601 if (qv_info->ceq_idx == I40E_QUEUE_INVALID_IDX) { 602 /* Special case - No CEQ mapped on this vector */ 603 wr32(hw, reg_idx, I40E_PFINT_LNKLSTN_FIRSTQ_INDX_MASK); 604 } else { 605 reg = (qv_info->ceq_idx & 606 I40E_PFINT_LNKLSTN_FIRSTQ_INDX_MASK) | 607 (I40E_QUEUE_TYPE_PE_CEQ << 608 I40E_PFINT_LNKLSTN_FIRSTQ_TYPE_SHIFT); 609 wr32(hw, reg_idx, reg); 610 611 reg = (I40E_PFINT_CEQCTL_CAUSE_ENA_MASK | 612 (v_idx << I40E_PFINT_CEQCTL_MSIX_INDX_SHIFT) | 613 (qv_info->itr_idx << 614 I40E_PFINT_CEQCTL_ITR_INDX_SHIFT) | 615 (I40E_QUEUE_END_OF_LIST << 616 I40E_PFINT_CEQCTL_NEXTQ_INDX_SHIFT)); 617 wr32(hw, I40E_PFINT_CEQCTL(qv_info->ceq_idx), reg); 618 } 619 if (qv_info->aeq_idx != I40E_QUEUE_INVALID_IDX) { 620 reg = (I40E_PFINT_AEQCTL_CAUSE_ENA_MASK | 621 (v_idx << I40E_PFINT_AEQCTL_MSIX_INDX_SHIFT) | 622 (qv_info->itr_idx << 623 I40E_PFINT_AEQCTL_ITR_INDX_SHIFT)); 624 625 wr32(hw, I40E_PFINT_AEQCTL, reg); 626 } 627 } 628 /* Mitigate sync problems with iwarp VF driver */ 629 i40e_flush(hw); 630 return 0; 631 err: 632 kfree(ldev->qvlist_info); 633 ldev->qvlist_info = NULL; 634 return -EINVAL; 635 } 636 637 /** 638 * i40e_client_request_reset 639 * @ldev: pointer to L2 context. 640 * @client: Client pointer. 641 * @reset_level: reset level 642 **/ 643 static void i40e_client_request_reset(struct i40e_info *ldev, 644 struct i40e_client *client, 645 u32 reset_level) 646 { 647 struct i40e_pf *pf = ldev->pf; 648 649 switch (reset_level) { 650 case I40E_CLIENT_RESET_LEVEL_PF: 651 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); 652 break; 653 case I40E_CLIENT_RESET_LEVEL_CORE: 654 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); 655 break; 656 default: 657 dev_warn(&pf->pdev->dev, 658 "Client for PF id %d requested an unsupported reset: %d.\n", 659 pf->hw.pf_id, reset_level); 660 break; 661 } 662 663 i40e_service_event_schedule(pf); 664 } 665 666 /** 667 * i40e_client_update_vsi_ctxt 668 * @ldev: pointer to L2 context. 669 * @client: Client pointer. 670 * @is_vf: if this for the VF 671 * @vf_id: if is_vf true this carries the vf_id 672 * @flag: Any device level setting that needs to be done for PE 673 * @valid_flag: Bits in this match up and enable changing of flag bits 674 * 675 * Return 0 on success or < 0 on error 676 **/ 677 static int i40e_client_update_vsi_ctxt(struct i40e_info *ldev, 678 struct i40e_client *client, 679 bool is_vf, u32 vf_id, 680 u32 flag, u32 valid_flag) 681 { 682 struct i40e_pf *pf = ldev->pf; 683 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; 684 struct i40e_vsi_context ctxt; 685 bool update = true; 686 i40e_status err; 687 688 /* TODO: for now do not allow setting VF's VSI setting */ 689 if (is_vf) 690 return -EINVAL; 691 692 ctxt.seid = pf->main_vsi_seid; 693 ctxt.pf_num = pf->hw.pf_id; 694 err = i40e_aq_get_vsi_params(&pf->hw, &ctxt, NULL); 695 ctxt.flags = I40E_AQ_VSI_TYPE_PF; 696 if (err) { 697 dev_info(&pf->pdev->dev, 698 "couldn't get PF vsi config, err %s aq_err %s\n", 699 i40e_stat_str(&pf->hw, err), 700 i40e_aq_str(&pf->hw, 701 pf->hw.aq.asq_last_status)); 702 return -ENOENT; 703 } 704 705 if ((valid_flag & I40E_CLIENT_VSI_FLAG_TCP_ENABLE) && 706 (flag & I40E_CLIENT_VSI_FLAG_TCP_ENABLE)) { 707 ctxt.info.valid_sections = 708 cpu_to_le16(I40E_AQ_VSI_PROP_QUEUE_OPT_VALID); 709 ctxt.info.queueing_opt_flags |= I40E_AQ_VSI_QUE_OPT_TCP_ENA; 710 } else if ((valid_flag & I40E_CLIENT_VSI_FLAG_TCP_ENABLE) && 711 !(flag & I40E_CLIENT_VSI_FLAG_TCP_ENABLE)) { 712 ctxt.info.valid_sections = 713 cpu_to_le16(I40E_AQ_VSI_PROP_QUEUE_OPT_VALID); 714 ctxt.info.queueing_opt_flags &= ~I40E_AQ_VSI_QUE_OPT_TCP_ENA; 715 } else { 716 update = false; 717 dev_warn(&pf->pdev->dev, 718 "Client for PF id %d request an unsupported Config: %x.\n", 719 pf->hw.pf_id, flag); 720 } 721 722 if (update) { 723 err = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); 724 if (err) { 725 dev_info(&pf->pdev->dev, 726 "update VSI ctxt for PE failed, err %s aq_err %s\n", 727 i40e_stat_str(&pf->hw, err), 728 i40e_aq_str(&pf->hw, 729 pf->hw.aq.asq_last_status)); 730 } 731 } 732 return err; 733 } 734 735 /** 736 * i40e_register_client - Register a i40e client driver with the L2 driver 737 * @client: pointer to the i40e_client struct 738 * 739 * Returns 0 on success or non-0 on error 740 **/ 741 int i40e_register_client(struct i40e_client *client) 742 { 743 int ret = 0; 744 745 if (!client) { 746 ret = -EIO; 747 goto out; 748 } 749 750 if (strlen(client->name) == 0) { 751 pr_info("i40e: Failed to register client with no name\n"); 752 ret = -EIO; 753 goto out; 754 } 755 756 if (registered_client) { 757 pr_info("i40e: Client %s has already been registered!\n", 758 client->name); 759 ret = -EEXIST; 760 goto out; 761 } 762 763 if ((client->version.major != I40E_CLIENT_VERSION_MAJOR) || 764 (client->version.minor != I40E_CLIENT_VERSION_MINOR)) { 765 pr_info("i40e: Failed to register client %s due to mismatched client interface version\n", 766 client->name); 767 pr_info("Client is using version: %02d.%02d.%02d while LAN driver supports %s\n", 768 client->version.major, client->version.minor, 769 client->version.build, 770 i40e_client_interface_version_str); 771 ret = -EIO; 772 goto out; 773 } 774 775 registered_client = client; 776 777 i40e_client_prepare(client); 778 779 pr_info("i40e: Registered client %s\n", client->name); 780 out: 781 return ret; 782 } 783 EXPORT_SYMBOL(i40e_register_client); 784 785 /** 786 * i40e_unregister_client - Unregister a i40e client driver with the L2 driver 787 * @client: pointer to the i40e_client struct 788 * 789 * Returns 0 on success or non-0 on error 790 **/ 791 int i40e_unregister_client(struct i40e_client *client) 792 { 793 int ret = 0; 794 795 if (registered_client != client) { 796 pr_info("i40e: Client %s has not been registered\n", 797 client->name); 798 ret = -ENODEV; 799 goto out; 800 } 801 registered_client = NULL; 802 /* When a unregister request comes through we would have to send 803 * a close for each of the client instances that were opened. 804 * client_release function is called to handle this. 805 */ 806 i40e_client_release(client); 807 808 pr_info("i40e: Unregistered client %s\n", client->name); 809 out: 810 return ret; 811 } 812 EXPORT_SYMBOL(i40e_unregister_client); 813