hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/scsi/qla2xxx/qla_nvme.c
....@@ -165,18 +165,6 @@
165165 qla2xxx_rel_qpair_sp(sp->qpair, sp);
166166 }
167167
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
-
180168 static void qla_nvme_release_ls_cmd_kref(struct kref *kref)
181169 {
182170 struct srb *sp = container_of(kref, struct srb, cmd_kref);
....@@ -194,7 +182,6 @@
194182
195183 fd = priv->fd;
196184
197
- qla_nvme_ls_unmap(sp, fd);
198185 fd->done(fd, priv->comp_status);
199186 out:
200187 qla2x00_rel_sp(sp);
....@@ -336,21 +323,16 @@
336323 nvme->u.nvme.rsp_len = fd->rsplen;
337324 nvme->u.nvme.rsp_dma = fd->rspdma;
338325 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;
341327 dma_sync_single_for_device(&ha->pdev->dev, nvme->u.nvme.cmd_dma,
342328 fd->rqstlen, DMA_TO_DEVICE);
343
-
344
- sp->flags |= SRB_DMA_VALID;
345329
346330 rval = qla2x00_start_sp(sp);
347331 if (rval != QLA_SUCCESS) {
348332 ql_log(ql_log_warn, vha, 0x700e,
349333 "qla2x00_start_sp failed = %d\n", rval);
350
- wake_up(&sp->nvme_ls_waitq);
351334 sp->priv = NULL;
352335 priv->sp = NULL;
353
- qla_nvme_ls_unmap(sp, fd);
354336 qla2x00_rel_sp(sp);
355337 return rval;
356338 }
....@@ -415,8 +397,13 @@
415397 }
416398 req_cnt = qla24xx_calc_iocbs(vha, tot_dsds);
417399 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
+ }
420407
421408 if (req->ring_index < cnt)
422409 req->cnt = cnt - req->ring_index;
....@@ -553,6 +540,7 @@
553540
554541 queuing_error:
555542 spin_unlock_irqrestore(&qpair->qp_lock, flags);
543
+
556544 return rval;
557545 }
558546
....@@ -607,7 +595,6 @@
607595 if (!sp)
608596 return -EBUSY;
609597
610
- init_waitqueue_head(&sp->nvme_ls_waitq);
611598 kref_init(&sp->cmd_kref);
612599 spin_lock_init(&priv->cmd_lock);
613600 sp->priv = priv;
....@@ -623,9 +610,8 @@
623610
624611 rval = qla2x00_start_nvme_mq(sp);
625612 if (rval != QLA_SUCCESS) {
626
- ql_log(ql_log_warn, vha, 0x212d,
613
+ ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x212d,
627614 "qla2x00_start_nvme_mq failed = %d\n", rval);
628
- wake_up(&sp->nvme_ls_waitq);
629615 sp->priv = NULL;
630616 priv->sp = NULL;
631617 qla2xxx_rel_qpair_sp(sp->qpair, sp);