1 // SPDX-License-Identifier: GPL-2.0-only 2 // Copyright 2025 Cisco Systems, Inc. All rights reserved. 3 4 #include <linux/kernel.h> 5 #include <linux/netdevice.h> 6 #include <linux/dma-mapping.h> 7 #include <linux/interrupt.h> 8 9 #include "vnic_dev.h" 10 #include "vnic_wq.h" 11 #include "vnic_rq.h" 12 #include "vnic_cq.h" 13 #include "vnic_intr.h" 14 #include "vnic_resource.h" 15 #include "vnic_devcmd.h" 16 #include "enic.h" 17 #include "enic_admin.h" 18 #include "cq_desc.h" 19 #include "cq_enet_desc.h" 20 #include "wq_enet_desc.h" 21 #include "rq_enet_desc.h" 22 #include "enic_mbox.h" 23 24 /* Retry interval for a failed admin RQ refill. Short so the control 25 * channel recovers quickly once memory is available again. 26 */ 27 #define ENIC_ADMIN_RQ_REFILL_RETRY_MS 100 28 29 /* Clean up any admin WQ buffers still held by hardware at close time. 30 * Normally buffers are freed inline after send completion, but a timed-out 31 * send intentionally leaves the buffer live until the queue is stopped. 32 */ 33 static void enic_admin_wq_buf_clean(struct vnic_wq *wq, 34 struct vnic_wq_buf *buf) 35 { 36 struct enic *enic = vnic_dev_priv(wq->vdev); 37 38 if (buf->os_buf) { 39 dma_unmap_single(&enic->pdev->dev, buf->dma_addr, 40 buf->len, DMA_TO_DEVICE); 41 kfree(buf->os_buf); 42 buf->os_buf = NULL; 43 } 44 } 45 46 static void enic_admin_rq_buf_clean(struct vnic_rq *rq, 47 struct vnic_rq_buf *buf) 48 { 49 struct enic *enic = vnic_dev_priv(rq->vdev); 50 51 if (!buf->os_buf) 52 return; 53 54 dma_unmap_single(&enic->pdev->dev, buf->dma_addr, buf->len, 55 DMA_FROM_DEVICE); 56 kfree(buf->os_buf); 57 buf->os_buf = NULL; 58 } 59 60 static int enic_admin_rq_post_one(struct enic *enic, gfp_t gfp) 61 { 62 struct vnic_rq *rq = &enic->admin_rq; 63 struct rq_enet_desc *desc; 64 dma_addr_t dma_addr; 65 void *buf; 66 67 buf = kzalloc(ENIC_ADMIN_BUF_SIZE, gfp); 68 if (!buf) 69 return -ENOMEM; 70 71 dma_addr = dma_map_single(&enic->pdev->dev, buf, ENIC_ADMIN_BUF_SIZE, 72 DMA_FROM_DEVICE); 73 if (dma_mapping_error(&enic->pdev->dev, dma_addr)) { 74 kfree(buf); 75 return -ENOMEM; 76 } 77 78 desc = vnic_rq_next_desc(rq); 79 rq_enet_desc_enc(desc, (u64)dma_addr | VNIC_PADDR_TARGET, 80 RQ_ENET_TYPE_ONLY_SOP, ENIC_ADMIN_BUF_SIZE); 81 vnic_rq_post(rq, buf, 0, dma_addr, ENIC_ADMIN_BUF_SIZE, 0); 82 83 return 0; 84 } 85 86 static int enic_admin_rq_fill(struct enic *enic, gfp_t gfp) 87 { 88 struct vnic_rq *rq = &enic->admin_rq; 89 int err; 90 91 while (vnic_rq_desc_avail(rq) > 0) { 92 err = enic_admin_rq_post_one(enic, gfp); 93 if (err) 94 return err; 95 } 96 97 return 0; 98 } 99 100 static void enic_admin_rq_drain(struct enic *enic) 101 { 102 vnic_rq_clean(&enic->admin_rq, enic_admin_rq_buf_clean); 103 } 104 105 static unsigned int enic_admin_cq_color(void *cq_desc, unsigned int desc_size) 106 { 107 u8 type_color = *((u8 *)cq_desc + desc_size - 1); 108 109 return (type_color >> CQ_DESC_COLOR_SHIFT) & CQ_DESC_COLOR_MASK; 110 } 111 112 unsigned int enic_admin_wq_cq_service(struct enic *enic) 113 { 114 struct vnic_cq *cq = &enic->admin_cq[0]; 115 unsigned int work = 0; 116 void *desc; 117 118 desc = vnic_cq_to_clean(cq); 119 while (enic_admin_cq_color(desc, cq->ring.desc_size) != 120 cq->last_color) { 121 vnic_cq_inc_to_clean(cq); 122 work++; 123 desc = vnic_cq_to_clean(cq); 124 } 125 126 return work; 127 } 128 129 /* Upper bound on pending admin messages. A buggy or hostile VF could flood 130 * the PF admin channel faster than admin_msg_work drains it; cap the backlog 131 * so a guest cannot drive the host out of memory. 132 */ 133 #define ENIC_ADMIN_MSG_MAX 256 134 135 static void enic_admin_msg_enqueue(struct enic *enic, void *buf, 136 unsigned int len) 137 { 138 struct enic_admin_msg *msg; 139 140 msg = kmalloc_flex(*msg, data, len); 141 if (!msg) 142 return; 143 144 msg->len = len; 145 memcpy(msg->data, buf, len); 146 147 spin_lock(&enic->admin_msg_lock); 148 if (enic->admin_msg_count >= ENIC_ADMIN_MSG_MAX) { 149 spin_unlock(&enic->admin_msg_lock); 150 kfree(msg); 151 if (net_ratelimit()) 152 netdev_warn(enic->netdev, 153 "admin msg backlog full (%u); dropping\n", 154 ENIC_ADMIN_MSG_MAX); 155 return; 156 } 157 list_add_tail(&msg->list, &enic->admin_msg_list); 158 enic->admin_msg_count++; 159 spin_unlock(&enic->admin_msg_lock); 160 } 161 162 unsigned int enic_admin_rq_cq_service(struct enic *enic) 163 { 164 struct vnic_cq *cq = &enic->admin_cq[1]; 165 struct vnic_rq *rq = &enic->admin_rq; 166 struct cq_enet_rq_desc *rq_desc; 167 struct vnic_rq_buf *buf; 168 u16 bwf, bytes_written; 169 unsigned int work = 0; 170 void *desc; 171 172 /* The admin RQ and its CQ form a single in-order channel: firmware 173 * posts exactly one CQE per consumed RQ descriptor, in submission 174 * order. Each CQE therefore pairs with rq->to_clean below without a 175 * completed_index cross-check, mirroring the in-order assumption of 176 * the main enic RX path. 177 */ 178 desc = vnic_cq_to_clean(cq); 179 while (enic_admin_cq_color(desc, cq->ring.desc_size) != 180 cq->last_color) { 181 /* Ensure DMA descriptor fields are read after 182 * the color/valid check. dma_rmb() is the 183 * correct barrier for DMA-written descriptors. 184 */ 185 dma_rmb(); 186 buf = rq->to_clean; 187 188 /* Decode the actual number of bytes hardware wrote into 189 * the RX buffer. buf->len is the static allocation size 190 * (ENIC_ADMIN_BUF_SIZE); copying that many bytes would read 191 * beyond the actual DMA payload. bytes_written_flags is at 192 * the same offset in every cq_enet_rq_desc[_32|_64] variant. 193 */ 194 rq_desc = desc; 195 bwf = le16_to_cpu(rq_desc->bytes_written_flags); 196 bytes_written = bwf & CQ_ENET_RQ_DESC_BYTES_WRITTEN_MASK; 197 if (bytes_written > buf->len) 198 goto next_desc; 199 200 dma_sync_single_for_cpu(&enic->pdev->dev, 201 buf->dma_addr, buf->len, 202 DMA_FROM_DEVICE); 203 204 /* Drop on hardware error indications. Admin messages 205 * are internal to the VIC, not received over the wire. 206 * Firmware sets TRUNCATED when the message does not fit 207 * in the posted buffer, and FCS_OK is always set on 208 * healthy admin completions. 209 */ 210 if (bwf & CQ_ENET_RQ_DESC_FLAGS_TRUNCATED) { 211 netdev_warn_once(enic->netdev, 212 "admin RQ: truncated message dropped\n"); 213 goto next_desc; 214 } 215 if (!(rq_desc->flags & CQ_ENET_RQ_DESC_FLAGS_FCS_OK)) { 216 netdev_warn_once(enic->netdev, 217 "admin RQ: bad FCS, dropping message\n"); 218 goto next_desc; 219 } 220 221 if (enic->admin_rq_handler) { 222 u16 sender_vlan; 223 224 /* Firmware sets the CQ VLAN field to identify the 225 * sender: 0 = PF, 1-based = VF index. Overwrite 226 * the untrusted src_vnic_id in the MBOX header with 227 * the hardware-verified value. 228 */ 229 sender_vlan = le16_to_cpu(rq_desc->vlan); 230 if (bytes_written >= sizeof(struct enic_mbox_hdr)) { 231 struct enic_mbox_hdr *hdr = buf->os_buf; 232 233 hdr->src_vnic_id = (sender_vlan == 0) ? 234 cpu_to_le16(ENIC_MBOX_DST_PF) : 235 cpu_to_le16(sender_vlan - 1); 236 } 237 238 enic_admin_msg_enqueue(enic, buf->os_buf, 239 bytes_written); 240 } 241 242 next_desc: 243 enic_admin_rq_buf_clean(rq, rq->to_clean); 244 rq->to_clean = rq->to_clean->next; 245 rq->ring.desc_avail++; 246 247 vnic_cq_inc_to_clean(cq); 248 work++; 249 desc = vnic_cq_to_clean(cq); 250 } 251 252 if (enic_admin_rq_fill(enic, GFP_KERNEL)) { 253 /* Some RX buffers could not be reposted (transient memory 254 * pressure). If the ring is left empty the channel would stall 255 * with no completion to drive the next refill, so arm a delayed 256 * re-run of this poll work (the sole owner of the admin RQ ring) 257 * to repost buffers and re-arm the RQ from a single context. 258 */ 259 if (net_ratelimit()) 260 netdev_warn(enic->netdev, 261 "admin RQ refill failed; scheduling retry\n"); 262 schedule_delayed_work(&enic->admin_poll_work, 263 msecs_to_jiffies(ENIC_ADMIN_RQ_REFILL_RETRY_MS)); 264 } 265 266 return work; 267 } 268 269 static irqreturn_t enic_admin_isr_msix(int irq, void *data) 270 { 271 struct enic *enic = data; 272 273 schedule_delayed_work(&enic->admin_poll_work, 0); 274 275 return IRQ_HANDLED; 276 } 277 278 static void enic_admin_msg_work_handler(struct work_struct *work) 279 { 280 struct enic *enic = container_of(work, struct enic, admin_msg_work); 281 struct enic_admin_msg *msg, *tmp; 282 LIST_HEAD(local_list); 283 284 spin_lock_bh(&enic->admin_msg_lock); 285 list_splice_init(&enic->admin_msg_list, &local_list); 286 enic->admin_msg_count = 0; 287 spin_unlock_bh(&enic->admin_msg_lock); 288 289 list_for_each_entry_safe(msg, tmp, &local_list, list) { 290 if (enic->admin_rq_handler) 291 enic->admin_rq_handler(enic, msg->data, msg->len); 292 list_del(&msg->list); 293 kfree(msg); 294 } 295 } 296 297 static void enic_admin_poll_work_handler(struct work_struct *work) 298 { 299 struct enic *enic = container_of(to_delayed_work(work), struct enic, 300 admin_poll_work); 301 unsigned int credits; 302 unsigned int rq_work; 303 304 /* Snapshot the pending credit count before draining so we acknowledge 305 * exactly what the hardware reported for this interrupt. Credits that 306 * accrue while enic_admin_rq_cq_service() runs are left for the next 307 * interrupt, which is harmless on this low-rate control path. 308 */ 309 credits = vnic_intr_credits(&enic->admin_intr); 310 311 rq_work = enic_admin_rq_cq_service(enic); 312 313 if (rq_work > 0) 314 schedule_work(&enic->admin_msg_work); 315 316 /* Acknowledge the snapshotted credits and unmask the vector. Unlike 317 * the NAPI data path, the admin channel is not re-polled, so the vector 318 * must be re-armed here to receive the next completion. The unmask is 319 * applied through the interrupt mask register independently of the 320 * credit count, so returning zero credits on a spurious wakeup still 321 * re-arms the vector. 322 */ 323 vnic_intr_return_credits(&enic->admin_intr, 324 credits, 325 1 /* unmask */, 0); 326 } 327 328 static int enic_admin_setup_intr(struct enic *enic) 329 { 330 unsigned int intr_index = enic->intr_count; 331 int err; 332 333 if (vnic_dev_get_intr_mode(enic->vdev) != VNIC_DEV_INTR_MODE_MSIX || 334 intr_index >= enic->intr_avail) 335 return -ENODEV; 336 337 /* The admin INTR uses a slot in the same RES_TYPE_INTR_CTRL 338 * strided array of per-vector control blocks (mask, coalescing 339 * timer, credit return) that the data-path IRQs occupy in BAR0. 340 * vnic_intr_alloc() defaults to RES_TYPE_INTR_CTRL, which is what 341 * we want here. 342 */ 343 err = vnic_intr_alloc(enic->vdev, &enic->admin_intr, intr_index); 344 if (err) { 345 netdev_warn(enic->netdev, 346 "Failed to alloc admin intr at index %u: %d\n", 347 intr_index, err); 348 return err; 349 } 350 351 enic->admin_intr_index = intr_index; 352 353 /* Mask the admin vector before requesting the IRQ so an early or 354 * spurious completion cannot run the poll handler against the 355 * not-yet-initialised admin rings. enic_admin_channel_open() unmasks 356 * it only after the rings are initialised and filled. 357 */ 358 vnic_intr_mask(&enic->admin_intr); 359 360 /* A V2 VF opens the admin channel during probe, before 361 * register_netdev() resolves the "eth%d" name template, so using 362 * netdev->name here would register the literal "eth%d-admin" in 363 * /proc/interrupts. Use the already-stable PCI device name instead. 364 */ 365 snprintf(enic->msix[intr_index].devname, 366 sizeof(enic->msix[intr_index].devname), 367 "%s-admin", pci_name(enic->pdev)); 368 enic->msix[intr_index].isr = enic_admin_isr_msix; 369 enic->msix[intr_index].devid = enic; 370 371 err = request_irq(enic->msix_entry[intr_index].vector, 372 enic->msix[intr_index].isr, 0, 373 enic->msix[intr_index].devname, 374 enic->msix[intr_index].devid); 375 if (err) { 376 netdev_warn(enic->netdev, 377 "Failed to request admin MSI-X irq: %d\n", err); 378 vnic_intr_free(&enic->admin_intr); 379 return err; 380 } 381 382 enic->msix[intr_index].requested = 1; 383 384 netdev_dbg(enic->netdev, 385 "admin channel using MSI-X interrupt (index %u)\n", 386 intr_index); 387 388 return 0; 389 } 390 391 static void enic_admin_teardown_intr(struct enic *enic) 392 { 393 unsigned int intr_index = enic->admin_intr_index; 394 395 free_irq(enic->msix_entry[intr_index].vector, 396 enic->msix[intr_index].devid); 397 cancel_delayed_work_sync(&enic->admin_poll_work); 398 enic->msix[intr_index].requested = 0; 399 } 400 401 static int enic_admin_qp_type_set(struct enic *enic, u32 enable) 402 { 403 u64 a0 = QP_TYPE_ADMIN, a1 = enable; 404 int wait = 1000; 405 int err; 406 407 spin_lock_bh(&enic->devcmd_lock); 408 err = vnic_dev_cmd(enic->vdev, CMD_QP_TYPE_SET, &a0, &a1, wait); 409 spin_unlock_bh(&enic->devcmd_lock); 410 411 return err; 412 } 413 414 static int enic_admin_alloc_resources(struct enic *enic) 415 { 416 int err; 417 418 err = vnic_wq_alloc_with_type(enic->vdev, &enic->admin_wq, 0, 419 ENIC_ADMIN_DESC_COUNT, 420 sizeof(struct wq_enet_desc), 421 RES_TYPE_ADMIN_WQ); 422 if (err) 423 return err; 424 425 err = vnic_rq_alloc_with_type(enic->vdev, &enic->admin_rq, 0, 426 ENIC_ADMIN_DESC_COUNT, 427 sizeof(struct rq_enet_desc), 428 RES_TYPE_ADMIN_RQ); 429 if (err) 430 goto free_wq; 431 432 /* admin_cq[0] is the WQ completion queue. WQ CQEs are always 433 * 16 bytes wide; firmware always writes 16-byte CQEs for WQ 434 * completions on every WQ, including the admin channel WQ. 435 * Use sizeof(struct cq_desc) accordingly. 436 */ 437 err = vnic_cq_alloc_with_type(enic->vdev, &enic->admin_cq[0], 0, 438 ENIC_ADMIN_DESC_COUNT, 439 sizeof(struct cq_desc), 440 RES_TYPE_ADMIN_CQ); 441 if (err) 442 goto free_rq; 443 444 /* admin_cq[1] is the RQ completion queue. Its descriptor size 445 * must match what firmware writes. enic_ext_cq() called earlier 446 * in probe issues CMD_CQ_ENTRY_SIZE_SET for VNIC_RQ_ALL, 447 * programming firmware to write CQ entries of (16 << enic->ext_cq) 448 * bytes for every RQ CQ on the vNIC, including the admin RQ CQ. 449 * Allocating with the same size keeps the host poller and 450 * firmware in lockstep: 451 * 452 * - The color/valid bit lives at byte (desc_size - 1) of every 453 * cq_enet_rq_desc[_32|_64] variant, so enic_admin_cq_color() 454 * reads it from the correct offset. 455 * - Only the first 15 bytes of the descriptor (vlan, 456 * bytes_written_flags, ...) are accessed by the admin path; 457 * these fields are identical across all three variants (see 458 * comment in enic_rq.c above cq_enet_rq_desc_dec()). 459 */ 460 err = vnic_cq_alloc_with_type(enic->vdev, &enic->admin_cq[1], 1, 461 ENIC_ADMIN_DESC_COUNT, 462 16 << enic->ext_cq, 463 RES_TYPE_ADMIN_CQ); 464 if (err) 465 goto free_cq0; 466 467 return 0; 468 469 free_cq0: 470 vnic_cq_free(&enic->admin_cq[0]); 471 free_rq: 472 vnic_rq_free(&enic->admin_rq); 473 free_wq: 474 vnic_wq_free(&enic->admin_wq); 475 return err; 476 } 477 478 static void enic_admin_free_resources(struct enic *enic) 479 { 480 vnic_intr_free(&enic->admin_intr); 481 vnic_cq_free(&enic->admin_cq[1]); 482 vnic_cq_free(&enic->admin_cq[0]); 483 vnic_rq_free(&enic->admin_rq); 484 vnic_wq_free(&enic->admin_wq); 485 } 486 487 static void enic_admin_init_resources(struct enic *enic) 488 { 489 unsigned int intr_offset = enic->admin_intr_index; 490 491 vnic_wq_init(&enic->admin_wq, 492 0, 0, 0); /* cq_index, err_intr_enable, err_intr_offset */ 493 vnic_rq_init(&enic->admin_rq, 494 1, 0, 0); /* cq_index, err_intr_enable, err_intr_offset */ 495 vnic_cq_init(&enic->admin_cq[0], 496 VNIC_CQ_FC_DISABLE, 497 VNIC_CQ_COLOR_ENABLE, 498 0, 0, 1, /* cq_head, cq_tail, cq_tail_color */ 499 VNIC_CQ_INTR_DISABLE, /* polled synchronously by mbox send */ 500 VNIC_CQ_ENTRY_ENABLE, 501 VNIC_CQ_MSG_DISABLE, 502 intr_offset, 503 0 /* cq_message_addr */); 504 vnic_cq_init(&enic->admin_cq[1], 505 VNIC_CQ_FC_DISABLE, 506 VNIC_CQ_COLOR_ENABLE, 507 0, 0, 1, /* cq_head, cq_tail, cq_tail_color */ 508 VNIC_CQ_INTR_ENABLE, 509 VNIC_CQ_ENTRY_ENABLE, 510 VNIC_CQ_MSG_DISABLE, 511 intr_offset, 512 0 /* cq_message_addr */); 513 /* coalescing_timer, coalescing_type, mask_on_assertion */ 514 vnic_intr_init(&enic->admin_intr, 515 0, 0, 1); 516 } 517 518 static void enic_admin_msg_drain(struct enic *enic) 519 { 520 struct enic_admin_msg *msg, *tmp; 521 522 spin_lock_bh(&enic->admin_msg_lock); 523 list_for_each_entry_safe(msg, tmp, &enic->admin_msg_list, list) { 524 list_del(&msg->list); 525 kfree(msg); 526 } 527 enic->admin_msg_count = 0; 528 spin_unlock_bh(&enic->admin_msg_lock); 529 } 530 531 int enic_admin_channel_open(struct enic *enic) 532 { 533 int err; 534 535 if (!enic->has_admin_channel) 536 return -ENODEV; 537 538 /* Keep MBOX sends disabled for the entire open sequence. It is 539 * cleared only after every resource is allocated and enabled below, 540 * so any early error return here leaves sends disabled and a 541 * concurrent sender cannot touch a half-open or freed admin_wq. 542 */ 543 WRITE_ONCE(enic->mbox_send_disabled, true); 544 545 err = enic_admin_alloc_resources(enic); 546 if (err) { 547 netdev_err(enic->netdev, 548 "Failed to alloc admin channel resources: %d\n", 549 err); 550 return err; 551 } 552 553 spin_lock_init(&enic->admin_msg_lock); 554 INIT_LIST_HEAD(&enic->admin_msg_list); 555 INIT_WORK(&enic->admin_msg_work, enic_admin_msg_work_handler); 556 INIT_DELAYED_WORK(&enic->admin_poll_work, enic_admin_poll_work_handler); 557 558 err = enic_admin_setup_intr(enic); 559 if (err) { 560 netdev_err(enic->netdev, 561 "Admin channel requires MSI-X, SR-IOV unavailable: %d\n", 562 err); 563 goto free_resources; 564 } 565 566 enic_admin_init_resources(enic); 567 568 vnic_wq_enable(&enic->admin_wq); 569 vnic_rq_enable(&enic->admin_rq); 570 571 err = enic_admin_rq_fill(enic, GFP_KERNEL); 572 if (err) { 573 netdev_err(enic->netdev, 574 "Failed to fill admin RQ buffers: %d\n", err); 575 goto disable_queues; 576 } 577 578 err = enic_admin_qp_type_set(enic, QP_ENABLE); 579 if (err) { 580 netdev_err(enic->netdev, 581 "Failed to set admin QP type: %d\n", err); 582 goto disable_queues; 583 } 584 585 vnic_intr_unmask(&enic->admin_intr); 586 587 /* Only now that the admin WQ/RQ/CQ and interrupt are fully allocated, 588 * programmed and enabled is it safe to allow MBOX sends. Clearing this 589 * earlier opened a window where a concurrent sender (e.g. link-notify 590 * work scheduled by a post-reset link-up) could call enic_mbox_send_msg() 591 * against a not-yet-allocated admin_wq and crash. 592 */ 593 WRITE_ONCE(enic->mbox_send_disabled, false); 594 595 netdev_dbg(enic->netdev, 596 "admin channel open: intr=%u wq_avail=%u rq_avail=%u cq0_color=%u cq1_color=%u\n", 597 enic->admin_intr_index, 598 vnic_wq_desc_avail(&enic->admin_wq), 599 vnic_rq_desc_avail(&enic->admin_rq), 600 enic->admin_cq[0].last_color, 601 enic->admin_cq[1].last_color); 602 603 enic->admin_chan_up = true; 604 605 return 0; 606 607 disable_queues: 608 enic_admin_teardown_intr(enic); 609 enic_admin_qp_type_set(enic, QP_DISABLE); 610 if (vnic_wq_disable(&enic->admin_wq)) 611 netdev_warn(enic->netdev, "Failed to disable admin WQ\n"); 612 if (vnic_rq_disable(&enic->admin_rq)) 613 netdev_warn(enic->netdev, "Failed to disable admin RQ\n"); 614 cancel_work_sync(&enic->admin_msg_work); 615 enic_admin_msg_drain(enic); 616 enic_admin_rq_drain(enic); 617 free_resources: 618 enic_admin_free_resources(enic); 619 return err; 620 } 621 622 void enic_admin_channel_close(struct enic *enic) 623 { 624 int err; 625 626 if (!enic->has_admin_channel) 627 return; 628 629 /* Nothing to tear down if the channel was never (re)opened, e.g. a 630 * failed enic_admin_channel_open() in probe or in the reset path; 631 * otherwise the disable/clean calls below dereference freed resources. 632 */ 633 if (!enic->admin_chan_up) 634 return; 635 636 WRITE_ONCE(enic->mbox_send_disabled, true); 637 638 netdev_dbg(enic->netdev, "admin channel close\n"); 639 640 vnic_intr_mask(&enic->admin_intr); 641 enic_admin_teardown_intr(enic); 642 cancel_work_sync(&enic->link_notify_work); 643 cancel_work_sync(&enic->admin_msg_work); 644 enic_admin_msg_drain(enic); 645 646 enic_admin_qp_type_set(enic, QP_DISABLE); 647 648 err = vnic_wq_disable(&enic->admin_wq); 649 if (err) 650 netdev_warn(enic->netdev, 651 "Failed to disable admin WQ: %d\n", err); 652 err = vnic_rq_disable(&enic->admin_rq); 653 if (err) 654 netdev_warn(enic->netdev, 655 "Failed to disable admin RQ: %d\n", err); 656 657 vnic_wq_clean(&enic->admin_wq, enic_admin_wq_buf_clean); 658 enic_admin_rq_drain(enic); 659 vnic_cq_clean(&enic->admin_cq[0]); 660 vnic_cq_clean(&enic->admin_cq[1]); 661 vnic_intr_clean(&enic->admin_intr); 662 663 enic->admin_rq_handler = NULL; 664 enic_admin_free_resources(enic); 665 666 enic->admin_chan_up = false; 667 } 668