| .. | .. |
|---|
| 45 | 45 | #include <rdma/iw_cm.h> |
|---|
| 46 | 46 | #include <rdma/ib_user_verbs.h> |
|---|
| 47 | 47 | #include <rdma/ib_umem.h> |
|---|
| 48 | +#include <rdma/uverbs_ioctl.h> |
|---|
| 48 | 49 | #include "i40iw.h" |
|---|
| 49 | 50 | |
|---|
| 50 | 51 | /** |
|---|
| .. | .. |
|---|
| 63 | 64 | return -EINVAL; |
|---|
| 64 | 65 | memset(props, 0, sizeof(*props)); |
|---|
| 65 | 66 | ether_addr_copy((u8 *)&props->sys_image_guid, iwdev->netdev->dev_addr); |
|---|
| 66 | | - props->fw_ver = I40IW_FW_VERSION; |
|---|
| 67 | + props->fw_ver = i40iw_fw_major_ver(&iwdev->sc_dev) << 32 | |
|---|
| 68 | + i40iw_fw_minor_ver(&iwdev->sc_dev); |
|---|
| 67 | 69 | props->device_cap_flags = iwdev->device_cap_flags; |
|---|
| 68 | 70 | props->vendor_id = iwdev->ldev->pcidev->vendor; |
|---|
| 69 | 71 | props->vendor_part_id = iwdev->ldev->pcidev->device; |
|---|
| .. | .. |
|---|
| 81 | 83 | props->max_qp_rd_atom = I40IW_MAX_IRD_SIZE; |
|---|
| 82 | 84 | props->max_qp_init_rd_atom = props->max_qp_rd_atom; |
|---|
| 83 | 85 | props->atomic_cap = IB_ATOMIC_NONE; |
|---|
| 84 | | - props->max_map_per_fmr = 1; |
|---|
| 85 | 86 | props->max_fast_reg_page_list_len = I40IW_MAX_PAGES_PER_FMR; |
|---|
| 86 | 87 | return 0; |
|---|
| 87 | 88 | } |
|---|
| .. | .. |
|---|
| 96 | 97 | u8 port, |
|---|
| 97 | 98 | struct ib_port_attr *props) |
|---|
| 98 | 99 | { |
|---|
| 99 | | - struct i40iw_device *iwdev = to_iwdev(ibdev); |
|---|
| 100 | | - struct net_device *netdev = iwdev->netdev; |
|---|
| 101 | | - |
|---|
| 102 | | - /* props being zeroed by the caller, avoid zeroing it here */ |
|---|
| 103 | | - props->max_mtu = IB_MTU_4096; |
|---|
| 104 | | - props->active_mtu = ib_mtu_int_to_enum(netdev->mtu); |
|---|
| 105 | | - |
|---|
| 106 | 100 | props->lid = 1; |
|---|
| 107 | | - if (netif_carrier_ok(iwdev->netdev)) |
|---|
| 108 | | - props->state = IB_PORT_ACTIVE; |
|---|
| 109 | | - else |
|---|
| 110 | | - props->state = IB_PORT_DOWN; |
|---|
| 111 | 101 | props->port_cap_flags = IB_PORT_CM_SUP | IB_PORT_REINIT_SUP | |
|---|
| 112 | 102 | IB_PORT_VENDOR_CLASS_SUP | IB_PORT_BOOT_MGMT_SUP; |
|---|
| 113 | 103 | props->gid_tbl_len = 1; |
|---|
| 114 | | - props->pkey_tbl_len = 1; |
|---|
| 115 | 104 | props->active_width = IB_WIDTH_4X; |
|---|
| 116 | 105 | props->active_speed = 1; |
|---|
| 117 | 106 | props->max_msg_sz = I40IW_MAX_OUTBOUND_MESSAGE_SIZE; |
|---|
| .. | .. |
|---|
| 120 | 109 | |
|---|
| 121 | 110 | /** |
|---|
| 122 | 111 | * i40iw_alloc_ucontext - Allocate the user context data structure |
|---|
| 123 | | - * @ibdev: device pointer from stack |
|---|
| 112 | + * @uctx: Uverbs context pointer from stack |
|---|
| 124 | 113 | * @udata: user data |
|---|
| 125 | 114 | * |
|---|
| 126 | 115 | * This keeps track of all objects associated with a particular |
|---|
| 127 | 116 | * user-mode client. |
|---|
| 128 | 117 | */ |
|---|
| 129 | | -static struct ib_ucontext *i40iw_alloc_ucontext(struct ib_device *ibdev, |
|---|
| 130 | | - struct ib_udata *udata) |
|---|
| 118 | +static int i40iw_alloc_ucontext(struct ib_ucontext *uctx, |
|---|
| 119 | + struct ib_udata *udata) |
|---|
| 131 | 120 | { |
|---|
| 121 | + struct ib_device *ibdev = uctx->device; |
|---|
| 132 | 122 | struct i40iw_device *iwdev = to_iwdev(ibdev); |
|---|
| 133 | 123 | struct i40iw_alloc_ucontext_req req; |
|---|
| 134 | | - struct i40iw_alloc_ucontext_resp uresp; |
|---|
| 135 | | - struct i40iw_ucontext *ucontext; |
|---|
| 124 | + struct i40iw_alloc_ucontext_resp uresp = {}; |
|---|
| 125 | + struct i40iw_ucontext *ucontext = to_ucontext(uctx); |
|---|
| 136 | 126 | |
|---|
| 137 | 127 | if (ib_copy_from_udata(&req, udata, sizeof(req))) |
|---|
| 138 | | - return ERR_PTR(-EINVAL); |
|---|
| 128 | + return -EINVAL; |
|---|
| 139 | 129 | |
|---|
| 140 | 130 | if (req.userspace_ver < 4 || req.userspace_ver > I40IW_ABI_VER) { |
|---|
| 141 | 131 | i40iw_pr_err("Unsupported provider library version %u.\n", req.userspace_ver); |
|---|
| 142 | | - return ERR_PTR(-EINVAL); |
|---|
| 132 | + return -EINVAL; |
|---|
| 143 | 133 | } |
|---|
| 144 | 134 | |
|---|
| 145 | | - memset(&uresp, 0, sizeof(uresp)); |
|---|
| 146 | 135 | uresp.max_qps = iwdev->max_qp; |
|---|
| 147 | 136 | uresp.max_pds = iwdev->max_pd; |
|---|
| 148 | 137 | uresp.wq_size = iwdev->max_qp_wr * 2; |
|---|
| 149 | 138 | uresp.kernel_ver = req.userspace_ver; |
|---|
| 150 | 139 | |
|---|
| 151 | | - ucontext = kzalloc(sizeof(*ucontext), GFP_KERNEL); |
|---|
| 152 | | - if (!ucontext) |
|---|
| 153 | | - return ERR_PTR(-ENOMEM); |
|---|
| 154 | | - |
|---|
| 155 | 140 | ucontext->iwdev = iwdev; |
|---|
| 156 | 141 | ucontext->abi_ver = req.userspace_ver; |
|---|
| 157 | 142 | |
|---|
| 158 | | - if (ib_copy_to_udata(udata, &uresp, sizeof(uresp))) { |
|---|
| 159 | | - kfree(ucontext); |
|---|
| 160 | | - return ERR_PTR(-EFAULT); |
|---|
| 161 | | - } |
|---|
| 143 | + if (ib_copy_to_udata(udata, &uresp, sizeof(uresp))) |
|---|
| 144 | + return -EFAULT; |
|---|
| 162 | 145 | |
|---|
| 163 | 146 | INIT_LIST_HEAD(&ucontext->cq_reg_mem_list); |
|---|
| 164 | 147 | spin_lock_init(&ucontext->cq_reg_mem_list_lock); |
|---|
| 165 | 148 | INIT_LIST_HEAD(&ucontext->qp_reg_mem_list); |
|---|
| 166 | 149 | spin_lock_init(&ucontext->qp_reg_mem_list_lock); |
|---|
| 167 | 150 | |
|---|
| 168 | | - return &ucontext->ibucontext; |
|---|
| 151 | + return 0; |
|---|
| 169 | 152 | } |
|---|
| 170 | 153 | |
|---|
| 171 | 154 | /** |
|---|
| 172 | 155 | * i40iw_dealloc_ucontext - deallocate the user context data structure |
|---|
| 173 | 156 | * @context: user context created during alloc |
|---|
| 174 | 157 | */ |
|---|
| 175 | | -static int i40iw_dealloc_ucontext(struct ib_ucontext *context) |
|---|
| 158 | +static void i40iw_dealloc_ucontext(struct ib_ucontext *context) |
|---|
| 176 | 159 | { |
|---|
| 177 | | - struct i40iw_ucontext *ucontext = to_ucontext(context); |
|---|
| 178 | | - unsigned long flags; |
|---|
| 179 | | - |
|---|
| 180 | | - spin_lock_irqsave(&ucontext->cq_reg_mem_list_lock, flags); |
|---|
| 181 | | - if (!list_empty(&ucontext->cq_reg_mem_list)) { |
|---|
| 182 | | - spin_unlock_irqrestore(&ucontext->cq_reg_mem_list_lock, flags); |
|---|
| 183 | | - return -EBUSY; |
|---|
| 184 | | - } |
|---|
| 185 | | - spin_unlock_irqrestore(&ucontext->cq_reg_mem_list_lock, flags); |
|---|
| 186 | | - spin_lock_irqsave(&ucontext->qp_reg_mem_list_lock, flags); |
|---|
| 187 | | - if (!list_empty(&ucontext->qp_reg_mem_list)) { |
|---|
| 188 | | - spin_unlock_irqrestore(&ucontext->qp_reg_mem_list_lock, flags); |
|---|
| 189 | | - return -EBUSY; |
|---|
| 190 | | - } |
|---|
| 191 | | - spin_unlock_irqrestore(&ucontext->qp_reg_mem_list_lock, flags); |
|---|
| 192 | | - |
|---|
| 193 | | - kfree(ucontext); |
|---|
| 194 | | - return 0; |
|---|
| 160 | + return; |
|---|
| 195 | 161 | } |
|---|
| 196 | 162 | |
|---|
| 197 | 163 | /** |
|---|
| .. | .. |
|---|
| 209 | 175 | |
|---|
| 210 | 176 | dbaddr = I40IW_DB_ADDR_OFFSET + pci_resource_start(ucontext->iwdev->ldev->pcidev, 0); |
|---|
| 211 | 177 | |
|---|
| 212 | | - if (io_remap_pfn_range(vma, vma->vm_start, dbaddr >> PAGE_SHIFT, PAGE_SIZE, |
|---|
| 213 | | - pgprot_noncached(vma->vm_page_prot))) |
|---|
| 214 | | - return -EAGAIN; |
|---|
| 215 | | - |
|---|
| 216 | | - return 0; |
|---|
| 178 | + return rdma_user_mmap_io(context, vma, dbaddr >> PAGE_SHIFT, PAGE_SIZE, |
|---|
| 179 | + pgprot_noncached(vma->vm_page_prot), NULL); |
|---|
| 217 | 180 | } |
|---|
| 218 | 181 | |
|---|
| 219 | 182 | /** |
|---|
| .. | .. |
|---|
| 290 | 253 | |
|---|
| 291 | 254 | /** |
|---|
| 292 | 255 | * i40iw_alloc_pd - allocate protection domain |
|---|
| 293 | | - * @ibdev: device pointer from stack |
|---|
| 294 | | - * @context: user context created during alloc |
|---|
| 256 | + * @pd: PD pointer |
|---|
| 295 | 257 | * @udata: user data |
|---|
| 296 | 258 | */ |
|---|
| 297 | | -static struct ib_pd *i40iw_alloc_pd(struct ib_device *ibdev, |
|---|
| 298 | | - struct ib_ucontext *context, |
|---|
| 299 | | - struct ib_udata *udata) |
|---|
| 259 | +static int i40iw_alloc_pd(struct ib_pd *pd, struct ib_udata *udata) |
|---|
| 300 | 260 | { |
|---|
| 301 | | - struct i40iw_pd *iwpd; |
|---|
| 302 | | - struct i40iw_device *iwdev = to_iwdev(ibdev); |
|---|
| 261 | + struct i40iw_pd *iwpd = to_iwpd(pd); |
|---|
| 262 | + struct i40iw_device *iwdev = to_iwdev(pd->device); |
|---|
| 303 | 263 | struct i40iw_sc_dev *dev = &iwdev->sc_dev; |
|---|
| 304 | 264 | struct i40iw_alloc_pd_resp uresp; |
|---|
| 305 | 265 | struct i40iw_sc_pd *sc_pd; |
|---|
| 306 | | - struct i40iw_ucontext *ucontext; |
|---|
| 307 | 266 | u32 pd_id = 0; |
|---|
| 308 | 267 | int err; |
|---|
| 309 | 268 | |
|---|
| 310 | 269 | if (iwdev->closing) |
|---|
| 311 | | - return ERR_PTR(-ENODEV); |
|---|
| 270 | + return -ENODEV; |
|---|
| 312 | 271 | |
|---|
| 313 | 272 | err = i40iw_alloc_resource(iwdev, iwdev->allocated_pds, |
|---|
| 314 | 273 | iwdev->max_pd, &pd_id, &iwdev->next_pd); |
|---|
| 315 | 274 | if (err) { |
|---|
| 316 | 275 | i40iw_pr_err("alloc resource failed\n"); |
|---|
| 317 | | - return ERR_PTR(err); |
|---|
| 318 | | - } |
|---|
| 319 | | - |
|---|
| 320 | | - iwpd = kzalloc(sizeof(*iwpd), GFP_KERNEL); |
|---|
| 321 | | - if (!iwpd) { |
|---|
| 322 | | - err = -ENOMEM; |
|---|
| 323 | | - goto free_res; |
|---|
| 276 | + return err; |
|---|
| 324 | 277 | } |
|---|
| 325 | 278 | |
|---|
| 326 | 279 | sc_pd = &iwpd->sc_pd; |
|---|
| 327 | 280 | |
|---|
| 328 | | - if (context) { |
|---|
| 329 | | - ucontext = to_ucontext(context); |
|---|
| 281 | + if (udata) { |
|---|
| 282 | + struct i40iw_ucontext *ucontext = rdma_udata_to_drv_context( |
|---|
| 283 | + udata, struct i40iw_ucontext, ibucontext); |
|---|
| 330 | 284 | dev->iw_pd_ops->pd_init(dev, sc_pd, pd_id, ucontext->abi_ver); |
|---|
| 331 | 285 | memset(&uresp, 0, sizeof(uresp)); |
|---|
| 332 | 286 | uresp.pd_id = pd_id; |
|---|
| .. | .. |
|---|
| 339 | 293 | } |
|---|
| 340 | 294 | |
|---|
| 341 | 295 | i40iw_add_pdusecount(iwpd); |
|---|
| 342 | | - return &iwpd->ibpd; |
|---|
| 296 | + return 0; |
|---|
| 297 | + |
|---|
| 343 | 298 | error: |
|---|
| 344 | | - kfree(iwpd); |
|---|
| 345 | | -free_res: |
|---|
| 346 | 299 | i40iw_free_resource(iwdev, iwdev->allocated_pds, pd_id); |
|---|
| 347 | | - return ERR_PTR(err); |
|---|
| 300 | + return err; |
|---|
| 348 | 301 | } |
|---|
| 349 | 302 | |
|---|
| 350 | 303 | /** |
|---|
| 351 | 304 | * i40iw_dealloc_pd - deallocate pd |
|---|
| 352 | 305 | * @ibpd: ptr of pd to be deallocated |
|---|
| 306 | + * @udata: user data or null for kernel object |
|---|
| 353 | 307 | */ |
|---|
| 354 | | -static int i40iw_dealloc_pd(struct ib_pd *ibpd) |
|---|
| 308 | +static int i40iw_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata) |
|---|
| 355 | 309 | { |
|---|
| 356 | 310 | struct i40iw_pd *iwpd = to_iwpd(ibpd); |
|---|
| 357 | 311 | struct i40iw_device *iwdev = to_iwdev(ibpd->device); |
|---|
| .. | .. |
|---|
| 387 | 341 | * @iwqp: qp ptr (user or kernel) |
|---|
| 388 | 342 | * @qp_num: qp number assigned |
|---|
| 389 | 343 | */ |
|---|
| 390 | | -void i40iw_free_qp_resources(struct i40iw_device *iwdev, |
|---|
| 391 | | - struct i40iw_qp *iwqp, |
|---|
| 392 | | - u32 qp_num) |
|---|
| 344 | +void i40iw_free_qp_resources(struct i40iw_qp *iwqp) |
|---|
| 393 | 345 | { |
|---|
| 394 | 346 | struct i40iw_pbl *iwpbl = &iwqp->iwpbl; |
|---|
| 347 | + struct i40iw_device *iwdev = iwqp->iwdev; |
|---|
| 348 | + u32 qp_num = iwqp->ibqp.qp_num; |
|---|
| 395 | 349 | |
|---|
| 396 | 350 | i40iw_ieq_cleanup_qp(iwdev->vsi.ieq, &iwqp->sc_qp); |
|---|
| 397 | 351 | i40iw_dealloc_push_page(iwdev, &iwqp->sc_qp); |
|---|
| .. | .. |
|---|
| 403 | 357 | i40iw_free_dma_mem(iwdev->sc_dev.hw, &iwqp->kqp.dma_mem); |
|---|
| 404 | 358 | kfree(iwqp->kqp.wrid_mem); |
|---|
| 405 | 359 | iwqp->kqp.wrid_mem = NULL; |
|---|
| 406 | | - kfree(iwqp->allocated_buffer); |
|---|
| 360 | + kfree(iwqp); |
|---|
| 407 | 361 | } |
|---|
| 408 | 362 | |
|---|
| 409 | 363 | /** |
|---|
| .. | .. |
|---|
| 422 | 376 | * i40iw_destroy_qp - destroy qp |
|---|
| 423 | 377 | * @ibqp: qp's ib pointer also to get to device's qp address |
|---|
| 424 | 378 | */ |
|---|
| 425 | | -static int i40iw_destroy_qp(struct ib_qp *ibqp) |
|---|
| 379 | +static int i40iw_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) |
|---|
| 426 | 380 | { |
|---|
| 427 | 381 | struct i40iw_qp *iwqp = to_iwqp(ibqp); |
|---|
| 382 | + struct ib_qp_attr attr; |
|---|
| 383 | + struct i40iw_device *iwdev = iwqp->iwdev; |
|---|
| 384 | + |
|---|
| 385 | + memset(&attr, 0, sizeof(attr)); |
|---|
| 428 | 386 | |
|---|
| 429 | 387 | iwqp->destroyed = 1; |
|---|
| 430 | 388 | |
|---|
| .. | .. |
|---|
| 439 | 397 | } |
|---|
| 440 | 398 | } |
|---|
| 441 | 399 | |
|---|
| 442 | | - i40iw_rem_ref(&iwqp->ibqp); |
|---|
| 400 | + attr.qp_state = IB_QPS_ERR; |
|---|
| 401 | + i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL); |
|---|
| 402 | + i40iw_qp_rem_ref(&iwqp->ibqp); |
|---|
| 403 | + wait_for_completion(&iwqp->free_qp); |
|---|
| 404 | + i40iw_cqp_qp_destroy_cmd(&iwdev->sc_dev, &iwqp->sc_qp); |
|---|
| 405 | + i40iw_rem_pdusecount(iwqp->iwpd, iwdev); |
|---|
| 406 | + i40iw_free_qp_resources(iwqp); |
|---|
| 407 | + i40iw_rem_devusecount(iwdev); |
|---|
| 408 | + |
|---|
| 443 | 409 | return 0; |
|---|
| 444 | 410 | } |
|---|
| 445 | 411 | |
|---|
| .. | .. |
|---|
| 543 | 509 | struct i40iw_device *iwdev = to_iwdev(ibpd->device); |
|---|
| 544 | 510 | struct i40iw_cqp *iwcqp = &iwdev->cqp; |
|---|
| 545 | 511 | struct i40iw_qp *iwqp; |
|---|
| 546 | | - struct i40iw_ucontext *ucontext; |
|---|
| 512 | + struct i40iw_ucontext *ucontext = rdma_udata_to_drv_context( |
|---|
| 513 | + udata, struct i40iw_ucontext, ibucontext); |
|---|
| 547 | 514 | struct i40iw_create_qp_req req; |
|---|
| 548 | 515 | struct i40iw_create_qp_resp uresp; |
|---|
| 549 | 516 | u32 qp_num = 0; |
|---|
| 550 | | - void *mem; |
|---|
| 551 | 517 | enum i40iw_status_code ret; |
|---|
| 552 | 518 | int err_code; |
|---|
| 553 | 519 | int sq_size; |
|---|
| .. | .. |
|---|
| 589 | 555 | init_info.qp_uk_init_info.max_rq_frag_cnt = init_attr->cap.max_recv_sge; |
|---|
| 590 | 556 | init_info.qp_uk_init_info.max_inline_data = init_attr->cap.max_inline_data; |
|---|
| 591 | 557 | |
|---|
| 592 | | - mem = kzalloc(sizeof(*iwqp), GFP_KERNEL); |
|---|
| 593 | | - if (!mem) |
|---|
| 558 | + iwqp = kzalloc(sizeof(*iwqp), GFP_KERNEL); |
|---|
| 559 | + if (!iwqp) |
|---|
| 594 | 560 | return ERR_PTR(-ENOMEM); |
|---|
| 595 | 561 | |
|---|
| 596 | | - iwqp = (struct i40iw_qp *)mem; |
|---|
| 597 | | - iwqp->allocated_buffer = mem; |
|---|
| 598 | 562 | qp = &iwqp->sc_qp; |
|---|
| 599 | 563 | qp->back_qp = (void *)iwqp; |
|---|
| 600 | 564 | qp->push_idx = I40IW_INVALID_PUSH_PAGE_INDEX; |
|---|
| 601 | 565 | |
|---|
| 566 | + iwqp->iwdev = iwdev; |
|---|
| 602 | 567 | iwqp->ctx_info.iwarp_info = &iwqp->iwarp_info; |
|---|
| 603 | 568 | |
|---|
| 604 | 569 | if (i40iw_allocate_dma_mem(dev->hw, |
|---|
| .. | .. |
|---|
| 623 | 588 | goto error; |
|---|
| 624 | 589 | } |
|---|
| 625 | 590 | |
|---|
| 626 | | - iwqp->iwdev = iwdev; |
|---|
| 627 | 591 | iwqp->iwpd = iwpd; |
|---|
| 628 | 592 | iwqp->ibqp.qp_num = qp_num; |
|---|
| 629 | 593 | qp = &iwqp->sc_qp; |
|---|
| .. | .. |
|---|
| 639 | 603 | iwqp->ctx_info.qp_compl_ctx = (uintptr_t)qp; |
|---|
| 640 | 604 | |
|---|
| 641 | 605 | if (init_attr->qp_type != IB_QPT_RC) { |
|---|
| 642 | | - err_code = -EINVAL; |
|---|
| 606 | + err_code = -EOPNOTSUPP; |
|---|
| 643 | 607 | goto error; |
|---|
| 644 | 608 | } |
|---|
| 645 | 609 | if (iwdev->push_mode) |
|---|
| .. | .. |
|---|
| 651 | 615 | goto error; |
|---|
| 652 | 616 | } |
|---|
| 653 | 617 | iwqp->ctx_info.qp_compl_ctx = req.user_compl_ctx; |
|---|
| 654 | | - if (ibpd->uobject && ibpd->uobject->context) { |
|---|
| 655 | | - iwqp->user_mode = 1; |
|---|
| 656 | | - ucontext = to_ucontext(ibpd->uobject->context); |
|---|
| 618 | + iwqp->user_mode = 1; |
|---|
| 657 | 619 | |
|---|
| 658 | | - if (req.user_wqe_buffers) { |
|---|
| 659 | | - struct i40iw_pbl *iwpbl; |
|---|
| 620 | + if (req.user_wqe_buffers) { |
|---|
| 621 | + struct i40iw_pbl *iwpbl; |
|---|
| 660 | 622 | |
|---|
| 661 | | - spin_lock_irqsave( |
|---|
| 662 | | - &ucontext->qp_reg_mem_list_lock, flags); |
|---|
| 663 | | - iwpbl = i40iw_get_pbl( |
|---|
| 664 | | - (unsigned long)req.user_wqe_buffers, |
|---|
| 665 | | - &ucontext->qp_reg_mem_list); |
|---|
| 666 | | - spin_unlock_irqrestore( |
|---|
| 667 | | - &ucontext->qp_reg_mem_list_lock, flags); |
|---|
| 623 | + spin_lock_irqsave( |
|---|
| 624 | + &ucontext->qp_reg_mem_list_lock, flags); |
|---|
| 625 | + iwpbl = i40iw_get_pbl( |
|---|
| 626 | + (unsigned long)req.user_wqe_buffers, |
|---|
| 627 | + &ucontext->qp_reg_mem_list); |
|---|
| 628 | + spin_unlock_irqrestore( |
|---|
| 629 | + &ucontext->qp_reg_mem_list_lock, flags); |
|---|
| 668 | 630 | |
|---|
| 669 | | - if (!iwpbl) { |
|---|
| 670 | | - err_code = -ENODATA; |
|---|
| 671 | | - i40iw_pr_err("no pbl info\n"); |
|---|
| 672 | | - goto error; |
|---|
| 673 | | - } |
|---|
| 674 | | - memcpy(&iwqp->iwpbl, iwpbl, sizeof(iwqp->iwpbl)); |
|---|
| 631 | + if (!iwpbl) { |
|---|
| 632 | + err_code = -ENODATA; |
|---|
| 633 | + i40iw_pr_err("no pbl info\n"); |
|---|
| 634 | + goto error; |
|---|
| 675 | 635 | } |
|---|
| 636 | + memcpy(&iwqp->iwpbl, iwpbl, sizeof(iwqp->iwpbl)); |
|---|
| 676 | 637 | } |
|---|
| 677 | 638 | err_code = i40iw_setup_virt_qp(iwdev, iwqp, &init_info); |
|---|
| 678 | 639 | } else { |
|---|
| .. | .. |
|---|
| 740 | 701 | goto error; |
|---|
| 741 | 702 | } |
|---|
| 742 | 703 | |
|---|
| 743 | | - i40iw_add_ref(&iwqp->ibqp); |
|---|
| 704 | + refcount_set(&iwqp->refcount, 1); |
|---|
| 744 | 705 | spin_lock_init(&iwqp->lock); |
|---|
| 745 | 706 | iwqp->sig_all = (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) ? 1 : 0; |
|---|
| 746 | 707 | iwdev->qp_table[qp_num] = iwqp; |
|---|
| 747 | 708 | i40iw_add_pdusecount(iwqp->iwpd); |
|---|
| 748 | 709 | i40iw_add_devusecount(iwdev); |
|---|
| 749 | | - if (ibpd->uobject && udata) { |
|---|
| 710 | + if (udata) { |
|---|
| 750 | 711 | memset(&uresp, 0, sizeof(uresp)); |
|---|
| 751 | 712 | uresp.actual_sq_size = sq_size; |
|---|
| 752 | 713 | uresp.actual_rq_size = rq_size; |
|---|
| .. | .. |
|---|
| 755 | 716 | err_code = ib_copy_to_udata(udata, &uresp, sizeof(uresp)); |
|---|
| 756 | 717 | if (err_code) { |
|---|
| 757 | 718 | i40iw_pr_err("copy_to_udata failed\n"); |
|---|
| 758 | | - i40iw_destroy_qp(&iwqp->ibqp); |
|---|
| 759 | | - /* let the completion of the qp destroy free the qp */ |
|---|
| 719 | + i40iw_destroy_qp(&iwqp->ibqp, udata); |
|---|
| 720 | + /* let the completion of the qp destroy free the qp */ |
|---|
| 760 | 721 | return ERR_PTR(err_code); |
|---|
| 761 | 722 | } |
|---|
| 762 | 723 | } |
|---|
| 763 | 724 | init_completion(&iwqp->sq_drained); |
|---|
| 764 | 725 | init_completion(&iwqp->rq_drained); |
|---|
| 726 | + init_completion(&iwqp->free_qp); |
|---|
| 765 | 727 | |
|---|
| 766 | 728 | return &iwqp->ibqp; |
|---|
| 767 | 729 | error: |
|---|
| 768 | | - i40iw_free_qp_resources(iwdev, iwqp, qp_num); |
|---|
| 730 | + i40iw_free_qp_resources(iwqp); |
|---|
| 769 | 731 | return ERR_PTR(err_code); |
|---|
| 770 | 732 | } |
|---|
| 771 | 733 | |
|---|
| .. | .. |
|---|
| 836 | 798 | case I40IW_QP_STATE_RTS: |
|---|
| 837 | 799 | if (iwqp->iwarp_state == I40IW_QP_STATE_IDLE) |
|---|
| 838 | 800 | i40iw_send_reset(iwqp->cm_node); |
|---|
| 839 | | - /* fall through */ |
|---|
| 801 | + fallthrough; |
|---|
| 840 | 802 | case I40IW_QP_STATE_IDLE: |
|---|
| 841 | 803 | case I40IW_QP_STATE_TERMINATE: |
|---|
| 842 | 804 | case I40IW_QP_STATE_CLOSING: |
|---|
| .. | .. |
|---|
| 1076 | 1038 | /** |
|---|
| 1077 | 1039 | * i40iw_destroy_cq - destroy cq |
|---|
| 1078 | 1040 | * @ib_cq: cq pointer |
|---|
| 1041 | + * @udata: user data or NULL for kernel object |
|---|
| 1079 | 1042 | */ |
|---|
| 1080 | | -static int i40iw_destroy_cq(struct ib_cq *ib_cq) |
|---|
| 1043 | +static int i40iw_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata) |
|---|
| 1081 | 1044 | { |
|---|
| 1082 | 1045 | struct i40iw_cq *iwcq; |
|---|
| 1083 | 1046 | struct i40iw_device *iwdev; |
|---|
| 1084 | 1047 | struct i40iw_sc_cq *cq; |
|---|
| 1085 | | - |
|---|
| 1086 | | - if (!ib_cq) { |
|---|
| 1087 | | - i40iw_pr_err("ib_cq == NULL\n"); |
|---|
| 1088 | | - return 0; |
|---|
| 1089 | | - } |
|---|
| 1090 | 1048 | |
|---|
| 1091 | 1049 | iwcq = to_iwcq(ib_cq); |
|---|
| 1092 | 1050 | iwdev = to_iwdev(ib_cq->device); |
|---|
| 1093 | 1051 | cq = &iwcq->sc_cq; |
|---|
| 1094 | 1052 | i40iw_cq_wq_destroy(iwdev, cq); |
|---|
| 1095 | 1053 | cq_free_resources(iwdev, iwcq); |
|---|
| 1096 | | - kfree(iwcq); |
|---|
| 1097 | 1054 | i40iw_rem_devusecount(iwdev); |
|---|
| 1098 | 1055 | return 0; |
|---|
| 1099 | 1056 | } |
|---|
| 1100 | 1057 | |
|---|
| 1101 | 1058 | /** |
|---|
| 1102 | 1059 | * i40iw_create_cq - create cq |
|---|
| 1103 | | - * @ibdev: device pointer from stack |
|---|
| 1060 | + * @ibcq: CQ allocated |
|---|
| 1104 | 1061 | * @attr: attributes for cq |
|---|
| 1105 | | - * @context: user context created during alloc |
|---|
| 1106 | 1062 | * @udata: user data |
|---|
| 1107 | 1063 | */ |
|---|
| 1108 | | -static struct ib_cq *i40iw_create_cq(struct ib_device *ibdev, |
|---|
| 1109 | | - const struct ib_cq_init_attr *attr, |
|---|
| 1110 | | - struct ib_ucontext *context, |
|---|
| 1111 | | - struct ib_udata *udata) |
|---|
| 1064 | +static int i40iw_create_cq(struct ib_cq *ibcq, |
|---|
| 1065 | + const struct ib_cq_init_attr *attr, |
|---|
| 1066 | + struct ib_udata *udata) |
|---|
| 1112 | 1067 | { |
|---|
| 1068 | + struct ib_device *ibdev = ibcq->device; |
|---|
| 1113 | 1069 | struct i40iw_device *iwdev = to_iwdev(ibdev); |
|---|
| 1114 | | - struct i40iw_cq *iwcq; |
|---|
| 1070 | + struct i40iw_cq *iwcq = to_iwcq(ibcq); |
|---|
| 1115 | 1071 | struct i40iw_pbl *iwpbl; |
|---|
| 1116 | 1072 | u32 cq_num = 0; |
|---|
| 1117 | 1073 | struct i40iw_sc_cq *cq; |
|---|
| 1118 | 1074 | struct i40iw_sc_dev *dev = &iwdev->sc_dev; |
|---|
| 1119 | | - struct i40iw_cq_init_info info; |
|---|
| 1075 | + struct i40iw_cq_init_info info = {}; |
|---|
| 1120 | 1076 | enum i40iw_status_code status; |
|---|
| 1121 | 1077 | struct i40iw_cqp_request *cqp_request; |
|---|
| 1122 | 1078 | struct cqp_commands_info *cqp_info; |
|---|
| .. | .. |
|---|
| 1126 | 1082 | int entries = attr->cqe; |
|---|
| 1127 | 1083 | |
|---|
| 1128 | 1084 | if (iwdev->closing) |
|---|
| 1129 | | - return ERR_PTR(-ENODEV); |
|---|
| 1085 | + return -ENODEV; |
|---|
| 1130 | 1086 | |
|---|
| 1131 | 1087 | if (entries > iwdev->max_cqe) |
|---|
| 1132 | | - return ERR_PTR(-EINVAL); |
|---|
| 1133 | | - |
|---|
| 1134 | | - iwcq = kzalloc(sizeof(*iwcq), GFP_KERNEL); |
|---|
| 1135 | | - if (!iwcq) |
|---|
| 1136 | | - return ERR_PTR(-ENOMEM); |
|---|
| 1137 | | - |
|---|
| 1138 | | - memset(&info, 0, sizeof(info)); |
|---|
| 1088 | + return -EINVAL; |
|---|
| 1139 | 1089 | |
|---|
| 1140 | 1090 | err_code = i40iw_alloc_resource(iwdev, iwdev->allocated_cqs, |
|---|
| 1141 | 1091 | iwdev->max_cq, &cq_num, |
|---|
| 1142 | 1092 | &iwdev->next_cq); |
|---|
| 1143 | 1093 | if (err_code) |
|---|
| 1144 | | - goto error; |
|---|
| 1094 | + return err_code; |
|---|
| 1145 | 1095 | |
|---|
| 1146 | 1096 | cq = &iwcq->sc_cq; |
|---|
| 1147 | 1097 | cq->back_cq = (void *)iwcq; |
|---|
| .. | .. |
|---|
| 1157 | 1107 | info.ceq_id_valid = true; |
|---|
| 1158 | 1108 | info.ceqe_mask = 1; |
|---|
| 1159 | 1109 | info.type = I40IW_CQ_TYPE_IWARP; |
|---|
| 1160 | | - if (context) { |
|---|
| 1161 | | - struct i40iw_ucontext *ucontext; |
|---|
| 1110 | + if (udata) { |
|---|
| 1111 | + struct i40iw_ucontext *ucontext = rdma_udata_to_drv_context( |
|---|
| 1112 | + udata, struct i40iw_ucontext, ibucontext); |
|---|
| 1162 | 1113 | struct i40iw_create_cq_req req; |
|---|
| 1163 | 1114 | struct i40iw_cq_mr *cqmr; |
|---|
| 1164 | 1115 | |
|---|
| 1165 | 1116 | memset(&req, 0, sizeof(req)); |
|---|
| 1166 | 1117 | iwcq->user_mode = true; |
|---|
| 1167 | | - ucontext = to_ucontext(context); |
|---|
| 1168 | 1118 | if (ib_copy_from_udata(&req, udata, sizeof(struct i40iw_create_cq_req))) { |
|---|
| 1169 | 1119 | err_code = -EFAULT; |
|---|
| 1170 | 1120 | goto cq_free_resources; |
|---|
| .. | .. |
|---|
| 1234 | 1184 | goto cq_free_resources; |
|---|
| 1235 | 1185 | } |
|---|
| 1236 | 1186 | |
|---|
| 1237 | | - if (context) { |
|---|
| 1187 | + if (udata) { |
|---|
| 1238 | 1188 | struct i40iw_create_cq_resp resp; |
|---|
| 1239 | 1189 | |
|---|
| 1240 | 1190 | memset(&resp, 0, sizeof(resp)); |
|---|
| .. | .. |
|---|
| 1248 | 1198 | } |
|---|
| 1249 | 1199 | |
|---|
| 1250 | 1200 | i40iw_add_devusecount(iwdev); |
|---|
| 1251 | | - return (struct ib_cq *)iwcq; |
|---|
| 1201 | + return 0; |
|---|
| 1252 | 1202 | |
|---|
| 1253 | 1203 | cq_destroy: |
|---|
| 1254 | 1204 | i40iw_cq_wq_destroy(iwdev, cq); |
|---|
| 1255 | 1205 | cq_free_resources: |
|---|
| 1256 | 1206 | cq_free_resources(iwdev, iwcq); |
|---|
| 1257 | | -error: |
|---|
| 1258 | | - kfree(iwcq); |
|---|
| 1259 | | - return ERR_PTR(err_code); |
|---|
| 1207 | + return err_code; |
|---|
| 1260 | 1208 | } |
|---|
| 1261 | 1209 | |
|---|
| 1262 | 1210 | /** |
|---|
| .. | .. |
|---|
| 1351 | 1299 | { |
|---|
| 1352 | 1300 | struct ib_umem *region = iwmr->region; |
|---|
| 1353 | 1301 | struct i40iw_pbl *iwpbl = &iwmr->iwpbl; |
|---|
| 1354 | | - int chunk_pages, entry, i; |
|---|
| 1355 | 1302 | struct i40iw_pble_alloc *palloc = &iwpbl->pble_alloc; |
|---|
| 1356 | 1303 | struct i40iw_pble_info *pinfo; |
|---|
| 1357 | | - struct scatterlist *sg; |
|---|
| 1358 | | - u64 pg_addr = 0; |
|---|
| 1304 | + struct ib_block_iter biter; |
|---|
| 1359 | 1305 | u32 idx = 0; |
|---|
| 1360 | 1306 | |
|---|
| 1361 | 1307 | pinfo = (level == I40IW_LEVEL_1) ? NULL : palloc->level2.leaf; |
|---|
| 1362 | 1308 | |
|---|
| 1363 | | - for_each_sg(region->sg_head.sgl, sg, region->nmap, entry) { |
|---|
| 1364 | | - chunk_pages = sg_dma_len(sg) >> region->page_shift; |
|---|
| 1365 | | - if ((iwmr->type == IW_MEMREG_TYPE_QP) && |
|---|
| 1366 | | - !iwpbl->qp_mr.sq_page) |
|---|
| 1367 | | - iwpbl->qp_mr.sq_page = sg_page(sg); |
|---|
| 1368 | | - for (i = 0; i < chunk_pages; i++) { |
|---|
| 1369 | | - pg_addr = sg_dma_address(sg) + |
|---|
| 1370 | | - (i << region->page_shift); |
|---|
| 1309 | + if (iwmr->type == IW_MEMREG_TYPE_QP) |
|---|
| 1310 | + iwpbl->qp_mr.sq_page = sg_page(region->sg_head.sgl); |
|---|
| 1371 | 1311 | |
|---|
| 1372 | | - if ((entry + i) == 0) |
|---|
| 1373 | | - *pbl = cpu_to_le64(pg_addr & iwmr->page_msk); |
|---|
| 1374 | | - else if (!(pg_addr & ~iwmr->page_msk)) |
|---|
| 1375 | | - *pbl = cpu_to_le64(pg_addr); |
|---|
| 1376 | | - else |
|---|
| 1377 | | - continue; |
|---|
| 1378 | | - pbl = i40iw_next_pbl_addr(pbl, &pinfo, &idx); |
|---|
| 1379 | | - } |
|---|
| 1312 | + rdma_umem_for_each_dma_block(region, &biter, iwmr->page_size) { |
|---|
| 1313 | + *pbl = rdma_block_iter_dma_address(&biter); |
|---|
| 1314 | + pbl = i40iw_next_pbl_addr(pbl, &pinfo, &idx); |
|---|
| 1380 | 1315 | } |
|---|
| 1381 | | -} |
|---|
| 1382 | | - |
|---|
| 1383 | | -/** |
|---|
| 1384 | | - * i40iw_set_hugetlb_params - set MR pg size and mask to huge pg values. |
|---|
| 1385 | | - * @addr: virtual address |
|---|
| 1386 | | - * @iwmr: mr pointer for this memory registration |
|---|
| 1387 | | - */ |
|---|
| 1388 | | -static void i40iw_set_hugetlb_values(u64 addr, struct i40iw_mr *iwmr) |
|---|
| 1389 | | -{ |
|---|
| 1390 | | - struct vm_area_struct *vma; |
|---|
| 1391 | | - struct hstate *h; |
|---|
| 1392 | | - |
|---|
| 1393 | | - down_read(¤t->mm->mmap_sem); |
|---|
| 1394 | | - vma = find_vma(current->mm, addr); |
|---|
| 1395 | | - if (vma && is_vm_hugetlb_page(vma)) { |
|---|
| 1396 | | - h = hstate_vma(vma); |
|---|
| 1397 | | - if (huge_page_size(h) == 0x200000) { |
|---|
| 1398 | | - iwmr->page_size = huge_page_size(h); |
|---|
| 1399 | | - iwmr->page_msk = huge_page_mask(h); |
|---|
| 1400 | | - } |
|---|
| 1401 | | - } |
|---|
| 1402 | | - up_read(¤t->mm->mmap_sem); |
|---|
| 1403 | 1316 | } |
|---|
| 1404 | 1317 | |
|---|
| 1405 | 1318 | /** |
|---|
| .. | .. |
|---|
| 1618 | 1531 | * @mr_type: memory for stag registrion |
|---|
| 1619 | 1532 | * @max_num_sg: man number of pages |
|---|
| 1620 | 1533 | */ |
|---|
| 1621 | | -static struct ib_mr *i40iw_alloc_mr(struct ib_pd *pd, |
|---|
| 1622 | | - enum ib_mr_type mr_type, |
|---|
| 1534 | +static struct ib_mr *i40iw_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type, |
|---|
| 1623 | 1535 | u32 max_num_sg) |
|---|
| 1624 | 1536 | { |
|---|
| 1625 | 1537 | struct i40iw_pd *iwpd = to_iwpd(pd); |
|---|
| .. | .. |
|---|
| 1813 | 1725 | { |
|---|
| 1814 | 1726 | struct i40iw_pd *iwpd = to_iwpd(pd); |
|---|
| 1815 | 1727 | struct i40iw_device *iwdev = to_iwdev(pd->device); |
|---|
| 1816 | | - struct i40iw_ucontext *ucontext; |
|---|
| 1728 | + struct i40iw_ucontext *ucontext = rdma_udata_to_drv_context( |
|---|
| 1729 | + udata, struct i40iw_ucontext, ibucontext); |
|---|
| 1817 | 1730 | struct i40iw_pble_alloc *palloc; |
|---|
| 1818 | 1731 | struct i40iw_pbl *iwpbl; |
|---|
| 1819 | 1732 | struct i40iw_mr *iwmr; |
|---|
| 1820 | 1733 | struct ib_umem *region; |
|---|
| 1821 | 1734 | struct i40iw_mem_reg_req req; |
|---|
| 1822 | | - u64 pbl_depth = 0; |
|---|
| 1823 | 1735 | u32 stag = 0; |
|---|
| 1824 | 1736 | u16 access; |
|---|
| 1825 | | - u64 region_length; |
|---|
| 1826 | 1737 | bool use_pbles = false; |
|---|
| 1827 | 1738 | unsigned long flags; |
|---|
| 1828 | 1739 | int err = -ENOSYS; |
|---|
| 1829 | 1740 | int ret; |
|---|
| 1830 | | - int pg_shift; |
|---|
| 1741 | + |
|---|
| 1742 | + if (!udata) |
|---|
| 1743 | + return ERR_PTR(-EOPNOTSUPP); |
|---|
| 1831 | 1744 | |
|---|
| 1832 | 1745 | if (iwdev->closing) |
|---|
| 1833 | 1746 | return ERR_PTR(-ENODEV); |
|---|
| 1834 | 1747 | |
|---|
| 1835 | 1748 | if (length > I40IW_MAX_MR_SIZE) |
|---|
| 1836 | 1749 | return ERR_PTR(-EINVAL); |
|---|
| 1837 | | - region = ib_umem_get(pd->uobject->context, start, length, acc, 0); |
|---|
| 1750 | + region = ib_umem_get(pd->device, start, length, acc); |
|---|
| 1838 | 1751 | if (IS_ERR(region)) |
|---|
| 1839 | 1752 | return (struct ib_mr *)region; |
|---|
| 1840 | 1753 | |
|---|
| .. | .. |
|---|
| 1854 | 1767 | iwmr->region = region; |
|---|
| 1855 | 1768 | iwmr->ibmr.pd = pd; |
|---|
| 1856 | 1769 | iwmr->ibmr.device = pd->device; |
|---|
| 1857 | | - ucontext = to_ucontext(pd->uobject->context); |
|---|
| 1858 | 1770 | |
|---|
| 1859 | 1771 | iwmr->page_size = PAGE_SIZE; |
|---|
| 1860 | | - iwmr->page_msk = PAGE_MASK; |
|---|
| 1861 | | - |
|---|
| 1862 | | - if (region->hugetlb && (req.reg_type == IW_MEMREG_TYPE_MEM)) |
|---|
| 1863 | | - i40iw_set_hugetlb_values(start, iwmr); |
|---|
| 1864 | | - |
|---|
| 1865 | | - region_length = region->length + (start & (iwmr->page_size - 1)); |
|---|
| 1866 | | - pg_shift = ffs(iwmr->page_size) - 1; |
|---|
| 1867 | | - pbl_depth = region_length >> pg_shift; |
|---|
| 1868 | | - pbl_depth += (region_length & (iwmr->page_size - 1)) ? 1 : 0; |
|---|
| 1772 | + if (req.reg_type == IW_MEMREG_TYPE_MEM) |
|---|
| 1773 | + iwmr->page_size = ib_umem_find_best_pgsz(region, SZ_4K | SZ_2M, |
|---|
| 1774 | + virt); |
|---|
| 1869 | 1775 | iwmr->length = region->length; |
|---|
| 1870 | 1776 | |
|---|
| 1871 | 1777 | iwpbl->user_base = virt; |
|---|
| 1872 | 1778 | palloc = &iwpbl->pble_alloc; |
|---|
| 1873 | 1779 | |
|---|
| 1874 | 1780 | iwmr->type = req.reg_type; |
|---|
| 1875 | | - iwmr->page_cnt = (u32)pbl_depth; |
|---|
| 1781 | + iwmr->page_cnt = ib_umem_num_dma_blocks(region, iwmr->page_size); |
|---|
| 1876 | 1782 | |
|---|
| 1877 | 1783 | switch (req.reg_type) { |
|---|
| 1878 | 1784 | case IW_MEMREG_TYPE_QP: |
|---|
| .. | .. |
|---|
| 2054 | 1960 | * i40iw_dereg_mr - deregister mr |
|---|
| 2055 | 1961 | * @ib_mr: mr ptr for dereg |
|---|
| 2056 | 1962 | */ |
|---|
| 2057 | | -static int i40iw_dereg_mr(struct ib_mr *ib_mr) |
|---|
| 1963 | +static int i40iw_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) |
|---|
| 2058 | 1964 | { |
|---|
| 2059 | 1965 | struct ib_pd *ibpd = ib_mr->pd; |
|---|
| 2060 | 1966 | struct i40iw_pd *iwpd = to_iwpd(ibpd); |
|---|
| .. | .. |
|---|
| 2068 | 1974 | struct cqp_commands_info *cqp_info; |
|---|
| 2069 | 1975 | u32 stag_idx; |
|---|
| 2070 | 1976 | |
|---|
| 2071 | | - if (iwmr->region) |
|---|
| 2072 | | - ib_umem_release(iwmr->region); |
|---|
| 1977 | + ib_umem_release(iwmr->region); |
|---|
| 2073 | 1978 | |
|---|
| 2074 | 1979 | if (iwmr->type != IW_MEMREG_TYPE_MEM) { |
|---|
| 2075 | | - if (ibpd->uobject) { |
|---|
| 2076 | | - struct i40iw_ucontext *ucontext; |
|---|
| 1980 | + /* region is released. only test for userness. */ |
|---|
| 1981 | + if (iwmr->region) { |
|---|
| 1982 | + struct i40iw_ucontext *ucontext = |
|---|
| 1983 | + rdma_udata_to_drv_context( |
|---|
| 1984 | + udata, |
|---|
| 1985 | + struct i40iw_ucontext, |
|---|
| 1986 | + ibucontext); |
|---|
| 2077 | 1987 | |
|---|
| 2078 | | - ucontext = to_ucontext(ibpd->uobject->context); |
|---|
| 2079 | 1988 | i40iw_del_memlist(iwmr, ucontext); |
|---|
| 2080 | 1989 | } |
|---|
| 2081 | 1990 | if (iwpbl->pbl_allocated && iwmr->type != IW_MEMREG_TYPE_QP) |
|---|
| .. | .. |
|---|
| 2115 | 2024 | } |
|---|
| 2116 | 2025 | |
|---|
| 2117 | 2026 | /** |
|---|
| 2118 | | - * i40iw_show_rev |
|---|
| 2027 | + * hw_rev_show |
|---|
| 2119 | 2028 | */ |
|---|
| 2120 | | -static ssize_t i40iw_show_rev(struct device *dev, |
|---|
| 2121 | | - struct device_attribute *attr, char *buf) |
|---|
| 2029 | +static ssize_t hw_rev_show(struct device *dev, |
|---|
| 2030 | + struct device_attribute *attr, char *buf) |
|---|
| 2122 | 2031 | { |
|---|
| 2123 | | - struct i40iw_ib_device *iwibdev = container_of(dev, |
|---|
| 2124 | | - struct i40iw_ib_device, |
|---|
| 2125 | | - ibdev.dev); |
|---|
| 2032 | + struct i40iw_ib_device *iwibdev = |
|---|
| 2033 | + rdma_device_to_drv_device(dev, struct i40iw_ib_device, ibdev); |
|---|
| 2126 | 2034 | u32 hw_rev = iwibdev->iwdev->sc_dev.hw_rev; |
|---|
| 2127 | 2035 | |
|---|
| 2128 | 2036 | return sprintf(buf, "%x\n", hw_rev); |
|---|
| 2129 | 2037 | } |
|---|
| 2038 | +static DEVICE_ATTR_RO(hw_rev); |
|---|
| 2130 | 2039 | |
|---|
| 2131 | 2040 | /** |
|---|
| 2132 | | - * i40iw_show_hca |
|---|
| 2041 | + * hca_type_show |
|---|
| 2133 | 2042 | */ |
|---|
| 2134 | | -static ssize_t i40iw_show_hca(struct device *dev, |
|---|
| 2135 | | - struct device_attribute *attr, char *buf) |
|---|
| 2043 | +static ssize_t hca_type_show(struct device *dev, |
|---|
| 2044 | + struct device_attribute *attr, char *buf) |
|---|
| 2136 | 2045 | { |
|---|
| 2137 | 2046 | return sprintf(buf, "I40IW\n"); |
|---|
| 2138 | 2047 | } |
|---|
| 2048 | +static DEVICE_ATTR_RO(hca_type); |
|---|
| 2139 | 2049 | |
|---|
| 2140 | 2050 | /** |
|---|
| 2141 | | - * i40iw_show_board |
|---|
| 2051 | + * board_id_show |
|---|
| 2142 | 2052 | */ |
|---|
| 2143 | | -static ssize_t i40iw_show_board(struct device *dev, |
|---|
| 2144 | | - struct device_attribute *attr, |
|---|
| 2145 | | - char *buf) |
|---|
| 2053 | +static ssize_t board_id_show(struct device *dev, |
|---|
| 2054 | + struct device_attribute *attr, char *buf) |
|---|
| 2146 | 2055 | { |
|---|
| 2147 | 2056 | return sprintf(buf, "%.*s\n", 32, "I40IW Board ID"); |
|---|
| 2148 | 2057 | } |
|---|
| 2058 | +static DEVICE_ATTR_RO(board_id); |
|---|
| 2149 | 2059 | |
|---|
| 2150 | | -static DEVICE_ATTR(hw_rev, S_IRUGO, i40iw_show_rev, NULL); |
|---|
| 2151 | | -static DEVICE_ATTR(hca_type, S_IRUGO, i40iw_show_hca, NULL); |
|---|
| 2152 | | -static DEVICE_ATTR(board_id, S_IRUGO, i40iw_show_board, NULL); |
|---|
| 2060 | +static struct attribute *i40iw_dev_attributes[] = { |
|---|
| 2061 | + &dev_attr_hw_rev.attr, |
|---|
| 2062 | + &dev_attr_hca_type.attr, |
|---|
| 2063 | + &dev_attr_board_id.attr, |
|---|
| 2064 | + NULL |
|---|
| 2065 | +}; |
|---|
| 2153 | 2066 | |
|---|
| 2154 | | -static struct device_attribute *i40iw_dev_attributes[] = { |
|---|
| 2155 | | - &dev_attr_hw_rev, |
|---|
| 2156 | | - &dev_attr_hca_type, |
|---|
| 2157 | | - &dev_attr_board_id |
|---|
| 2067 | +static const struct attribute_group i40iw_attr_group = { |
|---|
| 2068 | + .attrs = i40iw_dev_attributes, |
|---|
| 2158 | 2069 | }; |
|---|
| 2159 | 2070 | |
|---|
| 2160 | 2071 | /** |
|---|
| .. | .. |
|---|
| 2213 | 2124 | |
|---|
| 2214 | 2125 | switch (ib_wr->opcode) { |
|---|
| 2215 | 2126 | case IB_WR_SEND: |
|---|
| 2216 | | - /* fall-through */ |
|---|
| 2217 | 2127 | case IB_WR_SEND_WITH_INV: |
|---|
| 2218 | 2128 | if (ib_wr->opcode == IB_WR_SEND) { |
|---|
| 2219 | 2129 | if (ib_wr->send_flags & IB_SEND_SOLICITED) |
|---|
| .. | .. |
|---|
| 2270 | 2180 | break; |
|---|
| 2271 | 2181 | case IB_WR_RDMA_READ_WITH_INV: |
|---|
| 2272 | 2182 | inv_stag = true; |
|---|
| 2273 | | - /* fall-through*/ |
|---|
| 2183 | + fallthrough; |
|---|
| 2274 | 2184 | case IB_WR_RDMA_READ: |
|---|
| 2275 | 2185 | if (ib_wr->num_sge > I40IW_MAX_SGE_RD) { |
|---|
| 2276 | 2186 | err = -EINVAL; |
|---|
| .. | .. |
|---|
| 2527 | 2437 | if (err) |
|---|
| 2528 | 2438 | return err; |
|---|
| 2529 | 2439 | |
|---|
| 2530 | | - immutable->pkey_tbl_len = attr.pkey_tbl_len; |
|---|
| 2531 | 2440 | immutable->gid_tbl_len = attr.gid_tbl_len; |
|---|
| 2532 | 2441 | |
|---|
| 2533 | 2442 | return 0; |
|---|
| .. | .. |
|---|
| 2601 | 2510 | |
|---|
| 2602 | 2511 | static void i40iw_get_dev_fw_str(struct ib_device *dev, char *str) |
|---|
| 2603 | 2512 | { |
|---|
| 2604 | | - u32 firmware_version = I40IW_FW_VERSION; |
|---|
| 2513 | + struct i40iw_device *iwdev = to_iwdev(dev); |
|---|
| 2605 | 2514 | |
|---|
| 2606 | | - snprintf(str, IB_FW_VERSION_NAME_MAX, "%u.%u", firmware_version, |
|---|
| 2607 | | - (firmware_version & 0x000000ff)); |
|---|
| 2515 | + snprintf(str, IB_FW_VERSION_NAME_MAX, "%llu.%llu", |
|---|
| 2516 | + i40iw_fw_major_ver(&iwdev->sc_dev), |
|---|
| 2517 | + i40iw_fw_minor_ver(&iwdev->sc_dev)); |
|---|
| 2608 | 2518 | } |
|---|
| 2609 | 2519 | |
|---|
| 2610 | 2520 | /** |
|---|
| .. | .. |
|---|
| 2682 | 2592 | return 0; |
|---|
| 2683 | 2593 | } |
|---|
| 2684 | 2594 | |
|---|
| 2685 | | -/** |
|---|
| 2686 | | - * i40iw_query_pkey - Query partition key |
|---|
| 2687 | | - * @ibdev: device pointer from stack |
|---|
| 2688 | | - * @port: port number |
|---|
| 2689 | | - * @index: index of pkey |
|---|
| 2690 | | - * @pkey: pointer to store the pkey |
|---|
| 2691 | | - */ |
|---|
| 2692 | | -static int i40iw_query_pkey(struct ib_device *ibdev, |
|---|
| 2693 | | - u8 port, |
|---|
| 2694 | | - u16 index, |
|---|
| 2695 | | - u16 *pkey) |
|---|
| 2696 | | -{ |
|---|
| 2697 | | - *pkey = 0; |
|---|
| 2698 | | - return 0; |
|---|
| 2699 | | -} |
|---|
| 2595 | +static const struct ib_device_ops i40iw_dev_ops = { |
|---|
| 2596 | + .owner = THIS_MODULE, |
|---|
| 2597 | + .driver_id = RDMA_DRIVER_I40IW, |
|---|
| 2598 | + /* NOTE: Older kernels wrongly use 0 for the uverbs_abi_ver */ |
|---|
| 2599 | + .uverbs_abi_ver = I40IW_ABI_VER, |
|---|
| 2700 | 2600 | |
|---|
| 2701 | | -/** |
|---|
| 2702 | | - * i40iw_get_vector_affinity - report IRQ affinity mask |
|---|
| 2703 | | - * @ibdev: IB device |
|---|
| 2704 | | - * @comp_vector: completion vector index |
|---|
| 2705 | | - */ |
|---|
| 2706 | | -static const struct cpumask *i40iw_get_vector_affinity(struct ib_device *ibdev, |
|---|
| 2707 | | - int comp_vector) |
|---|
| 2708 | | -{ |
|---|
| 2709 | | - struct i40iw_device *iwdev = to_iwdev(ibdev); |
|---|
| 2710 | | - struct i40iw_msix_vector *msix_vec; |
|---|
| 2711 | | - |
|---|
| 2712 | | - if (iwdev->msix_shared) |
|---|
| 2713 | | - msix_vec = &iwdev->iw_msixtbl[comp_vector]; |
|---|
| 2714 | | - else |
|---|
| 2715 | | - msix_vec = &iwdev->iw_msixtbl[comp_vector + 1]; |
|---|
| 2716 | | - |
|---|
| 2717 | | - return irq_get_affinity_mask(msix_vec->irq); |
|---|
| 2718 | | -} |
|---|
| 2601 | + .alloc_hw_stats = i40iw_alloc_hw_stats, |
|---|
| 2602 | + .alloc_mr = i40iw_alloc_mr, |
|---|
| 2603 | + .alloc_pd = i40iw_alloc_pd, |
|---|
| 2604 | + .alloc_ucontext = i40iw_alloc_ucontext, |
|---|
| 2605 | + .create_cq = i40iw_create_cq, |
|---|
| 2606 | + .create_qp = i40iw_create_qp, |
|---|
| 2607 | + .dealloc_pd = i40iw_dealloc_pd, |
|---|
| 2608 | + .dealloc_ucontext = i40iw_dealloc_ucontext, |
|---|
| 2609 | + .dereg_mr = i40iw_dereg_mr, |
|---|
| 2610 | + .destroy_cq = i40iw_destroy_cq, |
|---|
| 2611 | + .destroy_qp = i40iw_destroy_qp, |
|---|
| 2612 | + .drain_rq = i40iw_drain_rq, |
|---|
| 2613 | + .drain_sq = i40iw_drain_sq, |
|---|
| 2614 | + .get_dev_fw_str = i40iw_get_dev_fw_str, |
|---|
| 2615 | + .get_dma_mr = i40iw_get_dma_mr, |
|---|
| 2616 | + .get_hw_stats = i40iw_get_hw_stats, |
|---|
| 2617 | + .get_port_immutable = i40iw_port_immutable, |
|---|
| 2618 | + .iw_accept = i40iw_accept, |
|---|
| 2619 | + .iw_add_ref = i40iw_qp_add_ref, |
|---|
| 2620 | + .iw_connect = i40iw_connect, |
|---|
| 2621 | + .iw_create_listen = i40iw_create_listen, |
|---|
| 2622 | + .iw_destroy_listen = i40iw_destroy_listen, |
|---|
| 2623 | + .iw_get_qp = i40iw_get_qp, |
|---|
| 2624 | + .iw_reject = i40iw_reject, |
|---|
| 2625 | + .iw_rem_ref = i40iw_qp_rem_ref, |
|---|
| 2626 | + .map_mr_sg = i40iw_map_mr_sg, |
|---|
| 2627 | + .mmap = i40iw_mmap, |
|---|
| 2628 | + .modify_qp = i40iw_modify_qp, |
|---|
| 2629 | + .poll_cq = i40iw_poll_cq, |
|---|
| 2630 | + .post_recv = i40iw_post_recv, |
|---|
| 2631 | + .post_send = i40iw_post_send, |
|---|
| 2632 | + .query_device = i40iw_query_device, |
|---|
| 2633 | + .query_gid = i40iw_query_gid, |
|---|
| 2634 | + .query_port = i40iw_query_port, |
|---|
| 2635 | + .query_qp = i40iw_query_qp, |
|---|
| 2636 | + .reg_user_mr = i40iw_reg_user_mr, |
|---|
| 2637 | + .req_notify_cq = i40iw_req_notify_cq, |
|---|
| 2638 | + INIT_RDMA_OBJ_SIZE(ib_pd, i40iw_pd, ibpd), |
|---|
| 2639 | + INIT_RDMA_OBJ_SIZE(ib_cq, i40iw_cq, ibcq), |
|---|
| 2640 | + INIT_RDMA_OBJ_SIZE(ib_ucontext, i40iw_ucontext, ibucontext), |
|---|
| 2641 | +}; |
|---|
| 2719 | 2642 | |
|---|
| 2720 | 2643 | /** |
|---|
| 2721 | 2644 | * i40iw_init_rdma_device - initialization of iwarp device |
|---|
| .. | .. |
|---|
| 2725 | 2648 | { |
|---|
| 2726 | 2649 | struct i40iw_ib_device *iwibdev; |
|---|
| 2727 | 2650 | struct net_device *netdev = iwdev->netdev; |
|---|
| 2728 | | - struct pci_dev *pcidev = (struct pci_dev *)iwdev->hw.dev_context; |
|---|
| 2651 | + struct pci_dev *pcidev = iwdev->hw.pcidev; |
|---|
| 2729 | 2652 | |
|---|
| 2730 | | - iwibdev = (struct i40iw_ib_device *)ib_alloc_device(sizeof(*iwibdev)); |
|---|
| 2653 | + iwibdev = ib_alloc_device(i40iw_ib_device, ibdev); |
|---|
| 2731 | 2654 | if (!iwibdev) { |
|---|
| 2732 | 2655 | i40iw_pr_err("iwdev == NULL\n"); |
|---|
| 2733 | 2656 | return NULL; |
|---|
| 2734 | 2657 | } |
|---|
| 2735 | | - strlcpy(iwibdev->ibdev.name, "i40iw%d", IB_DEVICE_NAME_MAX); |
|---|
| 2736 | | - iwibdev->ibdev.owner = THIS_MODULE; |
|---|
| 2737 | 2658 | iwdev->iwibdev = iwibdev; |
|---|
| 2738 | 2659 | iwibdev->iwdev = iwdev; |
|---|
| 2739 | 2660 | |
|---|
| .. | .. |
|---|
| 2764 | 2685 | iwibdev->ibdev.phys_port_cnt = 1; |
|---|
| 2765 | 2686 | iwibdev->ibdev.num_comp_vectors = iwdev->ceqs_count; |
|---|
| 2766 | 2687 | iwibdev->ibdev.dev.parent = &pcidev->dev; |
|---|
| 2767 | | - iwibdev->ibdev.query_port = i40iw_query_port; |
|---|
| 2768 | | - iwibdev->ibdev.query_pkey = i40iw_query_pkey; |
|---|
| 2769 | | - iwibdev->ibdev.query_gid = i40iw_query_gid; |
|---|
| 2770 | | - iwibdev->ibdev.alloc_ucontext = i40iw_alloc_ucontext; |
|---|
| 2771 | | - iwibdev->ibdev.dealloc_ucontext = i40iw_dealloc_ucontext; |
|---|
| 2772 | | - iwibdev->ibdev.mmap = i40iw_mmap; |
|---|
| 2773 | | - iwibdev->ibdev.alloc_pd = i40iw_alloc_pd; |
|---|
| 2774 | | - iwibdev->ibdev.dealloc_pd = i40iw_dealloc_pd; |
|---|
| 2775 | | - iwibdev->ibdev.create_qp = i40iw_create_qp; |
|---|
| 2776 | | - iwibdev->ibdev.modify_qp = i40iw_modify_qp; |
|---|
| 2777 | | - iwibdev->ibdev.query_qp = i40iw_query_qp; |
|---|
| 2778 | | - iwibdev->ibdev.destroy_qp = i40iw_destroy_qp; |
|---|
| 2779 | | - iwibdev->ibdev.create_cq = i40iw_create_cq; |
|---|
| 2780 | | - iwibdev->ibdev.destroy_cq = i40iw_destroy_cq; |
|---|
| 2781 | | - iwibdev->ibdev.get_dma_mr = i40iw_get_dma_mr; |
|---|
| 2782 | | - iwibdev->ibdev.reg_user_mr = i40iw_reg_user_mr; |
|---|
| 2783 | | - iwibdev->ibdev.dereg_mr = i40iw_dereg_mr; |
|---|
| 2784 | | - iwibdev->ibdev.alloc_hw_stats = i40iw_alloc_hw_stats; |
|---|
| 2785 | | - iwibdev->ibdev.get_hw_stats = i40iw_get_hw_stats; |
|---|
| 2786 | | - iwibdev->ibdev.query_device = i40iw_query_device; |
|---|
| 2787 | | - iwibdev->ibdev.drain_sq = i40iw_drain_sq; |
|---|
| 2788 | | - iwibdev->ibdev.drain_rq = i40iw_drain_rq; |
|---|
| 2789 | | - iwibdev->ibdev.alloc_mr = i40iw_alloc_mr; |
|---|
| 2790 | | - iwibdev->ibdev.map_mr_sg = i40iw_map_mr_sg; |
|---|
| 2791 | | - iwibdev->ibdev.iwcm = kzalloc(sizeof(*iwibdev->ibdev.iwcm), GFP_KERNEL); |
|---|
| 2792 | | - if (!iwibdev->ibdev.iwcm) { |
|---|
| 2793 | | - ib_dealloc_device(&iwibdev->ibdev); |
|---|
| 2794 | | - return NULL; |
|---|
| 2795 | | - } |
|---|
| 2796 | | - |
|---|
| 2797 | | - iwibdev->ibdev.iwcm->add_ref = i40iw_add_ref; |
|---|
| 2798 | | - iwibdev->ibdev.iwcm->rem_ref = i40iw_rem_ref; |
|---|
| 2799 | | - iwibdev->ibdev.iwcm->get_qp = i40iw_get_qp; |
|---|
| 2800 | | - iwibdev->ibdev.iwcm->connect = i40iw_connect; |
|---|
| 2801 | | - iwibdev->ibdev.iwcm->accept = i40iw_accept; |
|---|
| 2802 | | - iwibdev->ibdev.iwcm->reject = i40iw_reject; |
|---|
| 2803 | | - iwibdev->ibdev.iwcm->create_listen = i40iw_create_listen; |
|---|
| 2804 | | - iwibdev->ibdev.iwcm->destroy_listen = i40iw_destroy_listen; |
|---|
| 2805 | | - memcpy(iwibdev->ibdev.iwcm->ifname, netdev->name, |
|---|
| 2806 | | - sizeof(iwibdev->ibdev.iwcm->ifname)); |
|---|
| 2807 | | - iwibdev->ibdev.get_port_immutable = i40iw_port_immutable; |
|---|
| 2808 | | - iwibdev->ibdev.get_dev_fw_str = i40iw_get_dev_fw_str; |
|---|
| 2809 | | - iwibdev->ibdev.poll_cq = i40iw_poll_cq; |
|---|
| 2810 | | - iwibdev->ibdev.req_notify_cq = i40iw_req_notify_cq; |
|---|
| 2811 | | - iwibdev->ibdev.post_send = i40iw_post_send; |
|---|
| 2812 | | - iwibdev->ibdev.post_recv = i40iw_post_recv; |
|---|
| 2813 | | - iwibdev->ibdev.get_vector_affinity = i40iw_get_vector_affinity; |
|---|
| 2688 | + memcpy(iwibdev->ibdev.iw_ifname, netdev->name, |
|---|
| 2689 | + sizeof(iwibdev->ibdev.iw_ifname)); |
|---|
| 2690 | + ib_set_device_ops(&iwibdev->ibdev, &i40iw_dev_ops); |
|---|
| 2814 | 2691 | |
|---|
| 2815 | 2692 | return iwibdev; |
|---|
| 2816 | 2693 | } |
|---|
| .. | .. |
|---|
| 2831 | 2708 | } |
|---|
| 2832 | 2709 | |
|---|
| 2833 | 2710 | /** |
|---|
| 2834 | | - * i40iw_unregister_rdma_device - unregister of iwarp from IB |
|---|
| 2835 | | - * @iwibdev: rdma device ptr |
|---|
| 2836 | | - */ |
|---|
| 2837 | | -static void i40iw_unregister_rdma_device(struct i40iw_ib_device *iwibdev) |
|---|
| 2838 | | -{ |
|---|
| 2839 | | - int i; |
|---|
| 2840 | | - |
|---|
| 2841 | | - for (i = 0; i < ARRAY_SIZE(i40iw_dev_attributes); ++i) |
|---|
| 2842 | | - device_remove_file(&iwibdev->ibdev.dev, |
|---|
| 2843 | | - i40iw_dev_attributes[i]); |
|---|
| 2844 | | - ib_unregister_device(&iwibdev->ibdev); |
|---|
| 2845 | | -} |
|---|
| 2846 | | - |
|---|
| 2847 | | -/** |
|---|
| 2848 | 2711 | * i40iw_destroy_rdma_device - destroy rdma device and free resources |
|---|
| 2849 | 2712 | * @iwibdev: IB device ptr |
|---|
| 2850 | 2713 | */ |
|---|
| 2851 | 2714 | void i40iw_destroy_rdma_device(struct i40iw_ib_device *iwibdev) |
|---|
| 2852 | 2715 | { |
|---|
| 2853 | | - if (!iwibdev) |
|---|
| 2854 | | - return; |
|---|
| 2855 | | - |
|---|
| 2856 | | - i40iw_unregister_rdma_device(iwibdev); |
|---|
| 2857 | | - kfree(iwibdev->ibdev.iwcm); |
|---|
| 2858 | | - iwibdev->ibdev.iwcm = NULL; |
|---|
| 2716 | + ib_unregister_device(&iwibdev->ibdev); |
|---|
| 2859 | 2717 | wait_event_timeout(iwibdev->iwdev->close_wq, |
|---|
| 2860 | 2718 | !atomic64_read(&iwibdev->iwdev->use_count), |
|---|
| 2861 | 2719 | I40IW_EVENT_TIMEOUT); |
|---|
| .. | .. |
|---|
| 2868 | 2726 | */ |
|---|
| 2869 | 2727 | int i40iw_register_rdma_device(struct i40iw_device *iwdev) |
|---|
| 2870 | 2728 | { |
|---|
| 2871 | | - int i, ret; |
|---|
| 2729 | + int ret; |
|---|
| 2872 | 2730 | struct i40iw_ib_device *iwibdev; |
|---|
| 2873 | 2731 | |
|---|
| 2874 | 2732 | iwdev->iwibdev = i40iw_init_rdma_device(iwdev); |
|---|
| 2875 | 2733 | if (!iwdev->iwibdev) |
|---|
| 2876 | 2734 | return -ENOMEM; |
|---|
| 2877 | 2735 | iwibdev = iwdev->iwibdev; |
|---|
| 2878 | | - |
|---|
| 2879 | | - iwibdev->ibdev.driver_id = RDMA_DRIVER_I40IW; |
|---|
| 2880 | | - ret = ib_register_device(&iwibdev->ibdev, NULL); |
|---|
| 2736 | + rdma_set_device_sysfs_group(&iwibdev->ibdev, &i40iw_attr_group); |
|---|
| 2737 | + ret = ib_device_set_netdev(&iwibdev->ibdev, iwdev->netdev, 1); |
|---|
| 2881 | 2738 | if (ret) |
|---|
| 2882 | 2739 | goto error; |
|---|
| 2883 | 2740 | |
|---|
| 2884 | | - for (i = 0; i < ARRAY_SIZE(i40iw_dev_attributes); ++i) { |
|---|
| 2885 | | - ret = |
|---|
| 2886 | | - device_create_file(&iwibdev->ibdev.dev, |
|---|
| 2887 | | - i40iw_dev_attributes[i]); |
|---|
| 2888 | | - if (ret) { |
|---|
| 2889 | | - while (i > 0) { |
|---|
| 2890 | | - i--; |
|---|
| 2891 | | - device_remove_file(&iwibdev->ibdev.dev, i40iw_dev_attributes[i]); |
|---|
| 2892 | | - } |
|---|
| 2893 | | - ib_unregister_device(&iwibdev->ibdev); |
|---|
| 2894 | | - goto error; |
|---|
| 2895 | | - } |
|---|
| 2896 | | - } |
|---|
| 2741 | + dma_set_max_seg_size(&iwdev->hw.pcidev->dev, UINT_MAX); |
|---|
| 2742 | + ret = ib_register_device(&iwibdev->ibdev, "i40iw%d", &iwdev->hw.pcidev->dev); |
|---|
| 2743 | + if (ret) |
|---|
| 2744 | + goto error; |
|---|
| 2745 | + |
|---|
| 2897 | 2746 | return 0; |
|---|
| 2898 | 2747 | error: |
|---|
| 2899 | | - kfree(iwdev->iwibdev->ibdev.iwcm); |
|---|
| 2900 | | - iwdev->iwibdev->ibdev.iwcm = NULL; |
|---|
| 2901 | 2748 | ib_dealloc_device(&iwdev->iwibdev->ibdev); |
|---|
| 2902 | 2749 | return ret; |
|---|
| 2903 | 2750 | } |
|---|