.. | .. |
---|
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); |
---|