1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * QLogic Fibre Channel HBA Driver
4 * Copyright (c) 2003-2017 QLogic Corporation
5 */
6 #include "qla_nvme.h"
7 #include <linux/scatterlist.h>
8 #include <linux/delay.h>
9 #include <linux/nvme.h>
10 #include <linux/nvme-fc.h>
11 #include <linux/blk-mq-pci.h>
12 #include <linux/blk-mq.h>
13
14 static struct nvme_fc_port_template qla_nvme_fc_transport;
15 static int qla_nvme_ls_reject_iocb(struct scsi_qla_host *vha,
16 struct qla_qpair *qp,
17 struct qla_nvme_lsrjt_pt_arg *a,
18 bool is_xchg_terminate);
19
20 struct qla_nvme_unsol_ctx {
21 struct list_head elem;
22 struct scsi_qla_host *vha;
23 struct fc_port *fcport;
24 struct srb *sp;
25 struct nvmefc_ls_rsp lsrsp;
26 struct nvmefc_ls_rsp *fd_rsp;
27 struct work_struct lsrsp_work;
28 struct work_struct abort_work;
29 __le32 exchange_address;
30 __le16 nport_handle;
31 __le16 ox_id;
32 int comp_status;
33 spinlock_t cmd_lock;
34 };
35
qla_nvme_register_remote(struct scsi_qla_host * vha,struct fc_port * fcport)36 int qla_nvme_register_remote(struct scsi_qla_host *vha, struct fc_port *fcport)
37 {
38 struct qla_nvme_rport *rport;
39 struct nvme_fc_port_info req;
40 int ret;
41
42 if (!IS_ENABLED(CONFIG_NVME_FC))
43 return 0;
44
45 if (!vha->flags.nvme_enabled) {
46 ql_log(ql_log_info, vha, 0x2100,
47 "%s: Not registering target since Host NVME is not enabled\n",
48 __func__);
49 return 0;
50 }
51
52 if (qla_nvme_register_hba(vha))
53 return 0;
54
55 if (!vha->nvme_local_port)
56 return 0;
57
58 if (!(fcport->nvme_prli_service_param &
59 (NVME_PRLI_SP_TARGET | NVME_PRLI_SP_DISCOVERY)) ||
60 (fcport->nvme_flag & NVME_FLAG_REGISTERED))
61 return 0;
62
63 fcport->nvme_flag &= ~NVME_FLAG_RESETTING;
64
65 memset(&req, 0, sizeof(struct nvme_fc_port_info));
66 req.port_name = wwn_to_u64(fcport->port_name);
67 req.node_name = wwn_to_u64(fcport->node_name);
68 req.port_role = 0;
69 req.dev_loss_tmo = fcport->dev_loss_tmo;
70
71 if (fcport->nvme_prli_service_param & NVME_PRLI_SP_INITIATOR)
72 req.port_role = FC_PORT_ROLE_NVME_INITIATOR;
73
74 if (fcport->nvme_prli_service_param & NVME_PRLI_SP_TARGET)
75 req.port_role |= FC_PORT_ROLE_NVME_TARGET;
76
77 if (fcport->nvme_prli_service_param & NVME_PRLI_SP_DISCOVERY)
78 req.port_role |= FC_PORT_ROLE_NVME_DISCOVERY;
79
80 req.port_id = fcport->d_id.b24;
81
82 ql_log(ql_log_info, vha, 0x2102,
83 "%s: traddr=nn-0x%016llx:pn-0x%016llx PortID:%06x\n",
84 __func__, req.node_name, req.port_name,
85 req.port_id);
86
87 ret = nvme_fc_register_remoteport(vha->nvme_local_port, &req,
88 &fcport->nvme_remote_port);
89 if (ret) {
90 ql_log(ql_log_warn, vha, 0x212e,
91 "Failed to register remote port. Transport returned %d\n",
92 ret);
93 return ret;
94 }
95
96 nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port,
97 fcport->dev_loss_tmo);
98
99 if (fcport->nvme_prli_service_param & NVME_PRLI_SP_SLER)
100 ql_log(ql_log_info, vha, 0x212a,
101 "PortID:%06x Supports SLER\n", req.port_id);
102
103 if (fcport->nvme_prli_service_param & NVME_PRLI_SP_PI_CTRL)
104 ql_log(ql_log_info, vha, 0x212b,
105 "PortID:%06x Supports PI control\n", req.port_id);
106
107 rport = fcport->nvme_remote_port->private;
108 rport->fcport = fcport;
109
110 fcport->nvme_flag |= NVME_FLAG_REGISTERED;
111 return 0;
112 }
113
114 /* Allocate a queue for NVMe traffic */
qla_nvme_alloc_queue(struct nvme_fc_local_port * lport,unsigned int qidx,u16 qsize,void ** handle)115 static int qla_nvme_alloc_queue(struct nvme_fc_local_port *lport,
116 unsigned int qidx, u16 qsize, void **handle)
117 {
118 struct scsi_qla_host *vha;
119 struct qla_hw_data *ha;
120 struct qla_qpair *qpair;
121
122 /* Map admin queue and 1st IO queue to index 0 */
123 if (qidx)
124 qidx--;
125
126 vha = (struct scsi_qla_host *)lport->private;
127 ha = vha->hw;
128
129 ql_log(ql_log_info, vha, 0x2104,
130 "%s: handle %p, idx =%d, qsize %d\n",
131 __func__, handle, qidx, qsize);
132
133 if (qidx > qla_nvme_fc_transport.max_hw_queues) {
134 ql_log(ql_log_warn, vha, 0x212f,
135 "%s: Illegal qidx=%d. Max=%d\n",
136 __func__, qidx, qla_nvme_fc_transport.max_hw_queues);
137 return -EINVAL;
138 }
139
140 /* Use base qpair if max_qpairs is 0 */
141 if (!ha->max_qpairs) {
142 qpair = ha->base_qpair;
143 } else {
144 if (ha->queue_pair_map[qidx]) {
145 *handle = ha->queue_pair_map[qidx];
146 ql_log(ql_log_info, vha, 0x2121,
147 "Returning existing qpair of %p for idx=%x\n",
148 *handle, qidx);
149 return 0;
150 }
151
152 qpair = qla2xxx_create_qpair(vha, 5, vha->vp_idx, true);
153 if (!qpair) {
154 ql_log(ql_log_warn, vha, 0x2122,
155 "Failed to allocate qpair\n");
156 return -EINVAL;
157 }
158 qla_adjust_iocb_limit(vha);
159 }
160 *handle = qpair;
161
162 return 0;
163 }
164
qla_nvme_release_fcp_cmd_kref(struct kref * kref)165 static void qla_nvme_release_fcp_cmd_kref(struct kref *kref)
166 {
167 struct srb *sp = container_of(kref, struct srb, cmd_kref);
168 struct nvme_private *priv = (struct nvme_private *)sp->priv;
169 struct nvmefc_fcp_req *fd;
170 struct srb_iocb *nvme;
171 unsigned long flags;
172
173 if (!priv)
174 goto out;
175
176 nvme = &sp->u.iocb_cmd;
177 fd = nvme->u.nvme.desc;
178
179 spin_lock_irqsave(&priv->cmd_lock, flags);
180 priv->sp = NULL;
181 sp->priv = NULL;
182 if (priv->comp_status == QLA_SUCCESS) {
183 fd->rcv_rsplen = le16_to_cpu(nvme->u.nvme.rsp_pyld_len);
184 fd->status = NVME_SC_SUCCESS;
185 } else {
186 fd->rcv_rsplen = 0;
187 fd->transferred_length = 0;
188 fd->status = NVME_SC_INTERNAL;
189 }
190 spin_unlock_irqrestore(&priv->cmd_lock, flags);
191
192 fd->done(fd);
193 out:
194 qla2xxx_rel_qpair_sp(sp->qpair, sp);
195 }
196
qla_nvme_release_ls_cmd_kref(struct kref * kref)197 static void qla_nvme_release_ls_cmd_kref(struct kref *kref)
198 {
199 struct srb *sp = container_of(kref, struct srb, cmd_kref);
200 struct nvme_private *priv = (struct nvme_private *)sp->priv;
201 struct nvmefc_ls_req *fd;
202 unsigned long flags;
203
204 if (!priv)
205 goto out;
206
207 spin_lock_irqsave(&priv->cmd_lock, flags);
208 priv->sp = NULL;
209 sp->priv = NULL;
210 spin_unlock_irqrestore(&priv->cmd_lock, flags);
211
212 fd = priv->fd;
213
214 fd->done(fd, priv->comp_status);
215 out:
216 qla2x00_rel_sp(sp);
217 }
218
qla_nvme_ls_complete(struct work_struct * work)219 static void qla_nvme_ls_complete(struct work_struct *work)
220 {
221 struct nvme_private *priv =
222 container_of(work, struct nvme_private, ls_work);
223
224 kref_put(&priv->sp->cmd_kref, qla_nvme_release_ls_cmd_kref);
225 }
226
qla_nvme_sp_ls_done(srb_t * sp,int res)227 static void qla_nvme_sp_ls_done(srb_t *sp, int res)
228 {
229 struct nvme_private *priv = sp->priv;
230
231 if (WARN_ON_ONCE(kref_read(&sp->cmd_kref) == 0))
232 return;
233
234 if (res)
235 res = -EINVAL;
236
237 priv->comp_status = res;
238 INIT_WORK(&priv->ls_work, qla_nvme_ls_complete);
239 schedule_work(&priv->ls_work);
240 }
241
qla_nvme_release_lsrsp_cmd_kref(struct kref * kref)242 static void qla_nvme_release_lsrsp_cmd_kref(struct kref *kref)
243 {
244 struct srb *sp = container_of(kref, struct srb, cmd_kref);
245 struct qla_nvme_unsol_ctx *uctx = sp->priv;
246 struct nvmefc_ls_rsp *fd_rsp;
247 unsigned long flags;
248
249 if (!uctx) {
250 qla2x00_rel_sp(sp);
251 return;
252 }
253
254 spin_lock_irqsave(&uctx->cmd_lock, flags);
255 uctx->sp = NULL;
256 sp->priv = NULL;
257 spin_unlock_irqrestore(&uctx->cmd_lock, flags);
258
259 fd_rsp = uctx->fd_rsp;
260
261 list_del(&uctx->elem);
262
263 fd_rsp->done(fd_rsp);
264 kfree(uctx);
265 qla2x00_rel_sp(sp);
266 }
267
qla_nvme_lsrsp_complete(struct work_struct * work)268 static void qla_nvme_lsrsp_complete(struct work_struct *work)
269 {
270 struct qla_nvme_unsol_ctx *uctx =
271 container_of(work, struct qla_nvme_unsol_ctx, lsrsp_work);
272
273 kref_put(&uctx->sp->cmd_kref, qla_nvme_release_lsrsp_cmd_kref);
274 }
275
qla_nvme_sp_lsrsp_done(srb_t * sp,int res)276 static void qla_nvme_sp_lsrsp_done(srb_t *sp, int res)
277 {
278 struct qla_nvme_unsol_ctx *uctx = sp->priv;
279
280 if (WARN_ON_ONCE(kref_read(&sp->cmd_kref) == 0))
281 return;
282
283 if (res)
284 res = -EINVAL;
285
286 uctx->comp_status = res;
287 INIT_WORK(&uctx->lsrsp_work, qla_nvme_lsrsp_complete);
288 schedule_work(&uctx->lsrsp_work);
289 }
290
291 /* it assumed that QPair lock is held. */
qla_nvme_sp_done(srb_t * sp,int res)292 static void qla_nvme_sp_done(srb_t *sp, int res)
293 {
294 struct nvme_private *priv = sp->priv;
295
296 priv->comp_status = res;
297 kref_put(&sp->cmd_kref, qla_nvme_release_fcp_cmd_kref);
298
299 return;
300 }
301
qla_nvme_abort_work(struct work_struct * work)302 static void qla_nvme_abort_work(struct work_struct *work)
303 {
304 struct nvme_private *priv =
305 container_of(work, struct nvme_private, abort_work);
306 srb_t *sp = priv->sp;
307 fc_port_t *fcport = sp->fcport;
308 struct qla_hw_data *ha = fcport->vha->hw;
309 int rval, abts_done_called = 1;
310 bool io_wait_for_abort_done;
311 uint32_t handle;
312
313 ql_dbg(ql_dbg_io, fcport->vha, 0xffff,
314 "%s called for sp=%p, hndl=%x on fcport=%p desc=%p deleted=%d\n",
315 __func__, sp, sp->handle, fcport, sp->u.iocb_cmd.u.nvme.desc, fcport->deleted);
316
317 if (!ha->flags.fw_started || fcport->deleted == QLA_SESS_DELETED)
318 goto out;
319
320 if (ha->flags.host_shutting_down) {
321 ql_log(ql_log_info, sp->fcport->vha, 0xffff,
322 "%s Calling done on sp: %p, type: 0x%x\n",
323 __func__, sp, sp->type);
324 sp->done(sp, 0);
325 goto out;
326 }
327
328 /*
329 * sp may not be valid after abort_command if return code is either
330 * SUCCESS or ERR_FROM_FW codes, so cache the value here.
331 */
332 io_wait_for_abort_done = ql2xabts_wait_nvme &&
333 QLA_ABTS_WAIT_ENABLED(sp);
334 handle = sp->handle;
335
336 rval = ha->isp_ops->abort_command(sp);
337
338 ql_dbg(ql_dbg_io, fcport->vha, 0x212b,
339 "%s: %s command for sp=%p, handle=%x on fcport=%p rval=%x\n",
340 __func__, (rval != QLA_SUCCESS) ? "Failed to abort" : "Aborted",
341 sp, handle, fcport, rval);
342
343 /*
344 * If async tmf is enabled, the abort callback is called only on
345 * return codes QLA_SUCCESS and QLA_ERR_FROM_FW.
346 */
347 if (ql2xasynctmfenable &&
348 rval != QLA_SUCCESS && rval != QLA_ERR_FROM_FW)
349 abts_done_called = 0;
350
351 /*
352 * Returned before decreasing kref so that I/O requests
353 * are waited until ABTS complete. This kref is decreased
354 * at qla24xx_abort_sp_done function.
355 */
356 if (abts_done_called && io_wait_for_abort_done)
357 return;
358 out:
359 /* kref_get was done before work was schedule. */
360 kref_put(&sp->cmd_kref, sp->put_fn);
361 }
362
qla_nvme_xmt_ls_rsp(struct nvme_fc_local_port * lport,struct nvme_fc_remote_port * rport,struct nvmefc_ls_rsp * fd_resp)363 static int qla_nvme_xmt_ls_rsp(struct nvme_fc_local_port *lport,
364 struct nvme_fc_remote_port *rport,
365 struct nvmefc_ls_rsp *fd_resp)
366 {
367 struct qla_nvme_unsol_ctx *uctx = container_of(fd_resp,
368 struct qla_nvme_unsol_ctx, lsrsp);
369 struct qla_nvme_rport *qla_rport = rport->private;
370 fc_port_t *fcport = qla_rport->fcport;
371 struct scsi_qla_host *vha = uctx->vha;
372 struct qla_hw_data *ha = vha->hw;
373 struct qla_nvme_lsrjt_pt_arg a;
374 struct srb_iocb *nvme;
375 srb_t *sp;
376 int rval = QLA_FUNCTION_FAILED;
377 uint8_t cnt = 0;
378
379 if (!fcport || fcport->deleted)
380 goto out;
381
382 if (!ha->flags.fw_started)
383 goto out;
384
385 /* Alloc SRB structure */
386 sp = qla2x00_get_sp(vha, fcport, GFP_ATOMIC);
387 if (!sp)
388 goto out;
389
390 sp->type = SRB_NVME_LS;
391 sp->name = "nvme_ls";
392 sp->done = qla_nvme_sp_lsrsp_done;
393 sp->put_fn = qla_nvme_release_lsrsp_cmd_kref;
394 sp->priv = (void *)uctx;
395 sp->unsol_rsp = 1;
396 uctx->sp = sp;
397 spin_lock_init(&uctx->cmd_lock);
398 nvme = &sp->u.iocb_cmd;
399 uctx->fd_rsp = fd_resp;
400 nvme->u.nvme.desc = fd_resp;
401 nvme->u.nvme.dir = 0;
402 nvme->u.nvme.dl = 0;
403 nvme->u.nvme.timeout_sec = 0;
404 nvme->u.nvme.cmd_dma = fd_resp->rspdma;
405 nvme->u.nvme.cmd_len = cpu_to_le32(fd_resp->rsplen);
406 nvme->u.nvme.rsp_len = 0;
407 nvme->u.nvme.rsp_dma = 0;
408 nvme->u.nvme.exchange_address = uctx->exchange_address;
409 nvme->u.nvme.nport_handle = uctx->nport_handle;
410 nvme->u.nvme.ox_id = uctx->ox_id;
411 dma_sync_single_for_device(&ha->pdev->dev, nvme->u.nvme.cmd_dma,
412 fd_resp->rsplen, DMA_TO_DEVICE);
413
414 ql_dbg(ql_dbg_unsol, vha, 0x2122,
415 "Unsol lsreq portid=%06x %8phC exchange_address 0x%x ox_id 0x%x hdl 0x%x\n",
416 fcport->d_id.b24, fcport->port_name, uctx->exchange_address,
417 uctx->ox_id, uctx->nport_handle);
418 retry:
419 rval = qla2x00_start_sp(sp);
420 switch (rval) {
421 case QLA_SUCCESS:
422 break;
423 case EAGAIN:
424 msleep(PURLS_MSLEEP_INTERVAL);
425 cnt++;
426 if (cnt < PURLS_RETRY_COUNT)
427 goto retry;
428
429 fallthrough;
430 default:
431 ql_dbg(ql_log_warn, vha, 0x2123,
432 "Failed to xmit Unsol ls response = %d\n", rval);
433 rval = -EIO;
434 qla2x00_rel_sp(sp);
435 goto out;
436 }
437
438 return 0;
439 out:
440 memset((void *)&a, 0, sizeof(a));
441 a.vp_idx = vha->vp_idx;
442 a.nport_handle = uctx->nport_handle;
443 a.xchg_address = uctx->exchange_address;
444 qla_nvme_ls_reject_iocb(vha, ha->base_qpair, &a, true);
445 kfree(uctx);
446 return rval;
447 }
448
qla_nvme_ls_abort(struct nvme_fc_local_port * lport,struct nvme_fc_remote_port * rport,struct nvmefc_ls_req * fd)449 static void qla_nvme_ls_abort(struct nvme_fc_local_port *lport,
450 struct nvme_fc_remote_port *rport, struct nvmefc_ls_req *fd)
451 {
452 struct nvme_private *priv = fd->private;
453 unsigned long flags;
454
455 spin_lock_irqsave(&priv->cmd_lock, flags);
456 if (!priv->sp) {
457 spin_unlock_irqrestore(&priv->cmd_lock, flags);
458 return;
459 }
460
461 if (!kref_get_unless_zero(&priv->sp->cmd_kref)) {
462 spin_unlock_irqrestore(&priv->cmd_lock, flags);
463 return;
464 }
465 spin_unlock_irqrestore(&priv->cmd_lock, flags);
466
467 INIT_WORK(&priv->abort_work, qla_nvme_abort_work);
468 schedule_work(&priv->abort_work);
469 }
470
qla_nvme_ls_req(struct nvme_fc_local_port * lport,struct nvme_fc_remote_port * rport,struct nvmefc_ls_req * fd)471 static int qla_nvme_ls_req(struct nvme_fc_local_port *lport,
472 struct nvme_fc_remote_port *rport, struct nvmefc_ls_req *fd)
473 {
474 struct qla_nvme_rport *qla_rport = rport->private;
475 fc_port_t *fcport = qla_rport->fcport;
476 struct srb_iocb *nvme;
477 struct nvme_private *priv = fd->private;
478 struct scsi_qla_host *vha;
479 int rval = QLA_FUNCTION_FAILED;
480 struct qla_hw_data *ha;
481 srb_t *sp;
482
483 if (!fcport || fcport->deleted)
484 return rval;
485
486 vha = fcport->vha;
487 ha = vha->hw;
488
489 if (!ha->flags.fw_started)
490 return rval;
491
492 /* Alloc SRB structure */
493 sp = qla2x00_get_sp(vha, fcport, GFP_ATOMIC);
494 if (!sp)
495 return rval;
496
497 sp->type = SRB_NVME_LS;
498 sp->name = "nvme_ls";
499 sp->done = qla_nvme_sp_ls_done;
500 sp->put_fn = qla_nvme_release_ls_cmd_kref;
501 sp->priv = priv;
502 priv->sp = sp;
503 kref_init(&sp->cmd_kref);
504 spin_lock_init(&priv->cmd_lock);
505 nvme = &sp->u.iocb_cmd;
506 priv->fd = fd;
507 nvme->u.nvme.desc = fd;
508 nvme->u.nvme.dir = 0;
509 nvme->u.nvme.dl = 0;
510 nvme->u.nvme.cmd_len = cpu_to_le32(fd->rqstlen);
511 nvme->u.nvme.rsp_len = cpu_to_le32(fd->rsplen);
512 nvme->u.nvme.rsp_dma = fd->rspdma;
513 nvme->u.nvme.timeout_sec = fd->timeout;
514 nvme->u.nvme.cmd_dma = fd->rqstdma;
515 dma_sync_single_for_device(&ha->pdev->dev, nvme->u.nvme.cmd_dma,
516 fd->rqstlen, DMA_TO_DEVICE);
517
518 rval = qla2x00_start_sp(sp);
519 if (rval != QLA_SUCCESS) {
520 ql_log(ql_log_warn, vha, 0x700e,
521 "qla2x00_start_sp failed = %d\n", rval);
522 sp->priv = NULL;
523 priv->sp = NULL;
524 qla2x00_rel_sp(sp);
525 return rval;
526 }
527
528 return rval;
529 }
530
qla_nvme_fcp_abort(struct nvme_fc_local_port * lport,struct nvme_fc_remote_port * rport,void * hw_queue_handle,struct nvmefc_fcp_req * fd)531 static void qla_nvme_fcp_abort(struct nvme_fc_local_port *lport,
532 struct nvme_fc_remote_port *rport, void *hw_queue_handle,
533 struct nvmefc_fcp_req *fd)
534 {
535 struct nvme_private *priv = fd->private;
536 unsigned long flags;
537
538 spin_lock_irqsave(&priv->cmd_lock, flags);
539 if (!priv->sp) {
540 spin_unlock_irqrestore(&priv->cmd_lock, flags);
541 return;
542 }
543 if (!kref_get_unless_zero(&priv->sp->cmd_kref)) {
544 spin_unlock_irqrestore(&priv->cmd_lock, flags);
545 return;
546 }
547 spin_unlock_irqrestore(&priv->cmd_lock, flags);
548
549 INIT_WORK(&priv->abort_work, qla_nvme_abort_work);
550 schedule_work(&priv->abort_work);
551 }
552
qla2x00_start_nvme_mq(srb_t * sp)553 static inline int qla2x00_start_nvme_mq(srb_t *sp)
554 {
555 unsigned long flags;
556 uint32_t *clr_ptr;
557 uint32_t handle;
558 struct cmd_nvme *cmd_pkt;
559 uint16_t cnt, i;
560 uint16_t req_cnt;
561 uint16_t tot_dsds;
562 uint16_t avail_dsds;
563 struct dsd64 *cur_dsd;
564 struct req_que *req = NULL;
565 struct rsp_que *rsp = NULL;
566 struct scsi_qla_host *vha = sp->fcport->vha;
567 struct qla_hw_data *ha = vha->hw;
568 struct qla_qpair *qpair = sp->qpair;
569 struct srb_iocb *nvme = &sp->u.iocb_cmd;
570 struct scatterlist *sgl, *sg;
571 struct nvmefc_fcp_req *fd = nvme->u.nvme.desc;
572 struct nvme_fc_cmd_iu *cmd = fd->cmdaddr;
573 uint32_t rval = QLA_SUCCESS;
574
575 /* Setup qpair pointers */
576 req = qpair->req;
577 rsp = qpair->rsp;
578 tot_dsds = fd->sg_cnt;
579
580 /* Acquire qpair specific lock */
581 spin_lock_irqsave(&qpair->qp_lock, flags);
582
583 handle = qla2xxx_get_next_handle(req);
584 if (handle == 0) {
585 rval = -EBUSY;
586 goto queuing_error;
587 }
588 req_cnt = qla24xx_calc_iocbs(vha, tot_dsds);
589
590 sp->iores.res_type = RESOURCE_IOCB | RESOURCE_EXCH;
591 sp->iores.exch_cnt = 1;
592 sp->iores.iocb_cnt = req_cnt;
593 if (qla_get_fw_resources(sp->qpair, &sp->iores)) {
594 rval = -EBUSY;
595 goto queuing_error;
596 }
597
598 if (req->cnt < (req_cnt + 2)) {
599 if (IS_SHADOW_REG_CAPABLE(ha)) {
600 cnt = *req->out_ptr;
601 } else {
602 cnt = rd_reg_dword_relaxed(req->req_q_out);
603 if (qla2x00_check_reg16_for_disconnect(vha, cnt)) {
604 rval = -EBUSY;
605 goto queuing_error;
606 }
607 }
608
609 if (req->ring_index < cnt)
610 req->cnt = cnt - req->ring_index;
611 else
612 req->cnt = req->length - (req->ring_index - cnt);
613
614 if (req->cnt < (req_cnt + 2)){
615 rval = -EBUSY;
616 goto queuing_error;
617 }
618 }
619
620 if (unlikely(!fd->sqid)) {
621 if (cmd->sqe.common.opcode == nvme_admin_async_event) {
622 nvme->u.nvme.aen_op = 1;
623 atomic_inc(&ha->nvme_active_aen_cnt);
624 }
625 }
626
627 /* Build command packet. */
628 req->current_outstanding_cmd = handle;
629 req->outstanding_cmds[handle] = sp;
630 sp->handle = handle;
631 req->cnt -= req_cnt;
632
633 cmd_pkt = (struct cmd_nvme *)req->ring_ptr;
634 cmd_pkt->handle = make_handle(req->id, handle);
635
636 /* Zero out remaining portion of packet. */
637 clr_ptr = (uint32_t *)cmd_pkt + 2;
638 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8);
639
640 cmd_pkt->entry_status = 0;
641
642 /* Update entry type to indicate Command NVME IOCB */
643 cmd_pkt->entry_type = COMMAND_NVME;
644
645 /* No data transfer how do we check buffer len == 0?? */
646 if (fd->io_dir == NVMEFC_FCP_READ) {
647 cmd_pkt->control_flags = cpu_to_le16(CF_READ_DATA);
648 qpair->counters.input_bytes += fd->payload_length;
649 qpair->counters.input_requests++;
650 } else if (fd->io_dir == NVMEFC_FCP_WRITE) {
651 cmd_pkt->control_flags = cpu_to_le16(CF_WRITE_DATA);
652 if ((vha->flags.nvme_first_burst) &&
653 (sp->fcport->nvme_prli_service_param &
654 NVME_PRLI_SP_FIRST_BURST)) {
655 if ((fd->payload_length <=
656 sp->fcport->nvme_first_burst_size) ||
657 (sp->fcport->nvme_first_burst_size == 0))
658 cmd_pkt->control_flags |=
659 cpu_to_le16(CF_NVME_FIRST_BURST_ENABLE);
660 }
661 qpair->counters.output_bytes += fd->payload_length;
662 qpair->counters.output_requests++;
663 } else if (fd->io_dir == 0) {
664 cmd_pkt->control_flags = 0;
665 }
666
667 if (sp->fcport->edif.enable && fd->io_dir != 0)
668 cmd_pkt->control_flags |= cpu_to_le16(CF_EN_EDIF);
669
670 /* Set BIT_13 of control flags for Async event */
671 if (vha->flags.nvme2_enabled &&
672 cmd->sqe.common.opcode == nvme_admin_async_event) {
673 cmd_pkt->control_flags |= cpu_to_le16(CF_ADMIN_ASYNC_EVENT);
674 }
675
676 /* Set NPORT-ID */
677 cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id);
678 cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa;
679 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area;
680 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain;
681 cmd_pkt->vp_index = sp->fcport->vha->vp_idx;
682
683 /* NVME RSP IU */
684 cmd_pkt->nvme_rsp_dsd_len = cpu_to_le16(fd->rsplen);
685 put_unaligned_le64(fd->rspdma, &cmd_pkt->nvme_rsp_dseg_address);
686
687 /* NVME CNMD IU */
688 cmd_pkt->nvme_cmnd_dseg_len = cpu_to_le16(fd->cmdlen);
689 cmd_pkt->nvme_cmnd_dseg_address = cpu_to_le64(fd->cmddma);
690
691 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds);
692 cmd_pkt->byte_count = cpu_to_le32(fd->payload_length);
693
694 /* One DSD is available in the Command Type NVME IOCB */
695 avail_dsds = 1;
696 cur_dsd = &cmd_pkt->nvme_dsd;
697 sgl = fd->first_sgl;
698
699 /* Load data segments */
700 for_each_sg(sgl, sg, tot_dsds, i) {
701 cont_a64_entry_t *cont_pkt;
702
703 /* Allocate additional continuation packets? */
704 if (avail_dsds == 0) {
705 /*
706 * Five DSDs are available in the Continuation
707 * Type 1 IOCB.
708 */
709
710 /* Adjust ring index */
711 req->ring_index++;
712 if (req->ring_index == req->length) {
713 req->ring_index = 0;
714 req->ring_ptr = req->ring;
715 } else {
716 req->ring_ptr++;
717 }
718 cont_pkt = (cont_a64_entry_t *)req->ring_ptr;
719 put_unaligned_le32(CONTINUE_A64_TYPE,
720 &cont_pkt->entry_type);
721
722 cur_dsd = cont_pkt->dsd;
723 avail_dsds = ARRAY_SIZE(cont_pkt->dsd);
724 }
725
726 append_dsd64(&cur_dsd, sg);
727 avail_dsds--;
728 }
729
730 /* Set total entry count. */
731 cmd_pkt->entry_count = (uint8_t)req_cnt;
732 wmb();
733
734 /* Adjust ring index. */
735 req->ring_index++;
736 if (req->ring_index == req->length) {
737 req->ring_index = 0;
738 req->ring_ptr = req->ring;
739 } else {
740 req->ring_ptr++;
741 }
742
743 /* ignore nvme async cmd due to long timeout */
744 if (!nvme->u.nvme.aen_op)
745 sp->qpair->cmd_cnt++;
746
747 /* Set chip new ring index. */
748 wrt_reg_dword(req->req_q_in, req->ring_index);
749
750 if (vha->flags.process_response_queue &&
751 rsp->ring_ptr->signature != RESPONSE_PROCESSED)
752 qla24xx_process_response_queue(vha, rsp);
753
754 queuing_error:
755 if (rval)
756 qla_put_fw_resources(sp->qpair, &sp->iores);
757 spin_unlock_irqrestore(&qpair->qp_lock, flags);
758
759 return rval;
760 }
761
762 /* Post a command */
qla_nvme_post_cmd(struct nvme_fc_local_port * lport,struct nvme_fc_remote_port * rport,void * hw_queue_handle,struct nvmefc_fcp_req * fd)763 static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport,
764 struct nvme_fc_remote_port *rport, void *hw_queue_handle,
765 struct nvmefc_fcp_req *fd)
766 {
767 fc_port_t *fcport;
768 struct srb_iocb *nvme;
769 struct scsi_qla_host *vha;
770 struct qla_hw_data *ha;
771 int rval;
772 srb_t *sp;
773 struct qla_qpair *qpair = hw_queue_handle;
774 struct nvme_private *priv = fd->private;
775 struct qla_nvme_rport *qla_rport = rport->private;
776
777 if (!priv) {
778 /* nvme association has been torn down */
779 return -ENODEV;
780 }
781
782 fcport = qla_rport->fcport;
783
784 if (unlikely(!qpair || !fcport || fcport->deleted))
785 return -EBUSY;
786
787 if (!(fcport->nvme_flag & NVME_FLAG_REGISTERED))
788 return -ENODEV;
789
790 vha = fcport->vha;
791 ha = vha->hw;
792
793 if (test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags))
794 return -EBUSY;
795
796 /*
797 * If we know the dev is going away while the transport is still sending
798 * IO's return busy back to stall the IO Q. This happens when the
799 * link goes away and fw hasn't notified us yet, but IO's are being
800 * returned. If the dev comes back quickly we won't exhaust the IO
801 * retry count at the core.
802 */
803 if (fcport->nvme_flag & NVME_FLAG_RESETTING)
804 return -EBUSY;
805
806 qpair = qla_mapq_nvme_select_qpair(ha, qpair);
807
808 /* Alloc SRB structure */
809 sp = qla2xxx_get_qpair_sp(vha, qpair, fcport, GFP_ATOMIC);
810 if (!sp)
811 return -EBUSY;
812
813 kref_init(&sp->cmd_kref);
814 spin_lock_init(&priv->cmd_lock);
815 sp->priv = priv;
816 priv->sp = sp;
817 sp->type = SRB_NVME_CMD;
818 sp->name = "nvme_cmd";
819 sp->done = qla_nvme_sp_done;
820 sp->put_fn = qla_nvme_release_fcp_cmd_kref;
821 sp->qpair = qpair;
822 sp->vha = vha;
823 sp->cmd_sp = sp;
824 nvme = &sp->u.iocb_cmd;
825 nvme->u.nvme.desc = fd;
826
827 rval = qla2x00_start_nvme_mq(sp);
828 if (rval != QLA_SUCCESS) {
829 ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x212d,
830 "qla2x00_start_nvme_mq failed = %d\n", rval);
831 sp->priv = NULL;
832 priv->sp = NULL;
833 qla2xxx_rel_qpair_sp(sp->qpair, sp);
834 }
835
836 return rval;
837 }
838
qla_nvme_map_queues(struct nvme_fc_local_port * lport,struct blk_mq_queue_map * map)839 static void qla_nvme_map_queues(struct nvme_fc_local_port *lport,
840 struct blk_mq_queue_map *map)
841 {
842 struct scsi_qla_host *vha = lport->private;
843
844 blk_mq_pci_map_queues(map, vha->hw->pdev, vha->irq_offset);
845 }
846
qla_nvme_localport_delete(struct nvme_fc_local_port * lport)847 static void qla_nvme_localport_delete(struct nvme_fc_local_port *lport)
848 {
849 struct scsi_qla_host *vha = lport->private;
850
851 ql_log(ql_log_info, vha, 0x210f,
852 "localport delete of %p completed.\n", vha->nvme_local_port);
853 vha->nvme_local_port = NULL;
854 complete(&vha->nvme_del_done);
855 }
856
qla_nvme_remoteport_delete(struct nvme_fc_remote_port * rport)857 static void qla_nvme_remoteport_delete(struct nvme_fc_remote_port *rport)
858 {
859 fc_port_t *fcport;
860 struct qla_nvme_rport *qla_rport = rport->private;
861
862 fcport = qla_rport->fcport;
863 fcport->nvme_remote_port = NULL;
864 fcport->nvme_flag &= ~NVME_FLAG_REGISTERED;
865 fcport->nvme_flag &= ~NVME_FLAG_DELETING;
866 ql_log(ql_log_info, fcport->vha, 0x2110,
867 "remoteport_delete of %p %8phN completed.\n",
868 fcport, fcport->port_name);
869 complete(&fcport->nvme_del_done);
870 }
871
872 static struct nvme_fc_port_template qla_nvme_fc_transport = {
873 .localport_delete = qla_nvme_localport_delete,
874 .remoteport_delete = qla_nvme_remoteport_delete,
875 .create_queue = qla_nvme_alloc_queue,
876 .delete_queue = NULL,
877 .ls_req = qla_nvme_ls_req,
878 .ls_abort = qla_nvme_ls_abort,
879 .fcp_io = qla_nvme_post_cmd,
880 .fcp_abort = qla_nvme_fcp_abort,
881 .xmt_ls_rsp = qla_nvme_xmt_ls_rsp,
882 .map_queues = qla_nvme_map_queues,
883 .max_hw_queues = DEF_NVME_HW_QUEUES,
884 .max_sgl_segments = 1024,
885 .max_dif_sgl_segments = 64,
886 .dma_boundary = 0xFFFFFFFF,
887 .local_priv_sz = 8,
888 .remote_priv_sz = sizeof(struct qla_nvme_rport),
889 .lsrqst_priv_sz = sizeof(struct nvme_private),
890 .fcprqst_priv_sz = sizeof(struct nvme_private),
891 };
892
qla_nvme_unregister_remote_port(struct fc_port * fcport)893 void qla_nvme_unregister_remote_port(struct fc_port *fcport)
894 {
895 int ret;
896
897 if (!IS_ENABLED(CONFIG_NVME_FC))
898 return;
899
900 ql_log(ql_log_warn, fcport->vha, 0x2112,
901 "%s: unregister remoteport on %p %8phN\n",
902 __func__, fcport, fcport->port_name);
903
904 if (test_bit(PFLG_DRIVER_REMOVING, &fcport->vha->pci_flags))
905 nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0);
906
907 init_completion(&fcport->nvme_del_done);
908 ret = nvme_fc_unregister_remoteport(fcport->nvme_remote_port);
909 if (ret)
910 ql_log(ql_log_info, fcport->vha, 0x2114,
911 "%s: Failed to unregister nvme_remote_port (%d)\n",
912 __func__, ret);
913 wait_for_completion(&fcport->nvme_del_done);
914 }
915
qla_nvme_delete(struct scsi_qla_host * vha)916 void qla_nvme_delete(struct scsi_qla_host *vha)
917 {
918 int nv_ret;
919
920 if (!IS_ENABLED(CONFIG_NVME_FC))
921 return;
922
923 if (vha->nvme_local_port) {
924 init_completion(&vha->nvme_del_done);
925 ql_log(ql_log_info, vha, 0x2116,
926 "unregister localport=%p\n",
927 vha->nvme_local_port);
928 nv_ret = nvme_fc_unregister_localport(vha->nvme_local_port);
929 if (nv_ret)
930 ql_log(ql_log_info, vha, 0x2115,
931 "Unregister of localport failed\n");
932 else
933 wait_for_completion(&vha->nvme_del_done);
934 }
935 }
936
qla_nvme_register_hba(struct scsi_qla_host * vha)937 int qla_nvme_register_hba(struct scsi_qla_host *vha)
938 {
939 struct nvme_fc_port_template *tmpl;
940 struct qla_hw_data *ha;
941 struct nvme_fc_port_info pinfo;
942 int ret = -EINVAL;
943
944 if (!IS_ENABLED(CONFIG_NVME_FC))
945 return ret;
946
947 ha = vha->hw;
948 tmpl = &qla_nvme_fc_transport;
949
950 if (ql2xnvme_queues < MIN_NVME_HW_QUEUES) {
951 ql_log(ql_log_warn, vha, 0xfffd,
952 "ql2xnvme_queues=%d is lower than minimum queues: %d. Resetting ql2xnvme_queues to:%d\n",
953 ql2xnvme_queues, MIN_NVME_HW_QUEUES, DEF_NVME_HW_QUEUES);
954 ql2xnvme_queues = DEF_NVME_HW_QUEUES;
955 } else if (ql2xnvme_queues > (ha->max_qpairs - 1)) {
956 ql_log(ql_log_warn, vha, 0xfffd,
957 "ql2xnvme_queues=%d is greater than available IRQs: %d. Resetting ql2xnvme_queues to: %d\n",
958 ql2xnvme_queues, (ha->max_qpairs - 1),
959 (ha->max_qpairs - 1));
960 ql2xnvme_queues = ((ha->max_qpairs - 1));
961 }
962
963 qla_nvme_fc_transport.max_hw_queues =
964 min((uint8_t)(ql2xnvme_queues),
965 (uint8_t)((ha->max_qpairs - 1) ? (ha->max_qpairs - 1) : 1));
966
967 ql_log(ql_log_info, vha, 0xfffb,
968 "Number of NVME queues used for this port: %d\n",
969 qla_nvme_fc_transport.max_hw_queues);
970
971 pinfo.node_name = wwn_to_u64(vha->node_name);
972 pinfo.port_name = wwn_to_u64(vha->port_name);
973 pinfo.port_role = FC_PORT_ROLE_NVME_INITIATOR;
974 pinfo.port_id = vha->d_id.b24;
975
976 mutex_lock(&ha->vport_lock);
977 /*
978 * Check again for nvme_local_port to see if any other thread raced
979 * with this one and finished registration.
980 */
981 if (!vha->nvme_local_port) {
982 ql_log(ql_log_info, vha, 0xffff,
983 "register_localport: host-traddr=nn-0x%llx:pn-0x%llx on portID:%x\n",
984 pinfo.node_name, pinfo.port_name, pinfo.port_id);
985 qla_nvme_fc_transport.dma_boundary = vha->host->dma_boundary;
986
987 ret = nvme_fc_register_localport(&pinfo, tmpl,
988 get_device(&ha->pdev->dev),
989 &vha->nvme_local_port);
990 mutex_unlock(&ha->vport_lock);
991 } else {
992 mutex_unlock(&ha->vport_lock);
993 return 0;
994 }
995 if (ret) {
996 ql_log(ql_log_warn, vha, 0xffff,
997 "register_localport failed: ret=%x\n", ret);
998 } else {
999 vha->nvme_local_port->private = vha;
1000 }
1001
1002 return ret;
1003 }
1004
qla_nvme_abort_set_option(struct abort_entry_24xx * abt,srb_t * orig_sp)1005 void qla_nvme_abort_set_option(struct abort_entry_24xx *abt, srb_t *orig_sp)
1006 {
1007 struct qla_hw_data *ha;
1008
1009 if (!(ql2xabts_wait_nvme && QLA_ABTS_WAIT_ENABLED(orig_sp)))
1010 return;
1011
1012 ha = orig_sp->fcport->vha->hw;
1013
1014 WARN_ON_ONCE(abt->options & cpu_to_le16(BIT_0));
1015 /* Use Driver Specified Retry Count */
1016 abt->options |= cpu_to_le16(AOF_ABTS_RTY_CNT);
1017 abt->drv.abts_rty_cnt = cpu_to_le16(2);
1018 /* Use specified response timeout */
1019 abt->options |= cpu_to_le16(AOF_RSP_TIMEOUT);
1020 /* set it to 2 * r_a_tov in secs */
1021 abt->drv.rsp_timeout = cpu_to_le16(2 * (ha->r_a_tov / 10));
1022 }
1023
qla_nvme_abort_process_comp_status(struct abort_entry_24xx * abt,srb_t * orig_sp)1024 void qla_nvme_abort_process_comp_status(struct abort_entry_24xx *abt, srb_t *orig_sp)
1025 {
1026 u16 comp_status;
1027 struct scsi_qla_host *vha;
1028
1029 if (!(ql2xabts_wait_nvme && QLA_ABTS_WAIT_ENABLED(orig_sp)))
1030 return;
1031
1032 vha = orig_sp->fcport->vha;
1033
1034 comp_status = le16_to_cpu(abt->comp_status);
1035 switch (comp_status) {
1036 case CS_RESET: /* reset event aborted */
1037 case CS_ABORTED: /* IOCB was cleaned */
1038 /* N_Port handle is not currently logged in */
1039 case CS_TIMEOUT:
1040 /* N_Port handle was logged out while waiting for ABTS to complete */
1041 case CS_PORT_UNAVAILABLE:
1042 /* Firmware found that the port name changed */
1043 case CS_PORT_LOGGED_OUT:
1044 /* BA_RJT was received for the ABTS */
1045 case CS_PORT_CONFIG_CHG:
1046 ql_dbg(ql_dbg_async, vha, 0xf09d,
1047 "Abort I/O IOCB completed with error, comp_status=%x\n",
1048 comp_status);
1049 break;
1050
1051 /* BA_RJT was received for the ABTS */
1052 case CS_REJECT_RECEIVED:
1053 ql_dbg(ql_dbg_async, vha, 0xf09e,
1054 "BA_RJT was received for the ABTS rjt_vendorUnique = %u",
1055 abt->fw.ba_rjt_vendorUnique);
1056 ql_dbg(ql_dbg_async + ql_dbg_mbx, vha, 0xf09e,
1057 "ba_rjt_reasonCodeExpl = %u, ba_rjt_reasonCode = %u\n",
1058 abt->fw.ba_rjt_reasonCodeExpl, abt->fw.ba_rjt_reasonCode);
1059 break;
1060
1061 case CS_COMPLETE:
1062 ql_dbg(ql_dbg_async + ql_dbg_verbose, vha, 0xf09f,
1063 "IOCB request is completed successfully comp_status=%x\n",
1064 comp_status);
1065 break;
1066
1067 case CS_IOCB_ERROR:
1068 ql_dbg(ql_dbg_async, vha, 0xf0a0,
1069 "IOCB request is failed, comp_status=%x\n", comp_status);
1070 break;
1071
1072 default:
1073 ql_dbg(ql_dbg_async, vha, 0xf0a1,
1074 "Invalid Abort IO IOCB Completion Status %x\n",
1075 comp_status);
1076 break;
1077 }
1078 }
1079
qla_wait_nvme_release_cmd_kref(srb_t * orig_sp)1080 inline void qla_wait_nvme_release_cmd_kref(srb_t *orig_sp)
1081 {
1082 if (!(ql2xabts_wait_nvme && QLA_ABTS_WAIT_ENABLED(orig_sp)))
1083 return;
1084 kref_put(&orig_sp->cmd_kref, orig_sp->put_fn);
1085 }
1086
qla_nvme_fc_format_rjt(void * buf,u8 ls_cmd,u8 reason,u8 explanation,u8 vendor)1087 static void qla_nvme_fc_format_rjt(void *buf, u8 ls_cmd, u8 reason,
1088 u8 explanation, u8 vendor)
1089 {
1090 struct fcnvme_ls_rjt *rjt = buf;
1091
1092 rjt->w0.ls_cmd = FCNVME_LSDESC_RQST;
1093 rjt->desc_list_len = fcnvme_lsdesc_len(sizeof(struct fcnvme_ls_rjt));
1094 rjt->rqst.desc_tag = cpu_to_be32(FCNVME_LSDESC_RQST);
1095 rjt->rqst.desc_len =
1096 fcnvme_lsdesc_len(sizeof(struct fcnvme_lsdesc_rqst));
1097 rjt->rqst.w0.ls_cmd = ls_cmd;
1098 rjt->rjt.desc_tag = cpu_to_be32(FCNVME_LSDESC_RJT);
1099 rjt->rjt.desc_len = fcnvme_lsdesc_len(sizeof(struct fcnvme_lsdesc_rjt));
1100 rjt->rjt.reason_code = reason;
1101 rjt->rjt.reason_explanation = explanation;
1102 rjt->rjt.vendor = vendor;
1103 }
1104
qla_nvme_lsrjt_pt_iocb(struct scsi_qla_host * vha,struct pt_ls4_request * lsrjt_iocb,struct qla_nvme_lsrjt_pt_arg * a)1105 static void qla_nvme_lsrjt_pt_iocb(struct scsi_qla_host *vha,
1106 struct pt_ls4_request *lsrjt_iocb,
1107 struct qla_nvme_lsrjt_pt_arg *a)
1108 {
1109 lsrjt_iocb->entry_type = PT_LS4_REQUEST;
1110 lsrjt_iocb->entry_count = 1;
1111 lsrjt_iocb->sys_define = 0;
1112 lsrjt_iocb->entry_status = 0;
1113 lsrjt_iocb->handle = QLA_SKIP_HANDLE;
1114 lsrjt_iocb->nport_handle = a->nport_handle;
1115 lsrjt_iocb->exchange_address = a->xchg_address;
1116 lsrjt_iocb->vp_index = a->vp_idx;
1117
1118 lsrjt_iocb->control_flags = cpu_to_le16(a->control_flags);
1119
1120 put_unaligned_le64(a->tx_addr, &lsrjt_iocb->dsd[0].address);
1121 lsrjt_iocb->dsd[0].length = cpu_to_le32(a->tx_byte_count);
1122 lsrjt_iocb->tx_dseg_count = cpu_to_le16(1);
1123 lsrjt_iocb->tx_byte_count = cpu_to_le32(a->tx_byte_count);
1124
1125 put_unaligned_le64(a->rx_addr, &lsrjt_iocb->dsd[1].address);
1126 lsrjt_iocb->dsd[1].length = 0;
1127 lsrjt_iocb->rx_dseg_count = 0;
1128 lsrjt_iocb->rx_byte_count = 0;
1129 }
1130
1131 static int
qla_nvme_ls_reject_iocb(struct scsi_qla_host * vha,struct qla_qpair * qp,struct qla_nvme_lsrjt_pt_arg * a,bool is_xchg_terminate)1132 qla_nvme_ls_reject_iocb(struct scsi_qla_host *vha, struct qla_qpair *qp,
1133 struct qla_nvme_lsrjt_pt_arg *a, bool is_xchg_terminate)
1134 {
1135 struct pt_ls4_request *lsrjt_iocb;
1136
1137 lsrjt_iocb = __qla2x00_alloc_iocbs(qp, NULL);
1138 if (!lsrjt_iocb) {
1139 ql_log(ql_log_warn, vha, 0x210e,
1140 "qla2x00_alloc_iocbs failed.\n");
1141 return QLA_FUNCTION_FAILED;
1142 }
1143
1144 if (!is_xchg_terminate) {
1145 qla_nvme_fc_format_rjt((void *)vha->hw->lsrjt.c, a->opcode,
1146 a->reason, a->explanation, 0);
1147
1148 a->tx_byte_count = sizeof(struct fcnvme_ls_rjt);
1149 a->tx_addr = vha->hw->lsrjt.cdma;
1150 a->control_flags = CF_LS4_RESPONDER << CF_LS4_SHIFT;
1151
1152 ql_dbg(ql_dbg_unsol, vha, 0x211f,
1153 "Sending nvme fc ls reject ox_id %04x op %04x\n",
1154 a->ox_id, a->opcode);
1155 ql_dump_buffer(ql_dbg_unsol + ql_dbg_verbose, vha, 0x210f,
1156 vha->hw->lsrjt.c, sizeof(*vha->hw->lsrjt.c));
1157 } else {
1158 a->tx_byte_count = 0;
1159 a->control_flags = CF_LS4_RESPONDER_TERM << CF_LS4_SHIFT;
1160 ql_dbg(ql_dbg_unsol, vha, 0x2110,
1161 "Terminate nvme ls xchg 0x%x\n", a->xchg_address);
1162 }
1163
1164 qla_nvme_lsrjt_pt_iocb(vha, lsrjt_iocb, a);
1165 /* flush iocb to mem before notifying hw doorbell */
1166 wmb();
1167 qla2x00_start_iocbs(vha, qp->req);
1168 return 0;
1169 }
1170
1171 /*
1172 * qla2xxx_process_purls_pkt() - Pass-up Unsolicited
1173 * Received FC-NVMe Link Service pkt to nvme_fc_rcv_ls_req().
1174 * LLDD need to provide memory for response buffer, which
1175 * will be used to reference the exchange corresponding
1176 * to the LS when issuing an ls response. LLDD will have to free
1177 * response buffer in lport->ops->xmt_ls_rsp().
1178 *
1179 * @vha: SCSI qla host
1180 * @item: ptr to purex_item
1181 */
1182 static void
qla2xxx_process_purls_pkt(struct scsi_qla_host * vha,struct purex_item * item)1183 qla2xxx_process_purls_pkt(struct scsi_qla_host *vha, struct purex_item *item)
1184 {
1185 struct qla_nvme_unsol_ctx *uctx = item->purls_context;
1186 struct qla_nvme_lsrjt_pt_arg a;
1187 int ret = 1;
1188
1189 #if (IS_ENABLED(CONFIG_NVME_FC))
1190 ret = nvme_fc_rcv_ls_req(uctx->fcport->nvme_remote_port, &uctx->lsrsp,
1191 &item->iocb, item->size);
1192 #endif
1193 if (ret) {
1194 ql_dbg(ql_dbg_unsol, vha, 0x2125, "NVMe transport ls_req failed\n");
1195 memset((void *)&a, 0, sizeof(a));
1196 a.vp_idx = vha->vp_idx;
1197 a.nport_handle = uctx->nport_handle;
1198 a.xchg_address = uctx->exchange_address;
1199 qla_nvme_ls_reject_iocb(vha, vha->hw->base_qpair, &a, true);
1200 list_del(&uctx->elem);
1201 kfree(uctx);
1202 }
1203 }
1204
1205 static scsi_qla_host_t *
qla2xxx_get_vha_from_vp_idx(struct qla_hw_data * ha,uint16_t vp_index)1206 qla2xxx_get_vha_from_vp_idx(struct qla_hw_data *ha, uint16_t vp_index)
1207 {
1208 scsi_qla_host_t *base_vha, *vha, *tvp;
1209 unsigned long flags;
1210
1211 base_vha = pci_get_drvdata(ha->pdev);
1212
1213 if (!vp_index && !ha->num_vhosts)
1214 return base_vha;
1215
1216 spin_lock_irqsave(&ha->vport_slock, flags);
1217 list_for_each_entry_safe(vha, tvp, &ha->vp_list, list) {
1218 if (vha->vp_idx == vp_index) {
1219 spin_unlock_irqrestore(&ha->vport_slock, flags);
1220 return vha;
1221 }
1222 }
1223 spin_unlock_irqrestore(&ha->vport_slock, flags);
1224
1225 return NULL;
1226 }
1227
qla2xxx_process_purls_iocb(void ** pkt,struct rsp_que ** rsp)1228 void qla2xxx_process_purls_iocb(void **pkt, struct rsp_que **rsp)
1229 {
1230 struct nvme_fc_remote_port *rport;
1231 struct qla_nvme_rport *qla_rport;
1232 struct qla_nvme_lsrjt_pt_arg a;
1233 struct pt_ls4_rx_unsol *p = *pkt;
1234 struct qla_nvme_unsol_ctx *uctx;
1235 struct rsp_que *rsp_q = *rsp;
1236 struct qla_hw_data *ha;
1237 scsi_qla_host_t *vha;
1238 fc_port_t *fcport = NULL;
1239 struct purex_item *item;
1240 port_id_t d_id = {0};
1241 port_id_t id = {0};
1242 u8 *opcode;
1243 bool xmt_reject = false;
1244
1245 ha = rsp_q->hw;
1246
1247 vha = qla2xxx_get_vha_from_vp_idx(ha, p->vp_index);
1248 if (!vha) {
1249 ql_log(ql_log_warn, NULL, 0x2110, "Invalid vp index %d\n", p->vp_index);
1250 WARN_ON_ONCE(1);
1251 return;
1252 }
1253
1254 memset((void *)&a, 0, sizeof(a));
1255 opcode = (u8 *)&p->payload[0];
1256 a.opcode = opcode[3];
1257 a.vp_idx = p->vp_index;
1258 a.nport_handle = p->nport_handle;
1259 a.ox_id = p->ox_id;
1260 a.xchg_address = p->exchange_address;
1261
1262 id.b.domain = p->s_id.domain;
1263 id.b.area = p->s_id.area;
1264 id.b.al_pa = p->s_id.al_pa;
1265 d_id.b.domain = p->d_id[2];
1266 d_id.b.area = p->d_id[1];
1267 d_id.b.al_pa = p->d_id[0];
1268
1269 fcport = qla2x00_find_fcport_by_nportid(vha, &id, 0);
1270 if (!fcport) {
1271 ql_dbg(ql_dbg_unsol, vha, 0x211e,
1272 "Failed to find sid=%06x did=%06x\n",
1273 id.b24, d_id.b24);
1274 a.reason = FCNVME_RJT_RC_INV_ASSOC;
1275 a.explanation = FCNVME_RJT_EXP_NONE;
1276 xmt_reject = true;
1277 goto out;
1278 }
1279 rport = fcport->nvme_remote_port;
1280 qla_rport = rport->private;
1281
1282 item = qla27xx_copy_multiple_pkt(vha, pkt, rsp, true, false);
1283 if (!item) {
1284 a.reason = FCNVME_RJT_RC_LOGIC;
1285 a.explanation = FCNVME_RJT_EXP_NONE;
1286 xmt_reject = true;
1287 goto out;
1288 }
1289
1290 uctx = kzalloc(sizeof(*uctx), GFP_ATOMIC);
1291 if (!uctx) {
1292 ql_log(ql_log_info, vha, 0x2126, "Failed allocate memory\n");
1293 a.reason = FCNVME_RJT_RC_LOGIC;
1294 a.explanation = FCNVME_RJT_EXP_NONE;
1295 xmt_reject = true;
1296 kfree(item);
1297 goto out;
1298 }
1299
1300 uctx->vha = vha;
1301 uctx->fcport = fcport;
1302 uctx->exchange_address = p->exchange_address;
1303 uctx->nport_handle = p->nport_handle;
1304 uctx->ox_id = p->ox_id;
1305 qla_rport->uctx = uctx;
1306 INIT_LIST_HEAD(&uctx->elem);
1307 list_add_tail(&uctx->elem, &fcport->unsol_ctx_head);
1308 item->purls_context = (void *)uctx;
1309
1310 ql_dbg(ql_dbg_unsol, vha, 0x2121,
1311 "PURLS OP[%01x] size %d xchg addr 0x%x portid %06x\n",
1312 item->iocb.iocb[3], item->size, uctx->exchange_address,
1313 fcport->d_id.b24);
1314 /* +48 0 1 2 3 4 5 6 7 8 9 A B C D E F
1315 * ----- -----------------------------------------------
1316 * 0000: 00 00 00 05 28 00 00 00 07 00 00 00 08 00 00 00
1317 * 0010: ab ec 0f cc 00 00 8d 7d 05 00 00 00 10 00 00 00
1318 * 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1319 */
1320 ql_dump_buffer(ql_dbg_unsol + ql_dbg_verbose, vha, 0x2120,
1321 &item->iocb, item->size);
1322
1323 qla24xx_queue_purex_item(vha, item, qla2xxx_process_purls_pkt);
1324 out:
1325 if (xmt_reject) {
1326 qla_nvme_ls_reject_iocb(vha, (*rsp)->qpair, &a, false);
1327 __qla_consume_iocb(vha, pkt, rsp);
1328 }
1329 }
1330