| .. | .. |
|---|
| 165 | 165 | qla2xxx_rel_qpair_sp(sp->qpair, sp); |
|---|
| 166 | 166 | } |
|---|
| 167 | 167 | |
|---|
| 168 | | -static void qla_nvme_ls_unmap(struct srb *sp, struct nvmefc_ls_req *fd) |
|---|
| 169 | | -{ |
|---|
| 170 | | - if (sp->flags & SRB_DMA_VALID) { |
|---|
| 171 | | - struct srb_iocb *nvme = &sp->u.iocb_cmd; |
|---|
| 172 | | - struct qla_hw_data *ha = sp->fcport->vha->hw; |
|---|
| 173 | | - |
|---|
| 174 | | - dma_unmap_single(&ha->pdev->dev, nvme->u.nvme.cmd_dma, |
|---|
| 175 | | - fd->rqstlen, DMA_TO_DEVICE); |
|---|
| 176 | | - sp->flags &= ~SRB_DMA_VALID; |
|---|
| 177 | | - } |
|---|
| 178 | | -} |
|---|
| 179 | | - |
|---|
| 180 | 168 | static void qla_nvme_release_ls_cmd_kref(struct kref *kref) |
|---|
| 181 | 169 | { |
|---|
| 182 | 170 | struct srb *sp = container_of(kref, struct srb, cmd_kref); |
|---|
| .. | .. |
|---|
| 194 | 182 | |
|---|
| 195 | 183 | fd = priv->fd; |
|---|
| 196 | 184 | |
|---|
| 197 | | - qla_nvme_ls_unmap(sp, fd); |
|---|
| 198 | 185 | fd->done(fd, priv->comp_status); |
|---|
| 199 | 186 | out: |
|---|
| 200 | 187 | qla2x00_rel_sp(sp); |
|---|
| .. | .. |
|---|
| 336 | 323 | nvme->u.nvme.rsp_len = fd->rsplen; |
|---|
| 337 | 324 | nvme->u.nvme.rsp_dma = fd->rspdma; |
|---|
| 338 | 325 | nvme->u.nvme.timeout_sec = fd->timeout; |
|---|
| 339 | | - nvme->u.nvme.cmd_dma = dma_map_single(&ha->pdev->dev, fd->rqstaddr, |
|---|
| 340 | | - fd->rqstlen, DMA_TO_DEVICE); |
|---|
| 326 | + nvme->u.nvme.cmd_dma = fd->rqstdma; |
|---|
| 341 | 327 | dma_sync_single_for_device(&ha->pdev->dev, nvme->u.nvme.cmd_dma, |
|---|
| 342 | 328 | fd->rqstlen, DMA_TO_DEVICE); |
|---|
| 343 | | - |
|---|
| 344 | | - sp->flags |= SRB_DMA_VALID; |
|---|
| 345 | 329 | |
|---|
| 346 | 330 | rval = qla2x00_start_sp(sp); |
|---|
| 347 | 331 | if (rval != QLA_SUCCESS) { |
|---|
| 348 | 332 | ql_log(ql_log_warn, vha, 0x700e, |
|---|
| 349 | 333 | "qla2x00_start_sp failed = %d\n", rval); |
|---|
| 350 | | - wake_up(&sp->nvme_ls_waitq); |
|---|
| 351 | 334 | sp->priv = NULL; |
|---|
| 352 | 335 | priv->sp = NULL; |
|---|
| 353 | | - qla_nvme_ls_unmap(sp, fd); |
|---|
| 354 | 336 | qla2x00_rel_sp(sp); |
|---|
| 355 | 337 | return rval; |
|---|
| 356 | 338 | } |
|---|
| .. | .. |
|---|
| 415 | 397 | } |
|---|
| 416 | 398 | req_cnt = qla24xx_calc_iocbs(vha, tot_dsds); |
|---|
| 417 | 399 | if (req->cnt < (req_cnt + 2)) { |
|---|
| 418 | | - cnt = IS_SHADOW_REG_CAPABLE(ha) ? *req->out_ptr : |
|---|
| 419 | | - rd_reg_dword_relaxed(req->req_q_out); |
|---|
| 400 | + if (IS_SHADOW_REG_CAPABLE(ha)) { |
|---|
| 401 | + cnt = *req->out_ptr; |
|---|
| 402 | + } else { |
|---|
| 403 | + cnt = rd_reg_dword_relaxed(req->req_q_out); |
|---|
| 404 | + if (qla2x00_check_reg16_for_disconnect(vha, cnt)) |
|---|
| 405 | + goto queuing_error; |
|---|
| 406 | + } |
|---|
| 420 | 407 | |
|---|
| 421 | 408 | if (req->ring_index < cnt) |
|---|
| 422 | 409 | req->cnt = cnt - req->ring_index; |
|---|
| .. | .. |
|---|
| 553 | 540 | |
|---|
| 554 | 541 | queuing_error: |
|---|
| 555 | 542 | spin_unlock_irqrestore(&qpair->qp_lock, flags); |
|---|
| 543 | + |
|---|
| 556 | 544 | return rval; |
|---|
| 557 | 545 | } |
|---|
| 558 | 546 | |
|---|
| .. | .. |
|---|
| 607 | 595 | if (!sp) |
|---|
| 608 | 596 | return -EBUSY; |
|---|
| 609 | 597 | |
|---|
| 610 | | - init_waitqueue_head(&sp->nvme_ls_waitq); |
|---|
| 611 | 598 | kref_init(&sp->cmd_kref); |
|---|
| 612 | 599 | spin_lock_init(&priv->cmd_lock); |
|---|
| 613 | 600 | sp->priv = priv; |
|---|
| .. | .. |
|---|
| 623 | 610 | |
|---|
| 624 | 611 | rval = qla2x00_start_nvme_mq(sp); |
|---|
| 625 | 612 | if (rval != QLA_SUCCESS) { |
|---|
| 626 | | - ql_log(ql_log_warn, vha, 0x212d, |
|---|
| 613 | + ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x212d, |
|---|
| 627 | 614 | "qla2x00_start_nvme_mq failed = %d\n", rval); |
|---|
| 628 | | - wake_up(&sp->nvme_ls_waitq); |
|---|
| 629 | 615 | sp->priv = NULL; |
|---|
| 630 | 616 | priv->sp = NULL; |
|---|
| 631 | 617 | qla2xxx_rel_qpair_sp(sp->qpair, sp); |
|---|