1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/pci.h>
24#include <linux/slab.h>
25#include <linux/interrupt.h>
26#include <linux/export.h>
27#include <linux/delay.h>
28#include <asm/unaligned.h>
29#include <linux/t10-pi.h>
30#include <linux/crc-t10dif.h>
31#include <net/checksum.h>
32
33#include <scsi/scsi.h>
34#include <scsi/scsi_device.h>
35#include <scsi/scsi_eh.h>
36#include <scsi/scsi_host.h>
37#include <scsi/scsi_tcq.h>
38#include <scsi/scsi_transport_fc.h>
39
40#include "lpfc_version.h"
41#include "lpfc_hw4.h"
42#include "lpfc_hw.h"
43#include "lpfc_sli.h"
44#include "lpfc_sli4.h"
45#include "lpfc_nl.h"
46#include "lpfc_disc.h"
47#include "lpfc.h"
48#include "lpfc_scsi.h"
49#include "lpfc_logmsg.h"
50#include "lpfc_crtn.h"
51#include "lpfc_vport.h"
52
53#define LPFC_RESET_WAIT 2
54#define LPFC_ABORT_WAIT 2
55
56int _dump_buf_done = 1;
57
58static char *dif_op_str[] = {
59 "PROT_NORMAL",
60 "PROT_READ_INSERT",
61 "PROT_WRITE_STRIP",
62 "PROT_READ_STRIP",
63 "PROT_WRITE_INSERT",
64 "PROT_READ_PASS",
65 "PROT_WRITE_PASS",
66};
67
68struct scsi_dif_tuple {
69 __be16 guard_tag;
70 __be16 app_tag;
71 __be32 ref_tag;
72};
73
74static struct lpfc_rport_data *
75lpfc_rport_data_from_scsi_device(struct scsi_device *sdev)
76{
77 struct lpfc_vport *vport = (struct lpfc_vport *)sdev->host->hostdata;
78
79 if (vport->phba->cfg_fof)
80 return ((struct lpfc_device_data *)sdev->hostdata)->rport_data;
81 else
82 return (struct lpfc_rport_data *)sdev->hostdata;
83}
84
85static void
86lpfc_release_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *psb);
87static void
88lpfc_release_scsi_buf_s3(struct lpfc_hba *phba, struct lpfc_scsi_buf *psb);
89static int
90lpfc_prot_group_type(struct lpfc_hba *phba, struct scsi_cmnd *sc);
91
92static void
93lpfc_debug_save_data(struct lpfc_hba *phba, struct scsi_cmnd *cmnd)
94{
95 void *src, *dst;
96 struct scatterlist *sgde = scsi_sglist(cmnd);
97
98 if (!_dump_buf_data) {
99 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
100 "9050 BLKGRD: ERROR %s _dump_buf_data is NULL\n",
101 __func__);
102 return;
103 }
104
105
106 if (!sgde) {
107 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
108 "9051 BLKGRD: ERROR: data scatterlist is null\n");
109 return;
110 }
111
112 dst = (void *) _dump_buf_data;
113 while (sgde) {
114 src = sg_virt(sgde);
115 memcpy(dst, src, sgde->length);
116 dst += sgde->length;
117 sgde = sg_next(sgde);
118 }
119}
120
121static void
122lpfc_debug_save_dif(struct lpfc_hba *phba, struct scsi_cmnd *cmnd)
123{
124 void *src, *dst;
125 struct scatterlist *sgde = scsi_prot_sglist(cmnd);
126
127 if (!_dump_buf_dif) {
128 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
129 "9052 BLKGRD: ERROR %s _dump_buf_data is NULL\n",
130 __func__);
131 return;
132 }
133
134 if (!sgde) {
135 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
136 "9053 BLKGRD: ERROR: prot scatterlist is null\n");
137 return;
138 }
139
140 dst = _dump_buf_dif;
141 while (sgde) {
142 src = sg_virt(sgde);
143 memcpy(dst, src, sgde->length);
144 dst += sgde->length;
145 sgde = sg_next(sgde);
146 }
147}
148
149static inline unsigned
150lpfc_cmd_blksize(struct scsi_cmnd *sc)
151{
152 return sc->device->sector_size;
153}
154
155#define LPFC_CHECK_PROTECT_GUARD 1
156#define LPFC_CHECK_PROTECT_REF 2
157static inline unsigned
158lpfc_cmd_protect(struct scsi_cmnd *sc, int flag)
159{
160 return 1;
161}
162
163static inline unsigned
164lpfc_cmd_guard_csum(struct scsi_cmnd *sc)
165{
166 if (lpfc_prot_group_type(NULL, sc) == LPFC_PG_TYPE_NO_DIF)
167 return 0;
168 if (scsi_host_get_guard(sc->device->host) == SHOST_DIX_GUARD_IP)
169 return 1;
170 return 0;
171}
172
173
174
175
176
177
178
179
180
181static void
182lpfc_sli4_set_rsp_sgl_last(struct lpfc_hba *phba,
183 struct lpfc_scsi_buf *lpfc_cmd)
184{
185 struct sli4_sge *sgl = (struct sli4_sge *)lpfc_cmd->fcp_bpl;
186 if (sgl) {
187 sgl += 1;
188 sgl->word2 = le32_to_cpu(sgl->word2);
189 bf_set(lpfc_sli4_sge_last, sgl, 1);
190 sgl->word2 = cpu_to_le32(sgl->word2);
191 }
192}
193
194
195
196
197
198
199
200
201
202static void
203lpfc_update_stats(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
204{
205 struct lpfc_rport_data *rdata = lpfc_cmd->rdata;
206 struct lpfc_nodelist *pnode = rdata->pnode;
207 struct scsi_cmnd *cmd = lpfc_cmd->pCmd;
208 unsigned long flags;
209 struct Scsi_Host *shost = cmd->device->host;
210 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
211 unsigned long latency;
212 int i;
213
214 if (cmd->result)
215 return;
216
217 latency = jiffies_to_msecs((long)jiffies - (long)lpfc_cmd->start_time);
218
219 spin_lock_irqsave(shost->host_lock, flags);
220 if (!vport->stat_data_enabled ||
221 vport->stat_data_blocked ||
222 !pnode ||
223 !pnode->lat_data ||
224 (phba->bucket_type == LPFC_NO_BUCKET)) {
225 spin_unlock_irqrestore(shost->host_lock, flags);
226 return;
227 }
228
229 if (phba->bucket_type == LPFC_LINEAR_BUCKET) {
230 i = (latency + phba->bucket_step - 1 - phba->bucket_base)/
231 phba->bucket_step;
232
233 if (i < 0)
234 i = 0;
235 else if (i >= LPFC_MAX_BUCKET_COUNT)
236 i = LPFC_MAX_BUCKET_COUNT - 1;
237 } else {
238 for (i = 0; i < LPFC_MAX_BUCKET_COUNT-1; i++)
239 if (latency <= (phba->bucket_base +
240 ((1<<i)*phba->bucket_step)))
241 break;
242 }
243
244 pnode->lat_data[i].cmd_count++;
245 spin_unlock_irqrestore(shost->host_lock, flags);
246}
247
248
249
250
251
252
253
254
255
256
257
258
259void
260lpfc_rampdown_queue_depth(struct lpfc_hba *phba)
261{
262 unsigned long flags;
263 uint32_t evt_posted;
264 unsigned long expires;
265
266 spin_lock_irqsave(&phba->hbalock, flags);
267 atomic_inc(&phba->num_rsrc_err);
268 phba->last_rsrc_error_time = jiffies;
269
270 expires = phba->last_ramp_down_time + QUEUE_RAMP_DOWN_INTERVAL;
271 if (time_after(expires, jiffies)) {
272 spin_unlock_irqrestore(&phba->hbalock, flags);
273 return;
274 }
275
276 phba->last_ramp_down_time = jiffies;
277
278 spin_unlock_irqrestore(&phba->hbalock, flags);
279
280 spin_lock_irqsave(&phba->pport->work_port_lock, flags);
281 evt_posted = phba->pport->work_port_events & WORKER_RAMP_DOWN_QUEUE;
282 if (!evt_posted)
283 phba->pport->work_port_events |= WORKER_RAMP_DOWN_QUEUE;
284 spin_unlock_irqrestore(&phba->pport->work_port_lock, flags);
285
286 if (!evt_posted)
287 lpfc_worker_wake_up(phba);
288 return;
289}
290
291
292
293
294
295
296
297
298
299void
300lpfc_ramp_down_queue_handler(struct lpfc_hba *phba)
301{
302 struct lpfc_vport **vports;
303 struct Scsi_Host *shost;
304 struct scsi_device *sdev;
305 unsigned long new_queue_depth;
306 unsigned long num_rsrc_err, num_cmd_success;
307 int i;
308
309 num_rsrc_err = atomic_read(&phba->num_rsrc_err);
310 num_cmd_success = atomic_read(&phba->num_cmd_success);
311
312
313
314
315
316
317 if (num_rsrc_err == 0)
318 return;
319
320 vports = lpfc_create_vport_work_array(phba);
321 if (vports != NULL)
322 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
323 shost = lpfc_shost_from_vport(vports[i]);
324 shost_for_each_device(sdev, shost) {
325 new_queue_depth =
326 sdev->queue_depth * num_rsrc_err /
327 (num_rsrc_err + num_cmd_success);
328 if (!new_queue_depth)
329 new_queue_depth = sdev->queue_depth - 1;
330 else
331 new_queue_depth = sdev->queue_depth -
332 new_queue_depth;
333 scsi_change_queue_depth(sdev, new_queue_depth);
334 }
335 }
336 lpfc_destroy_vport_work_array(phba, vports);
337 atomic_set(&phba->num_rsrc_err, 0);
338 atomic_set(&phba->num_cmd_success, 0);
339}
340
341
342
343
344
345
346
347
348
349void
350lpfc_scsi_dev_block(struct lpfc_hba *phba)
351{
352 struct lpfc_vport **vports;
353 struct Scsi_Host *shost;
354 struct scsi_device *sdev;
355 struct fc_rport *rport;
356 int i;
357
358 vports = lpfc_create_vport_work_array(phba);
359 if (vports != NULL)
360 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
361 shost = lpfc_shost_from_vport(vports[i]);
362 shost_for_each_device(sdev, shost) {
363 rport = starget_to_rport(scsi_target(sdev));
364 fc_remote_port_delete(rport);
365 }
366 }
367 lpfc_destroy_vport_work_array(phba, vports);
368}
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386static int
387lpfc_new_scsi_buf_s3(struct lpfc_vport *vport, int num_to_alloc)
388{
389 struct lpfc_hba *phba = vport->phba;
390 struct lpfc_scsi_buf *psb;
391 struct ulp_bde64 *bpl;
392 IOCB_t *iocb;
393 dma_addr_t pdma_phys_fcp_cmd;
394 dma_addr_t pdma_phys_fcp_rsp;
395 dma_addr_t pdma_phys_bpl;
396 uint16_t iotag;
397 int bcnt, bpl_size;
398
399 bpl_size = phba->cfg_sg_dma_buf_size -
400 (sizeof(struct fcp_cmnd) + sizeof(struct fcp_rsp));
401
402 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
403 "9067 ALLOC %d scsi_bufs: %d (%d + %d + %d)\n",
404 num_to_alloc, phba->cfg_sg_dma_buf_size,
405 (int)sizeof(struct fcp_cmnd),
406 (int)sizeof(struct fcp_rsp), bpl_size);
407
408 for (bcnt = 0; bcnt < num_to_alloc; bcnt++) {
409 psb = kzalloc(sizeof(struct lpfc_scsi_buf), GFP_KERNEL);
410 if (!psb)
411 break;
412
413
414
415
416
417
418
419 psb->data = dma_pool_zalloc(phba->lpfc_sg_dma_buf_pool,
420 GFP_KERNEL, &psb->dma_handle);
421 if (!psb->data) {
422 kfree(psb);
423 break;
424 }
425
426
427
428 iotag = lpfc_sli_next_iotag(phba, &psb->cur_iocbq);
429 if (iotag == 0) {
430 dma_pool_free(phba->lpfc_sg_dma_buf_pool,
431 psb->data, psb->dma_handle);
432 kfree(psb);
433 break;
434 }
435 psb->cur_iocbq.iocb_flag |= LPFC_IO_FCP;
436
437 psb->fcp_cmnd = psb->data;
438 psb->fcp_rsp = psb->data + sizeof(struct fcp_cmnd);
439 psb->fcp_bpl = psb->data + sizeof(struct fcp_cmnd) +
440 sizeof(struct fcp_rsp);
441
442
443 bpl = psb->fcp_bpl;
444 pdma_phys_fcp_cmd = psb->dma_handle;
445 pdma_phys_fcp_rsp = psb->dma_handle + sizeof(struct fcp_cmnd);
446 pdma_phys_bpl = psb->dma_handle + sizeof(struct fcp_cmnd) +
447 sizeof(struct fcp_rsp);
448
449
450
451
452
453
454 bpl[0].addrHigh = le32_to_cpu(putPaddrHigh(pdma_phys_fcp_cmd));
455 bpl[0].addrLow = le32_to_cpu(putPaddrLow(pdma_phys_fcp_cmd));
456 bpl[0].tus.f.bdeSize = sizeof(struct fcp_cmnd);
457 bpl[0].tus.f.bdeFlags = BUFF_TYPE_BDE_64;
458 bpl[0].tus.w = le32_to_cpu(bpl[0].tus.w);
459
460
461 bpl[1].addrHigh = le32_to_cpu(putPaddrHigh(pdma_phys_fcp_rsp));
462 bpl[1].addrLow = le32_to_cpu(putPaddrLow(pdma_phys_fcp_rsp));
463 bpl[1].tus.f.bdeSize = sizeof(struct fcp_rsp);
464 bpl[1].tus.f.bdeFlags = BUFF_TYPE_BDE_64;
465 bpl[1].tus.w = le32_to_cpu(bpl[1].tus.w);
466
467
468
469
470
471 iocb = &psb->cur_iocbq.iocb;
472 iocb->un.fcpi64.bdl.ulpIoTag32 = 0;
473 if ((phba->sli_rev == 3) &&
474 !(phba->sli3_options & LPFC_SLI3_BG_ENABLED)) {
475
476 iocb->un.fcpi64.bdl.bdeFlags = BUFF_TYPE_BDE_IMMED;
477 iocb->un.fcpi64.bdl.bdeSize = sizeof(struct fcp_cmnd);
478 iocb->un.fcpi64.bdl.addrLow = offsetof(IOCB_t,
479 unsli3.fcp_ext.icd);
480 iocb->un.fcpi64.bdl.addrHigh = 0;
481 iocb->ulpBdeCount = 0;
482 iocb->ulpLe = 0;
483
484 iocb->unsli3.fcp_ext.rbde.tus.f.bdeFlags =
485 BUFF_TYPE_BDE_64;
486 iocb->unsli3.fcp_ext.rbde.tus.f.bdeSize =
487 sizeof(struct fcp_rsp);
488 iocb->unsli3.fcp_ext.rbde.addrLow =
489 putPaddrLow(pdma_phys_fcp_rsp);
490 iocb->unsli3.fcp_ext.rbde.addrHigh =
491 putPaddrHigh(pdma_phys_fcp_rsp);
492 } else {
493 iocb->un.fcpi64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
494 iocb->un.fcpi64.bdl.bdeSize =
495 (2 * sizeof(struct ulp_bde64));
496 iocb->un.fcpi64.bdl.addrLow =
497 putPaddrLow(pdma_phys_bpl);
498 iocb->un.fcpi64.bdl.addrHigh =
499 putPaddrHigh(pdma_phys_bpl);
500 iocb->ulpBdeCount = 1;
501 iocb->ulpLe = 1;
502 }
503 iocb->ulpClass = CLASS3;
504 psb->status = IOSTAT_SUCCESS;
505
506 psb->cur_iocbq.context1 = psb;
507 lpfc_release_scsi_buf_s3(phba, psb);
508
509 }
510
511 return bcnt;
512}
513
514
515
516
517
518
519
520
521void
522lpfc_sli4_vport_delete_fcp_xri_aborted(struct lpfc_vport *vport)
523{
524 struct lpfc_hba *phba = vport->phba;
525 struct lpfc_scsi_buf *psb, *next_psb;
526 unsigned long iflag = 0;
527
528 if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP))
529 return;
530 spin_lock_irqsave(&phba->hbalock, iflag);
531 spin_lock(&phba->sli4_hba.abts_scsi_buf_list_lock);
532 list_for_each_entry_safe(psb, next_psb,
533 &phba->sli4_hba.lpfc_abts_scsi_buf_list, list) {
534 if (psb->rdata && psb->rdata->pnode
535 && psb->rdata->pnode->vport == vport)
536 psb->rdata = NULL;
537 }
538 spin_unlock(&phba->sli4_hba.abts_scsi_buf_list_lock);
539 spin_unlock_irqrestore(&phba->hbalock, iflag);
540}
541
542
543
544
545
546
547
548
549
550void
551lpfc_sli4_fcp_xri_aborted(struct lpfc_hba *phba,
552 struct sli4_wcqe_xri_aborted *axri)
553{
554 uint16_t xri = bf_get(lpfc_wcqe_xa_xri, axri);
555 uint16_t rxid = bf_get(lpfc_wcqe_xa_remote_xid, axri);
556 struct lpfc_scsi_buf *psb, *next_psb;
557 unsigned long iflag = 0;
558 struct lpfc_iocbq *iocbq;
559 int i;
560 struct lpfc_nodelist *ndlp;
561 int rrq_empty = 0;
562 struct lpfc_sli_ring *pring = phba->sli4_hba.els_wq->pring;
563
564 if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP))
565 return;
566 spin_lock_irqsave(&phba->hbalock, iflag);
567 spin_lock(&phba->sli4_hba.abts_scsi_buf_list_lock);
568 list_for_each_entry_safe(psb, next_psb,
569 &phba->sli4_hba.lpfc_abts_scsi_buf_list, list) {
570 if (psb->cur_iocbq.sli4_xritag == xri) {
571 list_del(&psb->list);
572 psb->exch_busy = 0;
573 psb->status = IOSTAT_SUCCESS;
574 spin_unlock(
575 &phba->sli4_hba.abts_scsi_buf_list_lock);
576 if (psb->rdata && psb->rdata->pnode)
577 ndlp = psb->rdata->pnode;
578 else
579 ndlp = NULL;
580
581 rrq_empty = list_empty(&phba->active_rrq_list);
582 spin_unlock_irqrestore(&phba->hbalock, iflag);
583 if (ndlp) {
584 lpfc_set_rrq_active(phba, ndlp,
585 psb->cur_iocbq.sli4_lxritag, rxid, 1);
586 lpfc_sli4_abts_err_handler(phba, ndlp, axri);
587 }
588 lpfc_release_scsi_buf_s4(phba, psb);
589 if (rrq_empty)
590 lpfc_worker_wake_up(phba);
591 return;
592 }
593 }
594 spin_unlock(&phba->sli4_hba.abts_scsi_buf_list_lock);
595 for (i = 1; i <= phba->sli.last_iotag; i++) {
596 iocbq = phba->sli.iocbq_lookup[i];
597
598 if (!(iocbq->iocb_flag & LPFC_IO_FCP) ||
599 (iocbq->iocb_flag & LPFC_IO_LIBDFC))
600 continue;
601 if (iocbq->sli4_xritag != xri)
602 continue;
603 psb = container_of(iocbq, struct lpfc_scsi_buf, cur_iocbq);
604 psb->exch_busy = 0;
605 spin_unlock_irqrestore(&phba->hbalock, iflag);
606 if (!list_empty(&pring->txq))
607 lpfc_worker_wake_up(phba);
608 return;
609
610 }
611 spin_unlock_irqrestore(&phba->hbalock, iflag);
612}
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628static int
629lpfc_sli4_post_scsi_sgl_list(struct lpfc_hba *phba,
630 struct list_head *post_sblist, int sb_count)
631{
632 struct lpfc_scsi_buf *psb, *psb_next;
633 int status, sgl_size;
634 int post_cnt = 0, block_cnt = 0, num_posting = 0, num_posted = 0;
635 dma_addr_t pdma_phys_bpl1;
636 int last_xritag = NO_XRI;
637 LIST_HEAD(prep_sblist);
638 LIST_HEAD(blck_sblist);
639 LIST_HEAD(scsi_sblist);
640
641
642 if (sb_count <= 0)
643 return -EINVAL;
644
645 sgl_size = phba->cfg_sg_dma_buf_size -
646 (sizeof(struct fcp_cmnd) + sizeof(struct fcp_rsp));
647
648 list_for_each_entry_safe(psb, psb_next, post_sblist, list) {
649 list_del_init(&psb->list);
650 block_cnt++;
651 if ((last_xritag != NO_XRI) &&
652 (psb->cur_iocbq.sli4_xritag != last_xritag + 1)) {
653
654 list_splice_init(&prep_sblist, &blck_sblist);
655 post_cnt = block_cnt - 1;
656
657 list_add_tail(&psb->list, &prep_sblist);
658 block_cnt = 1;
659 } else {
660
661 list_add_tail(&psb->list, &prep_sblist);
662
663 if (block_cnt == LPFC_NEMBED_MBOX_SGL_CNT) {
664 list_splice_init(&prep_sblist, &blck_sblist);
665 post_cnt = block_cnt;
666 block_cnt = 0;
667 }
668 }
669 num_posting++;
670 last_xritag = psb->cur_iocbq.sli4_xritag;
671
672
673 if (num_posting == sb_count) {
674 if (post_cnt == 0) {
675
676 list_splice_init(&prep_sblist, &blck_sblist);
677 post_cnt = block_cnt;
678 } else if (block_cnt == 1) {
679
680 if (sgl_size > SGL_PAGE_SIZE)
681 pdma_phys_bpl1 = psb->dma_phys_bpl +
682 SGL_PAGE_SIZE;
683 else
684 pdma_phys_bpl1 = 0;
685 status = lpfc_sli4_post_sgl(phba,
686 psb->dma_phys_bpl,
687 pdma_phys_bpl1,
688 psb->cur_iocbq.sli4_xritag);
689 if (status) {
690
691 psb->exch_busy = 1;
692 } else {
693
694 psb->exch_busy = 0;
695 psb->status = IOSTAT_SUCCESS;
696 num_posted++;
697 }
698
699 list_add_tail(&psb->list, &scsi_sblist);
700 }
701 }
702
703
704 if (post_cnt == 0)
705 continue;
706
707
708 status = lpfc_sli4_post_scsi_sgl_block(phba, &blck_sblist,
709 post_cnt);
710
711
712 if (block_cnt == 0)
713 last_xritag = NO_XRI;
714
715
716 post_cnt = 0;
717
718
719 while (!list_empty(&blck_sblist)) {
720 list_remove_head(&blck_sblist, psb,
721 struct lpfc_scsi_buf, list);
722 if (status) {
723
724 psb->exch_busy = 1;
725 } else {
726
727 psb->exch_busy = 0;
728 psb->status = IOSTAT_SUCCESS;
729 num_posted++;
730 }
731 list_add_tail(&psb->list, &scsi_sblist);
732 }
733 }
734
735 while (!list_empty(&scsi_sblist)) {
736 list_remove_head(&scsi_sblist, psb,
737 struct lpfc_scsi_buf, list);
738 lpfc_release_scsi_buf_s4(phba, psb);
739 }
740 return num_posted;
741}
742
743
744
745
746
747
748
749
750
751
752
753
754
755int
756lpfc_sli4_repost_scsi_sgl_list(struct lpfc_hba *phba)
757{
758 LIST_HEAD(post_sblist);
759 int num_posted, rc = 0;
760
761
762 spin_lock_irq(&phba->scsi_buf_list_get_lock);
763 spin_lock(&phba->scsi_buf_list_put_lock);
764 list_splice_init(&phba->lpfc_scsi_buf_list_get, &post_sblist);
765 list_splice(&phba->lpfc_scsi_buf_list_put, &post_sblist);
766 spin_unlock(&phba->scsi_buf_list_put_lock);
767 spin_unlock_irq(&phba->scsi_buf_list_get_lock);
768
769
770 if (!list_empty(&post_sblist)) {
771 num_posted = lpfc_sli4_post_scsi_sgl_list(phba, &post_sblist,
772 phba->sli4_hba.scsi_xri_cnt);
773
774 if (num_posted == 0)
775 rc = -EIO;
776 }
777 return rc;
778}
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794static int
795lpfc_new_scsi_buf_s4(struct lpfc_vport *vport, int num_to_alloc)
796{
797 struct lpfc_hba *phba = vport->phba;
798 struct lpfc_scsi_buf *psb;
799 struct sli4_sge *sgl;
800 IOCB_t *iocb;
801 dma_addr_t pdma_phys_fcp_cmd;
802 dma_addr_t pdma_phys_fcp_rsp;
803 dma_addr_t pdma_phys_bpl;
804 uint16_t iotag, lxri = 0;
805 int bcnt, num_posted, sgl_size;
806 LIST_HEAD(prep_sblist);
807 LIST_HEAD(post_sblist);
808 LIST_HEAD(scsi_sblist);
809
810 sgl_size = phba->cfg_sg_dma_buf_size -
811 (sizeof(struct fcp_cmnd) + sizeof(struct fcp_rsp));
812
813 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
814 "9068 ALLOC %d scsi_bufs: %d (%d + %d + %d)\n",
815 num_to_alloc, phba->cfg_sg_dma_buf_size, sgl_size,
816 (int)sizeof(struct fcp_cmnd),
817 (int)sizeof(struct fcp_rsp));
818
819 for (bcnt = 0; bcnt < num_to_alloc; bcnt++) {
820 psb = kzalloc(sizeof(struct lpfc_scsi_buf), GFP_KERNEL);
821 if (!psb)
822 break;
823
824
825
826
827
828
829 psb->data = dma_pool_zalloc(phba->lpfc_sg_dma_buf_pool,
830 GFP_KERNEL, &psb->dma_handle);
831 if (!psb->data) {
832 kfree(psb);
833 break;
834 }
835
836
837
838
839
840 if (phba->cfg_enable_bg && (((unsigned long)(psb->data) &
841 (unsigned long)(SLI4_PAGE_SIZE - 1)) != 0)) {
842 dma_pool_free(phba->lpfc_sg_dma_buf_pool,
843 psb->data, psb->dma_handle);
844 kfree(psb);
845 break;
846 }
847
848
849 lxri = lpfc_sli4_next_xritag(phba);
850 if (lxri == NO_XRI) {
851 dma_pool_free(phba->lpfc_sg_dma_buf_pool,
852 psb->data, psb->dma_handle);
853 kfree(psb);
854 break;
855 }
856
857
858 iotag = lpfc_sli_next_iotag(phba, &psb->cur_iocbq);
859 if (iotag == 0) {
860 dma_pool_free(phba->lpfc_sg_dma_buf_pool,
861 psb->data, psb->dma_handle);
862 kfree(psb);
863 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
864 "3368 Failed to allocate IOTAG for"
865 " XRI:0x%x\n", lxri);
866 lpfc_sli4_free_xri(phba, lxri);
867 break;
868 }
869 psb->cur_iocbq.sli4_lxritag = lxri;
870 psb->cur_iocbq.sli4_xritag = phba->sli4_hba.xri_ids[lxri];
871 psb->cur_iocbq.iocb_flag |= LPFC_IO_FCP;
872 psb->fcp_bpl = psb->data;
873 psb->fcp_cmnd = (psb->data + sgl_size);
874 psb->fcp_rsp = (struct fcp_rsp *)((uint8_t *)psb->fcp_cmnd +
875 sizeof(struct fcp_cmnd));
876
877
878 sgl = (struct sli4_sge *)psb->fcp_bpl;
879 pdma_phys_bpl = psb->dma_handle;
880 pdma_phys_fcp_cmd = (psb->dma_handle + sgl_size);
881 pdma_phys_fcp_rsp = pdma_phys_fcp_cmd + sizeof(struct fcp_cmnd);
882
883
884
885
886
887
888 sgl->addr_hi = cpu_to_le32(putPaddrHigh(pdma_phys_fcp_cmd));
889 sgl->addr_lo = cpu_to_le32(putPaddrLow(pdma_phys_fcp_cmd));
890 sgl->word2 = le32_to_cpu(sgl->word2);
891 bf_set(lpfc_sli4_sge_last, sgl, 0);
892 sgl->word2 = cpu_to_le32(sgl->word2);
893 sgl->sge_len = cpu_to_le32(sizeof(struct fcp_cmnd));
894 sgl++;
895
896
897 sgl->addr_hi = cpu_to_le32(putPaddrHigh(pdma_phys_fcp_rsp));
898 sgl->addr_lo = cpu_to_le32(putPaddrLow(pdma_phys_fcp_rsp));
899 sgl->word2 = le32_to_cpu(sgl->word2);
900 bf_set(lpfc_sli4_sge_last, sgl, 1);
901 sgl->word2 = cpu_to_le32(sgl->word2);
902 sgl->sge_len = cpu_to_le32(sizeof(struct fcp_rsp));
903
904
905
906
907
908 iocb = &psb->cur_iocbq.iocb;
909 iocb->un.fcpi64.bdl.ulpIoTag32 = 0;
910 iocb->un.fcpi64.bdl.bdeFlags = BUFF_TYPE_BDE_64;
911
912
913
914
915 iocb->un.fcpi64.bdl.bdeSize = sizeof(struct fcp_cmnd);
916 iocb->un.fcpi64.bdl.addrLow = putPaddrLow(pdma_phys_fcp_cmd);
917 iocb->un.fcpi64.bdl.addrHigh = putPaddrHigh(pdma_phys_fcp_cmd);
918 iocb->ulpBdeCount = 1;
919 iocb->ulpLe = 1;
920 iocb->ulpClass = CLASS3;
921 psb->cur_iocbq.context1 = psb;
922 psb->dma_phys_bpl = pdma_phys_bpl;
923
924
925 list_add_tail(&psb->list, &post_sblist);
926 spin_lock_irq(&phba->scsi_buf_list_get_lock);
927 phba->sli4_hba.scsi_xri_cnt++;
928 spin_unlock_irq(&phba->scsi_buf_list_get_lock);
929 }
930 lpfc_printf_log(phba, KERN_INFO, LOG_BG | LOG_FCP,
931 "3021 Allocate %d out of %d requested new SCSI "
932 "buffers\n", bcnt, num_to_alloc);
933
934
935 if (!list_empty(&post_sblist))
936 num_posted = lpfc_sli4_post_scsi_sgl_list(phba,
937 &post_sblist, bcnt);
938 else
939 num_posted = 0;
940
941 return num_posted;
942}
943
944
945
946
947
948
949
950
951
952
953
954
955
956static inline int
957lpfc_new_scsi_buf(struct lpfc_vport *vport, int num_to_alloc)
958{
959 return vport->phba->lpfc_new_scsi_buf(vport, num_to_alloc);
960}
961
962
963
964
965
966
967
968
969
970
971
972
973static struct lpfc_scsi_buf*
974lpfc_get_scsi_buf_s3(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
975{
976 struct lpfc_scsi_buf * lpfc_cmd = NULL;
977 struct list_head *scsi_buf_list_get = &phba->lpfc_scsi_buf_list_get;
978 unsigned long iflag = 0;
979
980 spin_lock_irqsave(&phba->scsi_buf_list_get_lock, iflag);
981 list_remove_head(scsi_buf_list_get, lpfc_cmd, struct lpfc_scsi_buf,
982 list);
983 if (!lpfc_cmd) {
984 spin_lock(&phba->scsi_buf_list_put_lock);
985 list_splice(&phba->lpfc_scsi_buf_list_put,
986 &phba->lpfc_scsi_buf_list_get);
987 INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list_put);
988 list_remove_head(scsi_buf_list_get, lpfc_cmd,
989 struct lpfc_scsi_buf, list);
990 spin_unlock(&phba->scsi_buf_list_put_lock);
991 }
992 spin_unlock_irqrestore(&phba->scsi_buf_list_get_lock, iflag);
993 return lpfc_cmd;
994}
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006static struct lpfc_scsi_buf*
1007lpfc_get_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
1008{
1009 struct lpfc_scsi_buf *lpfc_cmd, *lpfc_cmd_next;
1010 unsigned long iflag = 0;
1011 int found = 0;
1012
1013 spin_lock_irqsave(&phba->scsi_buf_list_get_lock, iflag);
1014 list_for_each_entry_safe(lpfc_cmd, lpfc_cmd_next,
1015 &phba->lpfc_scsi_buf_list_get, list) {
1016 if (lpfc_test_rrq_active(phba, ndlp,
1017 lpfc_cmd->cur_iocbq.sli4_lxritag))
1018 continue;
1019 list_del(&lpfc_cmd->list);
1020 found = 1;
1021 break;
1022 }
1023 if (!found) {
1024 spin_lock(&phba->scsi_buf_list_put_lock);
1025 list_splice(&phba->lpfc_scsi_buf_list_put,
1026 &phba->lpfc_scsi_buf_list_get);
1027 INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list_put);
1028 spin_unlock(&phba->scsi_buf_list_put_lock);
1029 list_for_each_entry_safe(lpfc_cmd, lpfc_cmd_next,
1030 &phba->lpfc_scsi_buf_list_get, list) {
1031 if (lpfc_test_rrq_active(
1032 phba, ndlp, lpfc_cmd->cur_iocbq.sli4_lxritag))
1033 continue;
1034 list_del(&lpfc_cmd->list);
1035 found = 1;
1036 break;
1037 }
1038 }
1039 spin_unlock_irqrestore(&phba->scsi_buf_list_get_lock, iflag);
1040 if (!found)
1041 return NULL;
1042 return lpfc_cmd;
1043}
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055static struct lpfc_scsi_buf*
1056lpfc_get_scsi_buf(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp)
1057{
1058 return phba->lpfc_get_scsi_buf(phba, ndlp);
1059}
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069static void
1070lpfc_release_scsi_buf_s3(struct lpfc_hba *phba, struct lpfc_scsi_buf *psb)
1071{
1072 unsigned long iflag = 0;
1073
1074 psb->seg_cnt = 0;
1075 psb->nonsg_phys = 0;
1076 psb->prot_seg_cnt = 0;
1077
1078 spin_lock_irqsave(&phba->scsi_buf_list_put_lock, iflag);
1079 psb->pCmd = NULL;
1080 psb->cur_iocbq.iocb_flag = LPFC_IO_FCP;
1081 list_add_tail(&psb->list, &phba->lpfc_scsi_buf_list_put);
1082 spin_unlock_irqrestore(&phba->scsi_buf_list_put_lock, iflag);
1083}
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095static void
1096lpfc_release_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *psb)
1097{
1098 unsigned long iflag = 0;
1099
1100 psb->seg_cnt = 0;
1101 psb->nonsg_phys = 0;
1102 psb->prot_seg_cnt = 0;
1103
1104 if (psb->exch_busy) {
1105 spin_lock_irqsave(&phba->sli4_hba.abts_scsi_buf_list_lock,
1106 iflag);
1107 psb->pCmd = NULL;
1108 list_add_tail(&psb->list,
1109 &phba->sli4_hba.lpfc_abts_scsi_buf_list);
1110 spin_unlock_irqrestore(&phba->sli4_hba.abts_scsi_buf_list_lock,
1111 iflag);
1112 } else {
1113 psb->pCmd = NULL;
1114 psb->cur_iocbq.iocb_flag = LPFC_IO_FCP;
1115 spin_lock_irqsave(&phba->scsi_buf_list_put_lock, iflag);
1116 list_add_tail(&psb->list, &phba->lpfc_scsi_buf_list_put);
1117 spin_unlock_irqrestore(&phba->scsi_buf_list_put_lock, iflag);
1118 }
1119}
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129static void
1130lpfc_release_scsi_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *psb)
1131{
1132
1133 phba->lpfc_release_scsi_buf(phba, psb);
1134}
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150static int
1151lpfc_scsi_prep_dma_buf_s3(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
1152{
1153 struct scsi_cmnd *scsi_cmnd = lpfc_cmd->pCmd;
1154 struct scatterlist *sgel = NULL;
1155 struct fcp_cmnd *fcp_cmnd = lpfc_cmd->fcp_cmnd;
1156 struct ulp_bde64 *bpl = lpfc_cmd->fcp_bpl;
1157 struct lpfc_iocbq *iocbq = &lpfc_cmd->cur_iocbq;
1158 IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;
1159 struct ulp_bde64 *data_bde = iocb_cmd->unsli3.fcp_ext.dbde;
1160 dma_addr_t physaddr;
1161 uint32_t num_bde = 0;
1162 int nseg, datadir = scsi_cmnd->sc_data_direction;
1163
1164
1165
1166
1167
1168
1169
1170 bpl += 2;
1171 if (scsi_sg_count(scsi_cmnd)) {
1172
1173
1174
1175
1176
1177
1178
1179 nseg = dma_map_sg(&phba->pcidev->dev, scsi_sglist(scsi_cmnd),
1180 scsi_sg_count(scsi_cmnd), datadir);
1181 if (unlikely(!nseg))
1182 return 1;
1183
1184 lpfc_cmd->seg_cnt = nseg;
1185 if (lpfc_cmd->seg_cnt > phba->cfg_sg_seg_cnt) {
1186 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1187 "9064 BLKGRD: %s: Too many sg segments from "
1188 "dma_map_sg. Config %d, seg_cnt %d\n",
1189 __func__, phba->cfg_sg_seg_cnt,
1190 lpfc_cmd->seg_cnt);
1191 lpfc_cmd->seg_cnt = 0;
1192 scsi_dma_unmap(scsi_cmnd);
1193 return 1;
1194 }
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205 scsi_for_each_sg(scsi_cmnd, sgel, nseg, num_bde) {
1206 physaddr = sg_dma_address(sgel);
1207 if (phba->sli_rev == 3 &&
1208 !(phba->sli3_options & LPFC_SLI3_BG_ENABLED) &&
1209 !(iocbq->iocb_flag & DSS_SECURITY_OP) &&
1210 nseg <= LPFC_EXT_DATA_BDE_COUNT) {
1211 data_bde->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
1212 data_bde->tus.f.bdeSize = sg_dma_len(sgel);
1213 data_bde->addrLow = putPaddrLow(physaddr);
1214 data_bde->addrHigh = putPaddrHigh(physaddr);
1215 data_bde++;
1216 } else {
1217 bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
1218 bpl->tus.f.bdeSize = sg_dma_len(sgel);
1219 bpl->tus.w = le32_to_cpu(bpl->tus.w);
1220 bpl->addrLow =
1221 le32_to_cpu(putPaddrLow(physaddr));
1222 bpl->addrHigh =
1223 le32_to_cpu(putPaddrHigh(physaddr));
1224 bpl++;
1225 }
1226 }
1227 }
1228
1229
1230
1231
1232
1233
1234
1235 if (phba->sli_rev == 3 &&
1236 !(phba->sli3_options & LPFC_SLI3_BG_ENABLED) &&
1237 !(iocbq->iocb_flag & DSS_SECURITY_OP)) {
1238 if (num_bde > LPFC_EXT_DATA_BDE_COUNT) {
1239
1240
1241
1242
1243
1244 physaddr = lpfc_cmd->dma_handle;
1245 data_bde->tus.f.bdeFlags = BUFF_TYPE_BLP_64;
1246 data_bde->tus.f.bdeSize = (num_bde *
1247 sizeof(struct ulp_bde64));
1248 physaddr += (sizeof(struct fcp_cmnd) +
1249 sizeof(struct fcp_rsp) +
1250 (2 * sizeof(struct ulp_bde64)));
1251 data_bde->addrHigh = putPaddrHigh(physaddr);
1252 data_bde->addrLow = putPaddrLow(physaddr);
1253
1254 iocb_cmd->unsli3.fcp_ext.ebde_count = 2;
1255 } else {
1256
1257 iocb_cmd->unsli3.fcp_ext.ebde_count = (num_bde + 1);
1258 }
1259 } else {
1260 iocb_cmd->un.fcpi64.bdl.bdeSize =
1261 ((num_bde + 2) * sizeof(struct ulp_bde64));
1262 iocb_cmd->unsli3.fcp_ext.ebde_count = (num_bde + 1);
1263 }
1264 fcp_cmnd->fcpDl = cpu_to_be32(scsi_bufflen(scsi_cmnd));
1265
1266
1267
1268
1269
1270 iocb_cmd->un.fcpi.fcpi_parm = scsi_bufflen(scsi_cmnd);
1271 return 0;
1272}
1273
1274#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
1275
1276
1277#define BG_ERR_INIT 0x1
1278
1279#define BG_ERR_TGT 0x2
1280
1281#define BG_ERR_SWAP 0x10
1282
1283
1284
1285
1286#define BG_ERR_CHECK 0x20
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298static int
1299lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1300 uint32_t *reftag, uint16_t *apptag, uint32_t new_guard)
1301{
1302 struct scatterlist *sgpe;
1303 struct lpfc_scsi_buf *lpfc_cmd = NULL;
1304 struct scsi_dif_tuple *src = NULL;
1305 struct lpfc_nodelist *ndlp;
1306 struct lpfc_rport_data *rdata;
1307 uint32_t op = scsi_get_prot_op(sc);
1308 uint32_t blksize;
1309 uint32_t numblks;
1310 sector_t lba;
1311 int rc = 0;
1312 int blockoff = 0;
1313
1314 if (op == SCSI_PROT_NORMAL)
1315 return 0;
1316
1317 sgpe = scsi_prot_sglist(sc);
1318 lba = scsi_get_lba(sc);
1319
1320
1321 if (phba->lpfc_injerr_lba != LPFC_INJERR_LBA_OFF) {
1322 blksize = lpfc_cmd_blksize(sc);
1323 numblks = (scsi_bufflen(sc) + blksize - 1) / blksize;
1324
1325
1326 if ((phba->lpfc_injerr_lba < lba) ||
1327 (phba->lpfc_injerr_lba >= (lba + numblks)))
1328 return 0;
1329 if (sgpe) {
1330 blockoff = phba->lpfc_injerr_lba - lba;
1331 numblks = sg_dma_len(sgpe) /
1332 sizeof(struct scsi_dif_tuple);
1333 if (numblks < blockoff)
1334 blockoff = numblks;
1335 }
1336 }
1337
1338
1339 rdata = lpfc_rport_data_from_scsi_device(sc->device);
1340 if (rdata && rdata->pnode) {
1341 ndlp = rdata->pnode;
1342
1343
1344 if (phba->lpfc_injerr_nportid &&
1345 (phba->lpfc_injerr_nportid != ndlp->nlp_DID))
1346 return 0;
1347
1348
1349
1350
1351
1352 if (phba->lpfc_injerr_wwpn.u.wwn[0] &&
1353 (memcmp(&ndlp->nlp_portname, &phba->lpfc_injerr_wwpn,
1354 sizeof(struct lpfc_name)) != 0))
1355 return 0;
1356 }
1357
1358
1359 if (sgpe) {
1360 src = (struct scsi_dif_tuple *)sg_virt(sgpe);
1361 src += blockoff;
1362 lpfc_cmd = (struct lpfc_scsi_buf *)sc->host_scribble;
1363 }
1364
1365
1366 if (reftag) {
1367 if (phba->lpfc_injerr_wref_cnt) {
1368 switch (op) {
1369 case SCSI_PROT_WRITE_PASS:
1370 if (src) {
1371
1372
1373
1374
1375
1376
1377
1378
1379 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1380 "9076 BLKGRD: Injecting reftag error: "
1381 "write lba x%lx + x%x oldrefTag x%x\n",
1382 (unsigned long)lba, blockoff,
1383 be32_to_cpu(src->ref_tag));
1384
1385
1386
1387
1388
1389 if (lpfc_cmd) {
1390 lpfc_cmd->prot_data_type =
1391 LPFC_INJERR_REFTAG;
1392 lpfc_cmd->prot_data_segment =
1393 src;
1394 lpfc_cmd->prot_data =
1395 src->ref_tag;
1396 }
1397 src->ref_tag = cpu_to_be32(0xDEADBEEF);
1398 phba->lpfc_injerr_wref_cnt--;
1399 if (phba->lpfc_injerr_wref_cnt == 0) {
1400 phba->lpfc_injerr_nportid = 0;
1401 phba->lpfc_injerr_lba =
1402 LPFC_INJERR_LBA_OFF;
1403 memset(&phba->lpfc_injerr_wwpn,
1404 0, sizeof(struct lpfc_name));
1405 }
1406 rc = BG_ERR_TGT | BG_ERR_CHECK;
1407
1408 break;
1409 }
1410
1411 case SCSI_PROT_WRITE_INSERT:
1412
1413
1414
1415
1416
1417
1418 *reftag = 0xDEADBEEF;
1419 phba->lpfc_injerr_wref_cnt--;
1420 if (phba->lpfc_injerr_wref_cnt == 0) {
1421 phba->lpfc_injerr_nportid = 0;
1422 phba->lpfc_injerr_lba =
1423 LPFC_INJERR_LBA_OFF;
1424 memset(&phba->lpfc_injerr_wwpn,
1425 0, sizeof(struct lpfc_name));
1426 }
1427 rc = BG_ERR_TGT | BG_ERR_CHECK;
1428
1429 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1430 "9078 BLKGRD: Injecting reftag error: "
1431 "write lba x%lx\n", (unsigned long)lba);
1432 break;
1433 case SCSI_PROT_WRITE_STRIP:
1434
1435
1436
1437
1438
1439 *reftag = 0xDEADBEEF;
1440 phba->lpfc_injerr_wref_cnt--;
1441 if (phba->lpfc_injerr_wref_cnt == 0) {
1442 phba->lpfc_injerr_nportid = 0;
1443 phba->lpfc_injerr_lba =
1444 LPFC_INJERR_LBA_OFF;
1445 memset(&phba->lpfc_injerr_wwpn,
1446 0, sizeof(struct lpfc_name));
1447 }
1448 rc = BG_ERR_INIT;
1449
1450 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1451 "9077 BLKGRD: Injecting reftag error: "
1452 "write lba x%lx\n", (unsigned long)lba);
1453 break;
1454 }
1455 }
1456 if (phba->lpfc_injerr_rref_cnt) {
1457 switch (op) {
1458 case SCSI_PROT_READ_INSERT:
1459 case SCSI_PROT_READ_STRIP:
1460 case SCSI_PROT_READ_PASS:
1461
1462
1463
1464
1465
1466 *reftag = 0xDEADBEEF;
1467 phba->lpfc_injerr_rref_cnt--;
1468 if (phba->lpfc_injerr_rref_cnt == 0) {
1469 phba->lpfc_injerr_nportid = 0;
1470 phba->lpfc_injerr_lba =
1471 LPFC_INJERR_LBA_OFF;
1472 memset(&phba->lpfc_injerr_wwpn,
1473 0, sizeof(struct lpfc_name));
1474 }
1475 rc = BG_ERR_INIT;
1476
1477 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1478 "9079 BLKGRD: Injecting reftag error: "
1479 "read lba x%lx\n", (unsigned long)lba);
1480 break;
1481 }
1482 }
1483 }
1484
1485
1486 if (apptag) {
1487 if (phba->lpfc_injerr_wapp_cnt) {
1488 switch (op) {
1489 case SCSI_PROT_WRITE_PASS:
1490 if (src) {
1491
1492
1493
1494
1495
1496
1497
1498
1499 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1500 "9080 BLKGRD: Injecting apptag error: "
1501 "write lba x%lx + x%x oldappTag x%x\n",
1502 (unsigned long)lba, blockoff,
1503 be16_to_cpu(src->app_tag));
1504
1505
1506
1507
1508
1509 if (lpfc_cmd) {
1510 lpfc_cmd->prot_data_type =
1511 LPFC_INJERR_APPTAG;
1512 lpfc_cmd->prot_data_segment =
1513 src;
1514 lpfc_cmd->prot_data =
1515 src->app_tag;
1516 }
1517 src->app_tag = cpu_to_be16(0xDEAD);
1518 phba->lpfc_injerr_wapp_cnt--;
1519 if (phba->lpfc_injerr_wapp_cnt == 0) {
1520 phba->lpfc_injerr_nportid = 0;
1521 phba->lpfc_injerr_lba =
1522 LPFC_INJERR_LBA_OFF;
1523 memset(&phba->lpfc_injerr_wwpn,
1524 0, sizeof(struct lpfc_name));
1525 }
1526 rc = BG_ERR_TGT | BG_ERR_CHECK;
1527 break;
1528 }
1529
1530 case SCSI_PROT_WRITE_INSERT:
1531
1532
1533
1534
1535
1536
1537 *apptag = 0xDEAD;
1538 phba->lpfc_injerr_wapp_cnt--;
1539 if (phba->lpfc_injerr_wapp_cnt == 0) {
1540 phba->lpfc_injerr_nportid = 0;
1541 phba->lpfc_injerr_lba =
1542 LPFC_INJERR_LBA_OFF;
1543 memset(&phba->lpfc_injerr_wwpn,
1544 0, sizeof(struct lpfc_name));
1545 }
1546 rc = BG_ERR_TGT | BG_ERR_CHECK;
1547
1548 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1549 "0813 BLKGRD: Injecting apptag error: "
1550 "write lba x%lx\n", (unsigned long)lba);
1551 break;
1552 case SCSI_PROT_WRITE_STRIP:
1553
1554
1555
1556
1557
1558 *apptag = 0xDEAD;
1559 phba->lpfc_injerr_wapp_cnt--;
1560 if (phba->lpfc_injerr_wapp_cnt == 0) {
1561 phba->lpfc_injerr_nportid = 0;
1562 phba->lpfc_injerr_lba =
1563 LPFC_INJERR_LBA_OFF;
1564 memset(&phba->lpfc_injerr_wwpn,
1565 0, sizeof(struct lpfc_name));
1566 }
1567 rc = BG_ERR_INIT;
1568
1569 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1570 "0812 BLKGRD: Injecting apptag error: "
1571 "write lba x%lx\n", (unsigned long)lba);
1572 break;
1573 }
1574 }
1575 if (phba->lpfc_injerr_rapp_cnt) {
1576 switch (op) {
1577 case SCSI_PROT_READ_INSERT:
1578 case SCSI_PROT_READ_STRIP:
1579 case SCSI_PROT_READ_PASS:
1580
1581
1582
1583
1584
1585 *apptag = 0xDEAD;
1586 phba->lpfc_injerr_rapp_cnt--;
1587 if (phba->lpfc_injerr_rapp_cnt == 0) {
1588 phba->lpfc_injerr_nportid = 0;
1589 phba->lpfc_injerr_lba =
1590 LPFC_INJERR_LBA_OFF;
1591 memset(&phba->lpfc_injerr_wwpn,
1592 0, sizeof(struct lpfc_name));
1593 }
1594 rc = BG_ERR_INIT;
1595
1596 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1597 "0814 BLKGRD: Injecting apptag error: "
1598 "read lba x%lx\n", (unsigned long)lba);
1599 break;
1600 }
1601 }
1602 }
1603
1604
1605
1606 if (new_guard) {
1607 if (phba->lpfc_injerr_wgrd_cnt) {
1608 switch (op) {
1609 case SCSI_PROT_WRITE_PASS:
1610 rc = BG_ERR_CHECK;
1611
1612
1613 case SCSI_PROT_WRITE_INSERT:
1614
1615
1616
1617
1618
1619 phba->lpfc_injerr_wgrd_cnt--;
1620 if (phba->lpfc_injerr_wgrd_cnt == 0) {
1621 phba->lpfc_injerr_nportid = 0;
1622 phba->lpfc_injerr_lba =
1623 LPFC_INJERR_LBA_OFF;
1624 memset(&phba->lpfc_injerr_wwpn,
1625 0, sizeof(struct lpfc_name));
1626 }
1627
1628 rc |= BG_ERR_TGT | BG_ERR_SWAP;
1629
1630
1631 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1632 "0817 BLKGRD: Injecting guard error: "
1633 "write lba x%lx\n", (unsigned long)lba);
1634 break;
1635 case SCSI_PROT_WRITE_STRIP:
1636
1637
1638
1639
1640
1641 phba->lpfc_injerr_wgrd_cnt--;
1642 if (phba->lpfc_injerr_wgrd_cnt == 0) {
1643 phba->lpfc_injerr_nportid = 0;
1644 phba->lpfc_injerr_lba =
1645 LPFC_INJERR_LBA_OFF;
1646 memset(&phba->lpfc_injerr_wwpn,
1647 0, sizeof(struct lpfc_name));
1648 }
1649
1650 rc = BG_ERR_INIT | BG_ERR_SWAP;
1651
1652
1653 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1654 "0816 BLKGRD: Injecting guard error: "
1655 "write lba x%lx\n", (unsigned long)lba);
1656 break;
1657 }
1658 }
1659 if (phba->lpfc_injerr_rgrd_cnt) {
1660 switch (op) {
1661 case SCSI_PROT_READ_INSERT:
1662 case SCSI_PROT_READ_STRIP:
1663 case SCSI_PROT_READ_PASS:
1664
1665
1666
1667
1668
1669 phba->lpfc_injerr_rgrd_cnt--;
1670 if (phba->lpfc_injerr_rgrd_cnt == 0) {
1671 phba->lpfc_injerr_nportid = 0;
1672 phba->lpfc_injerr_lba =
1673 LPFC_INJERR_LBA_OFF;
1674 memset(&phba->lpfc_injerr_wwpn,
1675 0, sizeof(struct lpfc_name));
1676 }
1677
1678 rc = BG_ERR_INIT | BG_ERR_SWAP;
1679
1680
1681 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1682 "0818 BLKGRD: Injecting guard error: "
1683 "read lba x%lx\n", (unsigned long)lba);
1684 }
1685 }
1686 }
1687
1688 return rc;
1689}
1690#endif
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703static int
1704lpfc_sc_to_bg_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1705 uint8_t *txop, uint8_t *rxop)
1706{
1707 uint8_t ret = 0;
1708
1709 if (lpfc_cmd_guard_csum(sc)) {
1710 switch (scsi_get_prot_op(sc)) {
1711 case SCSI_PROT_READ_INSERT:
1712 case SCSI_PROT_WRITE_STRIP:
1713 *rxop = BG_OP_IN_NODIF_OUT_CSUM;
1714 *txop = BG_OP_IN_CSUM_OUT_NODIF;
1715 break;
1716
1717 case SCSI_PROT_READ_STRIP:
1718 case SCSI_PROT_WRITE_INSERT:
1719 *rxop = BG_OP_IN_CRC_OUT_NODIF;
1720 *txop = BG_OP_IN_NODIF_OUT_CRC;
1721 break;
1722
1723 case SCSI_PROT_READ_PASS:
1724 case SCSI_PROT_WRITE_PASS:
1725 *rxop = BG_OP_IN_CRC_OUT_CSUM;
1726 *txop = BG_OP_IN_CSUM_OUT_CRC;
1727 break;
1728
1729 case SCSI_PROT_NORMAL:
1730 default:
1731 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1732 "9063 BLKGRD: Bad op/guard:%d/IP combination\n",
1733 scsi_get_prot_op(sc));
1734 ret = 1;
1735 break;
1736
1737 }
1738 } else {
1739 switch (scsi_get_prot_op(sc)) {
1740 case SCSI_PROT_READ_STRIP:
1741 case SCSI_PROT_WRITE_INSERT:
1742 *rxop = BG_OP_IN_CRC_OUT_NODIF;
1743 *txop = BG_OP_IN_NODIF_OUT_CRC;
1744 break;
1745
1746 case SCSI_PROT_READ_PASS:
1747 case SCSI_PROT_WRITE_PASS:
1748 *rxop = BG_OP_IN_CRC_OUT_CRC;
1749 *txop = BG_OP_IN_CRC_OUT_CRC;
1750 break;
1751
1752 case SCSI_PROT_READ_INSERT:
1753 case SCSI_PROT_WRITE_STRIP:
1754 *rxop = BG_OP_IN_NODIF_OUT_CRC;
1755 *txop = BG_OP_IN_CRC_OUT_NODIF;
1756 break;
1757
1758 case SCSI_PROT_NORMAL:
1759 default:
1760 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1761 "9075 BLKGRD: Bad op/guard:%d/CRC combination\n",
1762 scsi_get_prot_op(sc));
1763 ret = 1;
1764 break;
1765 }
1766 }
1767
1768 return ret;
1769}
1770
1771#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783static int
1784lpfc_bg_err_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1785 uint8_t *txop, uint8_t *rxop)
1786{
1787 uint8_t ret = 0;
1788
1789 if (lpfc_cmd_guard_csum(sc)) {
1790 switch (scsi_get_prot_op(sc)) {
1791 case SCSI_PROT_READ_INSERT:
1792 case SCSI_PROT_WRITE_STRIP:
1793 *rxop = BG_OP_IN_NODIF_OUT_CRC;
1794 *txop = BG_OP_IN_CRC_OUT_NODIF;
1795 break;
1796
1797 case SCSI_PROT_READ_STRIP:
1798 case SCSI_PROT_WRITE_INSERT:
1799 *rxop = BG_OP_IN_CSUM_OUT_NODIF;
1800 *txop = BG_OP_IN_NODIF_OUT_CSUM;
1801 break;
1802
1803 case SCSI_PROT_READ_PASS:
1804 case SCSI_PROT_WRITE_PASS:
1805 *rxop = BG_OP_IN_CSUM_OUT_CRC;
1806 *txop = BG_OP_IN_CRC_OUT_CSUM;
1807 break;
1808
1809 case SCSI_PROT_NORMAL:
1810 default:
1811 break;
1812
1813 }
1814 } else {
1815 switch (scsi_get_prot_op(sc)) {
1816 case SCSI_PROT_READ_STRIP:
1817 case SCSI_PROT_WRITE_INSERT:
1818 *rxop = BG_OP_IN_CSUM_OUT_NODIF;
1819 *txop = BG_OP_IN_NODIF_OUT_CSUM;
1820 break;
1821
1822 case SCSI_PROT_READ_PASS:
1823 case SCSI_PROT_WRITE_PASS:
1824 *rxop = BG_OP_IN_CSUM_OUT_CSUM;
1825 *txop = BG_OP_IN_CSUM_OUT_CSUM;
1826 break;
1827
1828 case SCSI_PROT_READ_INSERT:
1829 case SCSI_PROT_WRITE_STRIP:
1830 *rxop = BG_OP_IN_NODIF_OUT_CSUM;
1831 *txop = BG_OP_IN_CSUM_OUT_NODIF;
1832 break;
1833
1834 case SCSI_PROT_NORMAL:
1835 default:
1836 break;
1837 }
1838 }
1839
1840 return ret;
1841}
1842#endif
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875static int
1876lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1877 struct ulp_bde64 *bpl, int datasegcnt)
1878{
1879 struct scatterlist *sgde = NULL;
1880 struct lpfc_pde5 *pde5 = NULL;
1881 struct lpfc_pde6 *pde6 = NULL;
1882 dma_addr_t physaddr;
1883 int i = 0, num_bde = 0, status;
1884 int datadir = sc->sc_data_direction;
1885#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
1886 uint32_t rc;
1887#endif
1888 uint32_t checking = 1;
1889 uint32_t reftag;
1890 uint8_t txop, rxop;
1891
1892 status = lpfc_sc_to_bg_opcodes(phba, sc, &txop, &rxop);
1893 if (status)
1894 goto out;
1895
1896
1897 reftag = (uint32_t)scsi_get_lba(sc);
1898
1899#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
1900 rc = lpfc_bg_err_inject(phba, sc, &reftag, NULL, 1);
1901 if (rc) {
1902 if (rc & BG_ERR_SWAP)
1903 lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
1904 if (rc & BG_ERR_CHECK)
1905 checking = 0;
1906 }
1907#endif
1908
1909
1910 pde5 = (struct lpfc_pde5 *) bpl;
1911 memset(pde5, 0, sizeof(struct lpfc_pde5));
1912 bf_set(pde5_type, pde5, LPFC_PDE5_DESCRIPTOR);
1913
1914
1915 pde5->word0 = cpu_to_le32(pde5->word0);
1916 pde5->reftag = cpu_to_le32(reftag);
1917
1918
1919 num_bde++;
1920 bpl++;
1921 pde6 = (struct lpfc_pde6 *) bpl;
1922
1923
1924 memset(pde6, 0, sizeof(struct lpfc_pde6));
1925 bf_set(pde6_type, pde6, LPFC_PDE6_DESCRIPTOR);
1926 bf_set(pde6_optx, pde6, txop);
1927 bf_set(pde6_oprx, pde6, rxop);
1928
1929
1930
1931
1932
1933 if (datadir == DMA_FROM_DEVICE) {
1934 if (lpfc_cmd_protect(sc, LPFC_CHECK_PROTECT_GUARD))
1935 bf_set(pde6_ce, pde6, checking);
1936 else
1937 bf_set(pde6_ce, pde6, 0);
1938
1939 if (lpfc_cmd_protect(sc, LPFC_CHECK_PROTECT_REF))
1940 bf_set(pde6_re, pde6, checking);
1941 else
1942 bf_set(pde6_re, pde6, 0);
1943 }
1944 bf_set(pde6_ai, pde6, 1);
1945 bf_set(pde6_ae, pde6, 0);
1946 bf_set(pde6_apptagval, pde6, 0);
1947
1948
1949 pde6->word0 = cpu_to_le32(pde6->word0);
1950 pde6->word1 = cpu_to_le32(pde6->word1);
1951 pde6->word2 = cpu_to_le32(pde6->word2);
1952
1953
1954 num_bde++;
1955 bpl++;
1956
1957
1958 scsi_for_each_sg(sc, sgde, datasegcnt, i) {
1959 physaddr = sg_dma_address(sgde);
1960 bpl->addrLow = le32_to_cpu(putPaddrLow(physaddr));
1961 bpl->addrHigh = le32_to_cpu(putPaddrHigh(physaddr));
1962 bpl->tus.f.bdeSize = sg_dma_len(sgde);
1963 if (datadir == DMA_TO_DEVICE)
1964 bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
1965 else
1966 bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I;
1967 bpl->tus.w = le32_to_cpu(bpl->tus.w);
1968 bpl++;
1969 num_bde++;
1970 }
1971
1972out:
1973 return num_bde;
1974}
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015static int
2016lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
2017 struct ulp_bde64 *bpl, int datacnt, int protcnt)
2018{
2019 struct scatterlist *sgde = NULL;
2020 struct scatterlist *sgpe = NULL;
2021 struct lpfc_pde5 *pde5 = NULL;
2022 struct lpfc_pde6 *pde6 = NULL;
2023 struct lpfc_pde7 *pde7 = NULL;
2024 dma_addr_t dataphysaddr, protphysaddr;
2025 unsigned short curr_data = 0, curr_prot = 0;
2026 unsigned int split_offset;
2027 unsigned int protgroup_len, protgroup_offset = 0, protgroup_remainder;
2028 unsigned int protgrp_blks, protgrp_bytes;
2029 unsigned int remainder, subtotal;
2030 int status;
2031 int datadir = sc->sc_data_direction;
2032 unsigned char pgdone = 0, alldone = 0;
2033 unsigned blksize;
2034#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
2035 uint32_t rc;
2036#endif
2037 uint32_t checking = 1;
2038 uint32_t reftag;
2039 uint8_t txop, rxop;
2040 int num_bde = 0;
2041
2042 sgpe = scsi_prot_sglist(sc);
2043 sgde = scsi_sglist(sc);
2044
2045 if (!sgpe || !sgde) {
2046 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
2047 "9020 Invalid s/g entry: data=0x%p prot=0x%p\n",
2048 sgpe, sgde);
2049 return 0;
2050 }
2051
2052 status = lpfc_sc_to_bg_opcodes(phba, sc, &txop, &rxop);
2053 if (status)
2054 goto out;
2055
2056
2057 blksize = lpfc_cmd_blksize(sc);
2058 reftag = (uint32_t)scsi_get_lba(sc);
2059
2060#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
2061 rc = lpfc_bg_err_inject(phba, sc, &reftag, NULL, 1);
2062 if (rc) {
2063 if (rc & BG_ERR_SWAP)
2064 lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
2065 if (rc & BG_ERR_CHECK)
2066 checking = 0;
2067 }
2068#endif
2069
2070 split_offset = 0;
2071 do {
2072
2073 if (num_bde >= (phba->cfg_total_seg_cnt - 2))
2074 return num_bde + 3;
2075
2076
2077 pde5 = (struct lpfc_pde5 *) bpl;
2078 memset(pde5, 0, sizeof(struct lpfc_pde5));
2079 bf_set(pde5_type, pde5, LPFC_PDE5_DESCRIPTOR);
2080
2081
2082 pde5->word0 = cpu_to_le32(pde5->word0);
2083 pde5->reftag = cpu_to_le32(reftag);
2084
2085
2086 num_bde++;
2087 bpl++;
2088 pde6 = (struct lpfc_pde6 *) bpl;
2089
2090
2091 memset(pde6, 0, sizeof(struct lpfc_pde6));
2092 bf_set(pde6_type, pde6, LPFC_PDE6_DESCRIPTOR);
2093 bf_set(pde6_optx, pde6, txop);
2094 bf_set(pde6_oprx, pde6, rxop);
2095
2096 if (lpfc_cmd_protect(sc, LPFC_CHECK_PROTECT_GUARD))
2097 bf_set(pde6_ce, pde6, checking);
2098 else
2099 bf_set(pde6_ce, pde6, 0);
2100
2101 if (lpfc_cmd_protect(sc, LPFC_CHECK_PROTECT_REF))
2102 bf_set(pde6_re, pde6, checking);
2103 else
2104 bf_set(pde6_re, pde6, 0);
2105
2106 bf_set(pde6_ai, pde6, 1);
2107 bf_set(pde6_ae, pde6, 0);
2108 bf_set(pde6_apptagval, pde6, 0);
2109
2110
2111 pde6->word0 = cpu_to_le32(pde6->word0);
2112 pde6->word1 = cpu_to_le32(pde6->word1);
2113 pde6->word2 = cpu_to_le32(pde6->word2);
2114
2115
2116 num_bde++;
2117 bpl++;
2118
2119
2120 protphysaddr = sg_dma_address(sgpe) + protgroup_offset;
2121 protgroup_len = sg_dma_len(sgpe) - protgroup_offset;
2122
2123
2124 BUG_ON(protgroup_len % 8);
2125
2126 pde7 = (struct lpfc_pde7 *) bpl;
2127 memset(pde7, 0, sizeof(struct lpfc_pde7));
2128 bf_set(pde7_type, pde7, LPFC_PDE7_DESCRIPTOR);
2129
2130 pde7->addrHigh = le32_to_cpu(putPaddrHigh(protphysaddr));
2131 pde7->addrLow = le32_to_cpu(putPaddrLow(protphysaddr));
2132
2133 protgrp_blks = protgroup_len / 8;
2134 protgrp_bytes = protgrp_blks * blksize;
2135
2136
2137 if ((pde7->addrLow & 0xfff) + protgroup_len > 0x1000) {
2138 protgroup_remainder = 0x1000 - (pde7->addrLow & 0xfff);
2139 protgroup_offset += protgroup_remainder;
2140 protgrp_blks = protgroup_remainder / 8;
2141 protgrp_bytes = protgrp_blks * blksize;
2142 } else {
2143 protgroup_offset = 0;
2144 curr_prot++;
2145 }
2146
2147 num_bde++;
2148
2149
2150 pgdone = 0;
2151 subtotal = 0;
2152 while (!pgdone) {
2153
2154 if (num_bde >= phba->cfg_total_seg_cnt)
2155 return num_bde + 1;
2156
2157 if (!sgde) {
2158 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
2159 "9065 BLKGRD:%s Invalid data segment\n",
2160 __func__);
2161 return 0;
2162 }
2163 bpl++;
2164 dataphysaddr = sg_dma_address(sgde) + split_offset;
2165 bpl->addrLow = le32_to_cpu(putPaddrLow(dataphysaddr));
2166 bpl->addrHigh = le32_to_cpu(putPaddrHigh(dataphysaddr));
2167
2168 remainder = sg_dma_len(sgde) - split_offset;
2169
2170 if ((subtotal + remainder) <= protgrp_bytes) {
2171
2172 bpl->tus.f.bdeSize = remainder;
2173 split_offset = 0;
2174
2175 if ((subtotal + remainder) == protgrp_bytes)
2176 pgdone = 1;
2177 } else {
2178
2179 bpl->tus.f.bdeSize = protgrp_bytes - subtotal;
2180 split_offset += bpl->tus.f.bdeSize;
2181 }
2182
2183 subtotal += bpl->tus.f.bdeSize;
2184
2185 if (datadir == DMA_TO_DEVICE)
2186 bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
2187 else
2188 bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I;
2189 bpl->tus.w = le32_to_cpu(bpl->tus.w);
2190
2191 num_bde++;
2192 curr_data++;
2193
2194 if (split_offset)
2195 break;
2196
2197
2198 sgde = sg_next(sgde);
2199
2200 }
2201
2202 if (protgroup_offset) {
2203
2204 reftag += protgrp_blks;
2205 bpl++;
2206 continue;
2207 }
2208
2209
2210 if (curr_prot == protcnt) {
2211 alldone = 1;
2212 } else if (curr_prot < protcnt) {
2213
2214 sgpe = sg_next(sgpe);
2215 bpl++;
2216
2217
2218 reftag += protgrp_blks;
2219 } else {
2220
2221 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
2222 "9054 BLKGRD: bug in %s\n", __func__);
2223 }
2224
2225 } while (!alldone);
2226out:
2227
2228 return num_bde;
2229}
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260static int
2261lpfc_bg_setup_sgl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
2262 struct sli4_sge *sgl, int datasegcnt)
2263{
2264 struct scatterlist *sgde = NULL;
2265 struct sli4_sge_diseed *diseed = NULL;
2266 dma_addr_t physaddr;
2267 int i = 0, num_sge = 0, status;
2268 uint32_t reftag;
2269 uint8_t txop, rxop;
2270#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
2271 uint32_t rc;
2272#endif
2273 uint32_t checking = 1;
2274 uint32_t dma_len;
2275 uint32_t dma_offset = 0;
2276
2277 status = lpfc_sc_to_bg_opcodes(phba, sc, &txop, &rxop);
2278 if (status)
2279 goto out;
2280
2281
2282 reftag = (uint32_t)scsi_get_lba(sc);
2283
2284#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
2285 rc = lpfc_bg_err_inject(phba, sc, &reftag, NULL, 1);
2286 if (rc) {
2287 if (rc & BG_ERR_SWAP)
2288 lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
2289 if (rc & BG_ERR_CHECK)
2290 checking = 0;
2291 }
2292#endif
2293
2294
2295 diseed = (struct sli4_sge_diseed *) sgl;
2296 memset(diseed, 0, sizeof(struct sli4_sge_diseed));
2297 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DISEED);
2298
2299
2300 diseed->ref_tag = cpu_to_le32(reftag);
2301 diseed->ref_tag_tran = diseed->ref_tag;
2302
2303
2304
2305
2306
2307 if (sc->sc_data_direction == DMA_FROM_DEVICE) {
2308 if (lpfc_cmd_protect(sc, LPFC_CHECK_PROTECT_GUARD))
2309 bf_set(lpfc_sli4_sge_dif_ce, diseed, checking);
2310 else
2311 bf_set(lpfc_sli4_sge_dif_ce, diseed, 0);
2312
2313 if (lpfc_cmd_protect(sc, LPFC_CHECK_PROTECT_REF))
2314 bf_set(lpfc_sli4_sge_dif_re, diseed, checking);
2315 else
2316 bf_set(lpfc_sli4_sge_dif_re, diseed, 0);
2317 }
2318
2319
2320 bf_set(lpfc_sli4_sge_dif_optx, diseed, txop);
2321 bf_set(lpfc_sli4_sge_dif_oprx, diseed, rxop);
2322
2323 bf_set(lpfc_sli4_sge_dif_ai, diseed, 1);
2324 bf_set(lpfc_sli4_sge_dif_me, diseed, 0);
2325
2326
2327 diseed->word2 = cpu_to_le32(diseed->word2);
2328 diseed->word3 = cpu_to_le32(diseed->word3);
2329
2330
2331 num_sge++;
2332 sgl++;
2333
2334
2335 scsi_for_each_sg(sc, sgde, datasegcnt, i) {
2336 physaddr = sg_dma_address(sgde);
2337 dma_len = sg_dma_len(sgde);
2338 sgl->addr_lo = cpu_to_le32(putPaddrLow(physaddr));
2339 sgl->addr_hi = cpu_to_le32(putPaddrHigh(physaddr));
2340 if ((i + 1) == datasegcnt)
2341 bf_set(lpfc_sli4_sge_last, sgl, 1);
2342 else
2343 bf_set(lpfc_sli4_sge_last, sgl, 0);
2344 bf_set(lpfc_sli4_sge_offset, sgl, dma_offset);
2345 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DATA);
2346
2347 sgl->sge_len = cpu_to_le32(dma_len);
2348 dma_offset += dma_len;
2349
2350 sgl++;
2351 num_sge++;
2352 }
2353
2354out:
2355 return num_sge;
2356}
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395static int
2396lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
2397 struct sli4_sge *sgl, int datacnt, int protcnt)
2398{
2399 struct scatterlist *sgde = NULL;
2400 struct scatterlist *sgpe = NULL;
2401 struct sli4_sge_diseed *diseed = NULL;
2402 dma_addr_t dataphysaddr, protphysaddr;
2403 unsigned short curr_data = 0, curr_prot = 0;
2404 unsigned int split_offset;
2405 unsigned int protgroup_len, protgroup_offset = 0, protgroup_remainder;
2406 unsigned int protgrp_blks, protgrp_bytes;
2407 unsigned int remainder, subtotal;
2408 int status;
2409 unsigned char pgdone = 0, alldone = 0;
2410 unsigned blksize;
2411 uint32_t reftag;
2412 uint8_t txop, rxop;
2413 uint32_t dma_len;
2414#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
2415 uint32_t rc;
2416#endif
2417 uint32_t checking = 1;
2418 uint32_t dma_offset = 0;
2419 int num_sge = 0;
2420
2421 sgpe = scsi_prot_sglist(sc);
2422 sgde = scsi_sglist(sc);
2423
2424 if (!sgpe || !sgde) {
2425 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
2426 "9082 Invalid s/g entry: data=0x%p prot=0x%p\n",
2427 sgpe, sgde);
2428 return 0;
2429 }
2430
2431 status = lpfc_sc_to_bg_opcodes(phba, sc, &txop, &rxop);
2432 if (status)
2433 goto out;
2434
2435
2436 blksize = lpfc_cmd_blksize(sc);
2437 reftag = (uint32_t)scsi_get_lba(sc);
2438
2439#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
2440 rc = lpfc_bg_err_inject(phba, sc, &reftag, NULL, 1);
2441 if (rc) {
2442 if (rc & BG_ERR_SWAP)
2443 lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
2444 if (rc & BG_ERR_CHECK)
2445 checking = 0;
2446 }
2447#endif
2448
2449 split_offset = 0;
2450 do {
2451
2452 if (num_sge >= (phba->cfg_total_seg_cnt - 2))
2453 return num_sge + 3;
2454
2455
2456 diseed = (struct sli4_sge_diseed *) sgl;
2457 memset(diseed, 0, sizeof(struct sli4_sge_diseed));
2458 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DISEED);
2459
2460
2461 diseed->ref_tag = cpu_to_le32(reftag);
2462 diseed->ref_tag_tran = diseed->ref_tag;
2463
2464 if (lpfc_cmd_protect(sc, LPFC_CHECK_PROTECT_GUARD)) {
2465 bf_set(lpfc_sli4_sge_dif_ce, diseed, checking);
2466
2467 } else {
2468 bf_set(lpfc_sli4_sge_dif_ce, diseed, 0);
2469
2470
2471
2472
2473
2474
2475
2476 if (txop == BG_OP_IN_CRC_OUT_CRC) {
2477 txop = BG_OP_RAW_MODE;
2478 rxop = BG_OP_RAW_MODE;
2479 }
2480 }
2481
2482
2483 if (lpfc_cmd_protect(sc, LPFC_CHECK_PROTECT_REF))
2484 bf_set(lpfc_sli4_sge_dif_re, diseed, checking);
2485 else
2486 bf_set(lpfc_sli4_sge_dif_re, diseed, 0);
2487
2488
2489 bf_set(lpfc_sli4_sge_dif_optx, diseed, txop);
2490 bf_set(lpfc_sli4_sge_dif_oprx, diseed, rxop);
2491
2492 bf_set(lpfc_sli4_sge_dif_ai, diseed, 1);
2493 bf_set(lpfc_sli4_sge_dif_me, diseed, 0);
2494
2495
2496 diseed->word2 = cpu_to_le32(diseed->word2);
2497 diseed->word3 = cpu_to_le32(diseed->word3);
2498
2499
2500 num_sge++;
2501 sgl++;
2502
2503
2504 protphysaddr = sg_dma_address(sgpe) + protgroup_offset;
2505 protgroup_len = sg_dma_len(sgpe) - protgroup_offset;
2506
2507
2508 BUG_ON(protgroup_len % 8);
2509
2510
2511 sgl->word2 = 0;
2512 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DIF);
2513 sgl->addr_hi = le32_to_cpu(putPaddrHigh(protphysaddr));
2514 sgl->addr_lo = le32_to_cpu(putPaddrLow(protphysaddr));
2515 sgl->word2 = cpu_to_le32(sgl->word2);
2516
2517 protgrp_blks = protgroup_len / 8;
2518 protgrp_bytes = protgrp_blks * blksize;
2519
2520
2521 if ((sgl->addr_lo & 0xfff) + protgroup_len > 0x1000) {
2522 protgroup_remainder = 0x1000 - (sgl->addr_lo & 0xfff);
2523 protgroup_offset += protgroup_remainder;
2524 protgrp_blks = protgroup_remainder / 8;
2525 protgrp_bytes = protgrp_blks * blksize;
2526 } else {
2527 protgroup_offset = 0;
2528 curr_prot++;
2529 }
2530
2531 num_sge++;
2532
2533
2534 pgdone = 0;
2535 subtotal = 0;
2536 while (!pgdone) {
2537
2538 if (num_sge >= phba->cfg_total_seg_cnt)
2539 return num_sge + 1;
2540
2541 if (!sgde) {
2542 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
2543 "9086 BLKGRD:%s Invalid data segment\n",
2544 __func__);
2545 return 0;
2546 }
2547 sgl++;
2548 dataphysaddr = sg_dma_address(sgde) + split_offset;
2549
2550 remainder = sg_dma_len(sgde) - split_offset;
2551
2552 if ((subtotal + remainder) <= protgrp_bytes) {
2553
2554 dma_len = remainder;
2555 split_offset = 0;
2556
2557 if ((subtotal + remainder) == protgrp_bytes)
2558 pgdone = 1;
2559 } else {
2560
2561 dma_len = protgrp_bytes - subtotal;
2562 split_offset += dma_len;
2563 }
2564
2565 subtotal += dma_len;
2566
2567 sgl->addr_lo = cpu_to_le32(putPaddrLow(dataphysaddr));
2568 sgl->addr_hi = cpu_to_le32(putPaddrHigh(dataphysaddr));
2569 bf_set(lpfc_sli4_sge_last, sgl, 0);
2570 bf_set(lpfc_sli4_sge_offset, sgl, dma_offset);
2571 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DATA);
2572
2573 sgl->sge_len = cpu_to_le32(dma_len);
2574 dma_offset += dma_len;
2575
2576 num_sge++;
2577 curr_data++;
2578
2579 if (split_offset)
2580 break;
2581
2582
2583 sgde = sg_next(sgde);
2584 }
2585
2586 if (protgroup_offset) {
2587
2588 reftag += protgrp_blks;
2589 sgl++;
2590 continue;
2591 }
2592
2593
2594 if (curr_prot == protcnt) {
2595 bf_set(lpfc_sli4_sge_last, sgl, 1);
2596 alldone = 1;
2597 } else if (curr_prot < protcnt) {
2598
2599 sgpe = sg_next(sgpe);
2600 sgl++;
2601
2602
2603 reftag += protgrp_blks;
2604 } else {
2605
2606 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
2607 "9085 BLKGRD: bug in %s\n", __func__);
2608 }
2609
2610 } while (!alldone);
2611
2612out:
2613
2614 return num_sge;
2615}
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628static int
2629lpfc_prot_group_type(struct lpfc_hba *phba, struct scsi_cmnd *sc)
2630{
2631 int ret = LPFC_PG_TYPE_INVALID;
2632 unsigned char op = scsi_get_prot_op(sc);
2633
2634 switch (op) {
2635 case SCSI_PROT_READ_STRIP:
2636 case SCSI_PROT_WRITE_INSERT:
2637 ret = LPFC_PG_TYPE_NO_DIF;
2638 break;
2639 case SCSI_PROT_READ_INSERT:
2640 case SCSI_PROT_WRITE_STRIP:
2641 case SCSI_PROT_READ_PASS:
2642 case SCSI_PROT_WRITE_PASS:
2643 ret = LPFC_PG_TYPE_DIF_BUF;
2644 break;
2645 default:
2646 if (phba)
2647 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
2648 "9021 Unsupported protection op:%d\n",
2649 op);
2650 break;
2651 }
2652 return ret;
2653}
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665static int
2666lpfc_bg_scsi_adjust_dl(struct lpfc_hba *phba,
2667 struct lpfc_scsi_buf *lpfc_cmd)
2668{
2669 struct scsi_cmnd *sc = lpfc_cmd->pCmd;
2670 int fcpdl;
2671
2672 fcpdl = scsi_bufflen(sc);
2673
2674
2675 if (sc->sc_data_direction == DMA_FROM_DEVICE) {
2676
2677 if (scsi_get_prot_op(sc) == SCSI_PROT_READ_INSERT)
2678 return fcpdl;
2679
2680 } else {
2681
2682 if (scsi_get_prot_op(sc) == SCSI_PROT_WRITE_STRIP)
2683 return fcpdl;
2684 }
2685
2686
2687
2688
2689
2690
2691 fcpdl += (fcpdl / lpfc_cmd_blksize(sc)) * 8;
2692
2693 return fcpdl;
2694}
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705static int
2706lpfc_bg_scsi_prep_dma_buf_s3(struct lpfc_hba *phba,
2707 struct lpfc_scsi_buf *lpfc_cmd)
2708{
2709 struct scsi_cmnd *scsi_cmnd = lpfc_cmd->pCmd;
2710 struct fcp_cmnd *fcp_cmnd = lpfc_cmd->fcp_cmnd;
2711 struct ulp_bde64 *bpl = lpfc_cmd->fcp_bpl;
2712 IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;
2713 uint32_t num_bde = 0;
2714 int datasegcnt, protsegcnt, datadir = scsi_cmnd->sc_data_direction;
2715 int prot_group_type = 0;
2716 int fcpdl;
2717
2718
2719
2720
2721
2722 bpl += 2;
2723 if (scsi_sg_count(scsi_cmnd)) {
2724
2725
2726
2727
2728
2729
2730 datasegcnt = dma_map_sg(&phba->pcidev->dev,
2731 scsi_sglist(scsi_cmnd),
2732 scsi_sg_count(scsi_cmnd), datadir);
2733 if (unlikely(!datasegcnt))
2734 return 1;
2735
2736 lpfc_cmd->seg_cnt = datasegcnt;
2737
2738
2739 if (lpfc_cmd->seg_cnt > phba->cfg_sg_seg_cnt)
2740 goto err;
2741
2742 prot_group_type = lpfc_prot_group_type(phba, scsi_cmnd);
2743
2744 switch (prot_group_type) {
2745 case LPFC_PG_TYPE_NO_DIF:
2746
2747
2748 if ((lpfc_cmd->seg_cnt + 2) > phba->cfg_total_seg_cnt)
2749 goto err;
2750
2751 num_bde = lpfc_bg_setup_bpl(phba, scsi_cmnd, bpl,
2752 datasegcnt);
2753
2754 if (num_bde < 2)
2755 goto err;
2756 break;
2757
2758 case LPFC_PG_TYPE_DIF_BUF:
2759
2760
2761
2762
2763
2764 protsegcnt = dma_map_sg(&phba->pcidev->dev,
2765 scsi_prot_sglist(scsi_cmnd),
2766 scsi_prot_sg_count(scsi_cmnd), datadir);
2767 if (unlikely(!protsegcnt)) {
2768 scsi_dma_unmap(scsi_cmnd);
2769 return 1;
2770 }
2771
2772 lpfc_cmd->prot_seg_cnt = protsegcnt;
2773
2774
2775
2776
2777
2778 if ((lpfc_cmd->prot_seg_cnt * 4) >
2779 (phba->cfg_total_seg_cnt - 2))
2780 goto err;
2781
2782 num_bde = lpfc_bg_setup_bpl_prot(phba, scsi_cmnd, bpl,
2783 datasegcnt, protsegcnt);
2784
2785 if ((num_bde < 3) ||
2786 (num_bde > phba->cfg_total_seg_cnt))
2787 goto err;
2788 break;
2789
2790 case LPFC_PG_TYPE_INVALID:
2791 default:
2792 scsi_dma_unmap(scsi_cmnd);
2793 lpfc_cmd->seg_cnt = 0;
2794
2795 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
2796 "9022 Unexpected protection group %i\n",
2797 prot_group_type);
2798 return 1;
2799 }
2800 }
2801
2802
2803
2804
2805
2806
2807
2808 iocb_cmd->un.fcpi64.bdl.bdeSize = (2 * sizeof(struct ulp_bde64));
2809 iocb_cmd->un.fcpi64.bdl.bdeSize += (num_bde * sizeof(struct ulp_bde64));
2810 iocb_cmd->ulpBdeCount = 1;
2811 iocb_cmd->ulpLe = 1;
2812
2813 fcpdl = lpfc_bg_scsi_adjust_dl(phba, lpfc_cmd);
2814 fcp_cmnd->fcpDl = be32_to_cpu(fcpdl);
2815
2816
2817
2818
2819
2820 iocb_cmd->un.fcpi.fcpi_parm = fcpdl;
2821
2822 return 0;
2823err:
2824 if (lpfc_cmd->seg_cnt)
2825 scsi_dma_unmap(scsi_cmnd);
2826 if (lpfc_cmd->prot_seg_cnt)
2827 dma_unmap_sg(&phba->pcidev->dev, scsi_prot_sglist(scsi_cmnd),
2828 scsi_prot_sg_count(scsi_cmnd),
2829 scsi_cmnd->sc_data_direction);
2830
2831 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
2832 "9023 Cannot setup S/G List for HBA"
2833 "IO segs %d/%d BPL %d SCSI %d: %d %d\n",
2834 lpfc_cmd->seg_cnt, lpfc_cmd->prot_seg_cnt,
2835 phba->cfg_total_seg_cnt, phba->cfg_sg_seg_cnt,
2836 prot_group_type, num_bde);
2837
2838 lpfc_cmd->seg_cnt = 0;
2839 lpfc_cmd->prot_seg_cnt = 0;
2840 return 1;
2841}
2842
2843
2844
2845
2846
2847
2848static uint16_t
2849lpfc_bg_crc(uint8_t *data, int count)
2850{
2851 uint16_t crc = 0;
2852 uint16_t x;
2853
2854 crc = crc_t10dif(data, count);
2855 x = cpu_to_be16(crc);
2856 return x;
2857}
2858
2859
2860
2861
2862
2863
2864static uint16_t
2865lpfc_bg_csum(uint8_t *data, int count)
2866{
2867 uint16_t ret;
2868
2869 ret = ip_compute_csum(data, count);
2870 return ret;
2871}
2872
2873
2874
2875
2876
2877static void
2878lpfc_calc_bg_err(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
2879{
2880 struct scatterlist *sgpe;
2881 struct scatterlist *sgde;
2882 struct scsi_cmnd *cmd = lpfc_cmd->pCmd;
2883 struct scsi_dif_tuple *src = NULL;
2884 uint8_t *data_src = NULL;
2885 uint16_t guard_tag;
2886 uint16_t start_app_tag, app_tag;
2887 uint32_t start_ref_tag, ref_tag;
2888 int prot, protsegcnt;
2889 int err_type, len, data_len;
2890 int chk_ref, chk_app, chk_guard;
2891 uint16_t sum;
2892 unsigned blksize;
2893
2894 err_type = BGS_GUARD_ERR_MASK;
2895 sum = 0;
2896 guard_tag = 0;
2897
2898
2899 prot = scsi_get_prot_op(cmd);
2900 if ((prot == SCSI_PROT_READ_STRIP) ||
2901 (prot == SCSI_PROT_WRITE_INSERT) ||
2902 (prot == SCSI_PROT_NORMAL))
2903 goto out;
2904
2905
2906 chk_ref = 1;
2907 chk_app = 0;
2908 chk_guard = 0;
2909
2910
2911 sgpe = scsi_prot_sglist(cmd);
2912 protsegcnt = lpfc_cmd->prot_seg_cnt;
2913
2914 if (sgpe && protsegcnt) {
2915
2916
2917
2918
2919
2920 sgde = scsi_sglist(cmd);
2921 blksize = lpfc_cmd_blksize(cmd);
2922 data_src = (uint8_t *)sg_virt(sgde);
2923 data_len = sgde->length;
2924 if ((data_len & (blksize - 1)) == 0)
2925 chk_guard = 1;
2926
2927 src = (struct scsi_dif_tuple *)sg_virt(sgpe);
2928 start_ref_tag = (uint32_t)scsi_get_lba(cmd);
2929 start_app_tag = src->app_tag;
2930 len = sgpe->length;
2931 while (src && protsegcnt) {
2932 while (len) {
2933
2934
2935
2936
2937
2938 if ((src->ref_tag == T10_PI_REF_ESCAPE) ||
2939 (src->app_tag == T10_PI_APP_ESCAPE)) {
2940 start_ref_tag++;
2941 goto skipit;
2942 }
2943
2944
2945 if (chk_guard) {
2946 guard_tag = src->guard_tag;
2947 if (lpfc_cmd_guard_csum(cmd))
2948 sum = lpfc_bg_csum(data_src,
2949 blksize);
2950 else
2951 sum = lpfc_bg_crc(data_src,
2952 blksize);
2953 if ((guard_tag != sum)) {
2954 err_type = BGS_GUARD_ERR_MASK;
2955 goto out;
2956 }
2957 }
2958
2959
2960 ref_tag = be32_to_cpu(src->ref_tag);
2961 if (chk_ref && (ref_tag != start_ref_tag)) {
2962 err_type = BGS_REFTAG_ERR_MASK;
2963 goto out;
2964 }
2965 start_ref_tag++;
2966
2967
2968 app_tag = src->app_tag;
2969 if (chk_app && (app_tag != start_app_tag)) {
2970 err_type = BGS_APPTAG_ERR_MASK;
2971 goto out;
2972 }
2973skipit:
2974 len -= sizeof(struct scsi_dif_tuple);
2975 if (len < 0)
2976 len = 0;
2977 src++;
2978
2979 data_src += blksize;
2980 data_len -= blksize;
2981
2982
2983
2984
2985
2986
2987 if (chk_guard && (data_len == 0)) {
2988 chk_guard = 0;
2989 sgde = sg_next(sgde);
2990 if (!sgde)
2991 goto out;
2992
2993 data_src = (uint8_t *)sg_virt(sgde);
2994 data_len = sgde->length;
2995 if ((data_len & (blksize - 1)) == 0)
2996 chk_guard = 1;
2997 }
2998 }
2999
3000
3001 sgpe = sg_next(sgpe);
3002 if (sgpe) {
3003 src = (struct scsi_dif_tuple *)sg_virt(sgpe);
3004 len = sgpe->length;
3005 } else {
3006 src = NULL;
3007 }
3008 protsegcnt--;
3009 }
3010 }
3011out:
3012 if (err_type == BGS_GUARD_ERR_MASK) {
3013 scsi_build_sense_buffer(1, cmd->sense_buffer, ILLEGAL_REQUEST,
3014 0x10, 0x1);
3015 cmd->result = DRIVER_SENSE << 24
3016 | ScsiResult(DID_ABORT, SAM_STAT_CHECK_CONDITION);
3017 phba->bg_guard_err_cnt++;
3018 lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
3019 "9069 BLKGRD: LBA %lx grd_tag error %x != %x\n",
3020 (unsigned long)scsi_get_lba(cmd),
3021 sum, guard_tag);
3022
3023 } else if (err_type == BGS_REFTAG_ERR_MASK) {
3024 scsi_build_sense_buffer(1, cmd->sense_buffer, ILLEGAL_REQUEST,
3025 0x10, 0x3);
3026 cmd->result = DRIVER_SENSE << 24
3027 | ScsiResult(DID_ABORT, SAM_STAT_CHECK_CONDITION);
3028
3029 phba->bg_reftag_err_cnt++;
3030 lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
3031 "9066 BLKGRD: LBA %lx ref_tag error %x != %x\n",
3032 (unsigned long)scsi_get_lba(cmd),
3033 ref_tag, start_ref_tag);
3034
3035 } else if (err_type == BGS_APPTAG_ERR_MASK) {
3036 scsi_build_sense_buffer(1, cmd->sense_buffer, ILLEGAL_REQUEST,
3037 0x10, 0x2);
3038 cmd->result = DRIVER_SENSE << 24
3039 | ScsiResult(DID_ABORT, SAM_STAT_CHECK_CONDITION);
3040
3041 phba->bg_apptag_err_cnt++;
3042 lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
3043 "9041 BLKGRD: LBA %lx app_tag error %x != %x\n",
3044 (unsigned long)scsi_get_lba(cmd),
3045 app_tag, start_app_tag);
3046 }
3047}
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062static int
3063lpfc_parse_bg_err(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd,
3064 struct lpfc_iocbq *pIocbOut)
3065{
3066 struct scsi_cmnd *cmd = lpfc_cmd->pCmd;
3067 struct sli3_bg_fields *bgf = &pIocbOut->iocb.unsli3.sli3_bg;
3068 int ret = 0;
3069 uint32_t bghm = bgf->bghm;
3070 uint32_t bgstat = bgf->bgstat;
3071 uint64_t failing_sector = 0;
3072
3073 spin_lock(&_dump_buf_lock);
3074 if (!_dump_buf_done) {
3075 lpfc_printf_log(phba, KERN_ERR, LOG_BG, "9070 BLKGRD: Saving"
3076 " Data for %u blocks to debugfs\n",
3077 (cmd->cmnd[7] << 8 | cmd->cmnd[8]));
3078 lpfc_debug_save_data(phba, cmd);
3079
3080
3081 if (lpfc_prot_group_type(phba, cmd) ==
3082 LPFC_PG_TYPE_DIF_BUF) {
3083 lpfc_printf_log(phba, KERN_ERR, LOG_BG, "9071 BLKGRD: "
3084 "Saving DIF for %u blocks to debugfs\n",
3085 (cmd->cmnd[7] << 8 | cmd->cmnd[8]));
3086 lpfc_debug_save_dif(phba, cmd);
3087 }
3088
3089 _dump_buf_done = 1;
3090 }
3091 spin_unlock(&_dump_buf_lock);
3092
3093 if (lpfc_bgs_get_invalid_prof(bgstat)) {
3094 cmd->result = ScsiResult(DID_ERROR, 0);
3095 lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
3096 "9072 BLKGRD: Invalid BG Profile in cmd"
3097 " 0x%x lba 0x%llx blk cnt 0x%x "
3098 "bgstat=x%x bghm=x%x\n", cmd->cmnd[0],
3099 (unsigned long long)scsi_get_lba(cmd),
3100 blk_rq_sectors(cmd->request), bgstat, bghm);
3101 ret = (-1);
3102 goto out;
3103 }
3104
3105 if (lpfc_bgs_get_uninit_dif_block(bgstat)) {
3106 cmd->result = ScsiResult(DID_ERROR, 0);
3107 lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
3108 "9073 BLKGRD: Invalid BG PDIF Block in cmd"
3109 " 0x%x lba 0x%llx blk cnt 0x%x "
3110 "bgstat=x%x bghm=x%x\n", cmd->cmnd[0],
3111 (unsigned long long)scsi_get_lba(cmd),
3112 blk_rq_sectors(cmd->request), bgstat, bghm);
3113 ret = (-1);
3114 goto out;
3115 }
3116
3117 if (lpfc_bgs_get_guard_err(bgstat)) {
3118 ret = 1;
3119
3120 scsi_build_sense_buffer(1, cmd->sense_buffer, ILLEGAL_REQUEST,
3121 0x10, 0x1);
3122 cmd->result = DRIVER_SENSE << 24
3123 | ScsiResult(DID_ABORT, SAM_STAT_CHECK_CONDITION);
3124 phba->bg_guard_err_cnt++;
3125 lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
3126 "9055 BLKGRD: Guard Tag error in cmd"
3127 " 0x%x lba 0x%llx blk cnt 0x%x "
3128 "bgstat=x%x bghm=x%x\n", cmd->cmnd[0],
3129 (unsigned long long)scsi_get_lba(cmd),
3130 blk_rq_sectors(cmd->request), bgstat, bghm);
3131 }
3132
3133 if (lpfc_bgs_get_reftag_err(bgstat)) {
3134 ret = 1;
3135
3136 scsi_build_sense_buffer(1, cmd->sense_buffer, ILLEGAL_REQUEST,
3137 0x10, 0x3);
3138 cmd->result = DRIVER_SENSE << 24
3139 | ScsiResult(DID_ABORT, SAM_STAT_CHECK_CONDITION);
3140
3141 phba->bg_reftag_err_cnt++;
3142 lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
3143 "9056 BLKGRD: Ref Tag error in cmd"
3144 " 0x%x lba 0x%llx blk cnt 0x%x "
3145 "bgstat=x%x bghm=x%x\n", cmd->cmnd[0],
3146 (unsigned long long)scsi_get_lba(cmd),
3147 blk_rq_sectors(cmd->request), bgstat, bghm);
3148 }
3149
3150 if (lpfc_bgs_get_apptag_err(bgstat)) {
3151 ret = 1;
3152
3153 scsi_build_sense_buffer(1, cmd->sense_buffer, ILLEGAL_REQUEST,
3154 0x10, 0x2);
3155 cmd->result = DRIVER_SENSE << 24
3156 | ScsiResult(DID_ABORT, SAM_STAT_CHECK_CONDITION);
3157
3158 phba->bg_apptag_err_cnt++;
3159 lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
3160 "9061 BLKGRD: App Tag error in cmd"
3161 " 0x%x lba 0x%llx blk cnt 0x%x "
3162 "bgstat=x%x bghm=x%x\n", cmd->cmnd[0],
3163 (unsigned long long)scsi_get_lba(cmd),
3164 blk_rq_sectors(cmd->request), bgstat, bghm);
3165 }
3166
3167 if (lpfc_bgs_get_hi_water_mark_present(bgstat)) {
3168
3169
3170
3171
3172
3173
3174 cmd->sense_buffer[7] = 0xc;
3175 cmd->sense_buffer[8] = 0;
3176 cmd->sense_buffer[9] = 0xa;
3177 cmd->sense_buffer[10] = 0x80;
3178
3179
3180 switch (scsi_get_prot_op(cmd)) {
3181 case SCSI_PROT_READ_INSERT:
3182 case SCSI_PROT_WRITE_STRIP:
3183 bghm /= cmd->device->sector_size;
3184 break;
3185 case SCSI_PROT_READ_STRIP:
3186 case SCSI_PROT_WRITE_INSERT:
3187 case SCSI_PROT_READ_PASS:
3188 case SCSI_PROT_WRITE_PASS:
3189 bghm /= (cmd->device->sector_size +
3190 sizeof(struct scsi_dif_tuple));
3191 break;
3192 }
3193
3194 failing_sector = scsi_get_lba(cmd);
3195 failing_sector += bghm;
3196
3197
3198 put_unaligned_be64(failing_sector, &cmd->sense_buffer[12]);
3199 }
3200
3201 if (!ret) {
3202
3203 lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
3204 "9057 BLKGRD: Unknown error in cmd"
3205 " 0x%x lba 0x%llx blk cnt 0x%x "
3206 "bgstat=x%x bghm=x%x\n", cmd->cmnd[0],
3207 (unsigned long long)scsi_get_lba(cmd),
3208 blk_rq_sectors(cmd->request), bgstat, bghm);
3209
3210
3211 lpfc_calc_bg_err(phba, lpfc_cmd);
3212 }
3213out:
3214 return ret;
3215}
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229static int
3230lpfc_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
3231{
3232 struct scsi_cmnd *scsi_cmnd = lpfc_cmd->pCmd;
3233 struct scatterlist *sgel = NULL;
3234 struct fcp_cmnd *fcp_cmnd = lpfc_cmd->fcp_cmnd;
3235 struct sli4_sge *sgl = (struct sli4_sge *)lpfc_cmd->fcp_bpl;
3236 struct sli4_sge *first_data_sgl;
3237 IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;
3238 dma_addr_t physaddr;
3239 uint32_t num_bde = 0;
3240 uint32_t dma_len;
3241 uint32_t dma_offset = 0;
3242 int nseg;
3243 struct ulp_bde64 *bde;
3244
3245
3246
3247
3248
3249
3250
3251 if (scsi_sg_count(scsi_cmnd)) {
3252
3253
3254
3255
3256
3257
3258
3259 nseg = scsi_dma_map(scsi_cmnd);
3260 if (unlikely(nseg <= 0))
3261 return 1;
3262 sgl += 1;
3263
3264 sgl->word2 = le32_to_cpu(sgl->word2);
3265 bf_set(lpfc_sli4_sge_last, sgl, 0);
3266 sgl->word2 = cpu_to_le32(sgl->word2);
3267 sgl += 1;
3268 first_data_sgl = sgl;
3269 lpfc_cmd->seg_cnt = nseg;
3270 if (lpfc_cmd->seg_cnt > phba->cfg_sg_seg_cnt) {
3271 lpfc_printf_log(phba, KERN_ERR, LOG_BG, "9074 BLKGRD:"
3272 " %s: Too many sg segments from "
3273 "dma_map_sg. Config %d, seg_cnt %d\n",
3274 __func__, phba->cfg_sg_seg_cnt,
3275 lpfc_cmd->seg_cnt);
3276 lpfc_cmd->seg_cnt = 0;
3277 scsi_dma_unmap(scsi_cmnd);
3278 return 1;
3279 }
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290 scsi_for_each_sg(scsi_cmnd, sgel, nseg, num_bde) {
3291 physaddr = sg_dma_address(sgel);
3292 dma_len = sg_dma_len(sgel);
3293 sgl->addr_lo = cpu_to_le32(putPaddrLow(physaddr));
3294 sgl->addr_hi = cpu_to_le32(putPaddrHigh(physaddr));
3295 sgl->word2 = le32_to_cpu(sgl->word2);
3296 if ((num_bde + 1) == nseg)
3297 bf_set(lpfc_sli4_sge_last, sgl, 1);
3298 else
3299 bf_set(lpfc_sli4_sge_last, sgl, 0);
3300 bf_set(lpfc_sli4_sge_offset, sgl, dma_offset);
3301 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DATA);
3302 sgl->word2 = cpu_to_le32(sgl->word2);
3303 sgl->sge_len = cpu_to_le32(dma_len);
3304 dma_offset += dma_len;
3305 sgl++;
3306 }
3307
3308 if (phba->sli3_options & LPFC_SLI4_PERFH_ENABLED) {
3309 bde = (struct ulp_bde64 *)
3310 &(iocb_cmd->unsli3.sli3Words[5]);
3311 bde->addrLow = first_data_sgl->addr_lo;
3312 bde->addrHigh = first_data_sgl->addr_hi;
3313 bde->tus.f.bdeSize =
3314 le32_to_cpu(first_data_sgl->sge_len);
3315 bde->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
3316 bde->tus.w = cpu_to_le32(bde->tus.w);
3317 }
3318 } else {
3319 sgl += 1;
3320
3321 sgl->word2 = le32_to_cpu(sgl->word2);
3322 bf_set(lpfc_sli4_sge_last, sgl, 1);
3323 sgl->word2 = cpu_to_le32(sgl->word2);
3324 }
3325
3326
3327
3328
3329
3330
3331
3332 fcp_cmnd->fcpDl = cpu_to_be32(scsi_bufflen(scsi_cmnd));
3333
3334
3335
3336
3337
3338 iocb_cmd->un.fcpi.fcpi_parm = scsi_bufflen(scsi_cmnd);
3339
3340
3341
3342
3343
3344 if ((phba->cfg_fof) && ((struct lpfc_device_data *)
3345 scsi_cmnd->device->hostdata)->oas_enabled) {
3346 lpfc_cmd->cur_iocbq.iocb_flag |= (LPFC_IO_OAS | LPFC_IO_FOF);
3347 lpfc_cmd->cur_iocbq.priority = ((struct lpfc_device_data *)
3348 scsi_cmnd->device->hostdata)->priority;
3349 }
3350 return 0;
3351}
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362static int
3363lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba,
3364 struct lpfc_scsi_buf *lpfc_cmd)
3365{
3366 struct scsi_cmnd *scsi_cmnd = lpfc_cmd->pCmd;
3367 struct fcp_cmnd *fcp_cmnd = lpfc_cmd->fcp_cmnd;
3368 struct sli4_sge *sgl = (struct sli4_sge *)(lpfc_cmd->fcp_bpl);
3369 IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;
3370 uint32_t num_sge = 0;
3371 int datasegcnt, protsegcnt, datadir = scsi_cmnd->sc_data_direction;
3372 int prot_group_type = 0;
3373 int fcpdl;
3374
3375
3376
3377
3378
3379 if (scsi_sg_count(scsi_cmnd)) {
3380
3381
3382
3383
3384
3385
3386 datasegcnt = dma_map_sg(&phba->pcidev->dev,
3387 scsi_sglist(scsi_cmnd),
3388 scsi_sg_count(scsi_cmnd), datadir);
3389 if (unlikely(!datasegcnt))
3390 return 1;
3391
3392 sgl += 1;
3393
3394 sgl->word2 = le32_to_cpu(sgl->word2);
3395 bf_set(lpfc_sli4_sge_last, sgl, 0);
3396 sgl->word2 = cpu_to_le32(sgl->word2);
3397
3398 sgl += 1;
3399 lpfc_cmd->seg_cnt = datasegcnt;
3400
3401
3402 if (lpfc_cmd->seg_cnt > phba->cfg_sg_seg_cnt)
3403 goto err;
3404
3405 prot_group_type = lpfc_prot_group_type(phba, scsi_cmnd);
3406
3407 switch (prot_group_type) {
3408 case LPFC_PG_TYPE_NO_DIF:
3409
3410 if ((lpfc_cmd->seg_cnt + 1) > phba->cfg_total_seg_cnt)
3411 goto err;
3412
3413 num_sge = lpfc_bg_setup_sgl(phba, scsi_cmnd, sgl,
3414 datasegcnt);
3415
3416
3417 if (num_sge < 2)
3418 goto err;
3419 break;
3420
3421 case LPFC_PG_TYPE_DIF_BUF:
3422
3423
3424
3425
3426
3427 protsegcnt = dma_map_sg(&phba->pcidev->dev,
3428 scsi_prot_sglist(scsi_cmnd),
3429 scsi_prot_sg_count(scsi_cmnd), datadir);
3430 if (unlikely(!protsegcnt)) {
3431 scsi_dma_unmap(scsi_cmnd);
3432 return 1;
3433 }
3434
3435 lpfc_cmd->prot_seg_cnt = protsegcnt;
3436
3437
3438
3439
3440 if ((lpfc_cmd->prot_seg_cnt * 3) >
3441 (phba->cfg_total_seg_cnt - 2))
3442 goto err;
3443
3444 num_sge = lpfc_bg_setup_sgl_prot(phba, scsi_cmnd, sgl,
3445 datasegcnt, protsegcnt);
3446
3447
3448 if ((num_sge < 3) ||
3449 (num_sge > phba->cfg_total_seg_cnt))
3450 goto err;
3451 break;
3452
3453 case LPFC_PG_TYPE_INVALID:
3454 default:
3455 scsi_dma_unmap(scsi_cmnd);
3456 lpfc_cmd->seg_cnt = 0;
3457
3458 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
3459 "9083 Unexpected protection group %i\n",
3460 prot_group_type);
3461 return 1;
3462 }
3463 }
3464
3465 switch (scsi_get_prot_op(scsi_cmnd)) {
3466 case SCSI_PROT_WRITE_STRIP:
3467 case SCSI_PROT_READ_STRIP:
3468 lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_DIF_STRIP;
3469 break;
3470 case SCSI_PROT_WRITE_INSERT:
3471 case SCSI_PROT_READ_INSERT:
3472 lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_DIF_INSERT;
3473 break;
3474 case SCSI_PROT_WRITE_PASS:
3475 case SCSI_PROT_READ_PASS:
3476 lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_DIF_PASS;
3477 break;
3478 }
3479
3480 fcpdl = lpfc_bg_scsi_adjust_dl(phba, lpfc_cmd);
3481 fcp_cmnd->fcpDl = be32_to_cpu(fcpdl);
3482
3483
3484
3485
3486
3487 iocb_cmd->un.fcpi.fcpi_parm = fcpdl;
3488
3489
3490
3491
3492
3493 if ((phba->cfg_fof) && ((struct lpfc_device_data *)
3494 scsi_cmnd->device->hostdata)->oas_enabled)
3495 lpfc_cmd->cur_iocbq.iocb_flag |= (LPFC_IO_OAS | LPFC_IO_FOF);
3496
3497 return 0;
3498err:
3499 if (lpfc_cmd->seg_cnt)
3500 scsi_dma_unmap(scsi_cmnd);
3501 if (lpfc_cmd->prot_seg_cnt)
3502 dma_unmap_sg(&phba->pcidev->dev, scsi_prot_sglist(scsi_cmnd),
3503 scsi_prot_sg_count(scsi_cmnd),
3504 scsi_cmnd->sc_data_direction);
3505
3506 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
3507 "9084 Cannot setup S/G List for HBA"
3508 "IO segs %d/%d SGL %d SCSI %d: %d %d\n",
3509 lpfc_cmd->seg_cnt, lpfc_cmd->prot_seg_cnt,
3510 phba->cfg_total_seg_cnt, phba->cfg_sg_seg_cnt,
3511 prot_group_type, num_sge);
3512
3513 lpfc_cmd->seg_cnt = 0;
3514 lpfc_cmd->prot_seg_cnt = 0;
3515 return 1;
3516}
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530static inline int
3531lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
3532{
3533 return phba->lpfc_scsi_prep_dma_buf(phba, lpfc_cmd);
3534}
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549static inline int
3550lpfc_bg_scsi_prep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
3551{
3552 return phba->lpfc_bg_scsi_prep_dma_buf(phba, lpfc_cmd);
3553}
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565static void
3566lpfc_send_scsi_error_event(struct lpfc_hba *phba, struct lpfc_vport *vport,
3567 struct lpfc_scsi_buf *lpfc_cmd, struct lpfc_iocbq *rsp_iocb) {
3568 struct scsi_cmnd *cmnd = lpfc_cmd->pCmd;
3569 struct fcp_rsp *fcprsp = lpfc_cmd->fcp_rsp;
3570 uint32_t resp_info = fcprsp->rspStatus2;
3571 uint32_t scsi_status = fcprsp->rspStatus3;
3572 uint32_t fcpi_parm = rsp_iocb->iocb.un.fcpi.fcpi_parm;
3573 struct lpfc_fast_path_event *fast_path_evt = NULL;
3574 struct lpfc_nodelist *pnode = lpfc_cmd->rdata->pnode;
3575 unsigned long flags;
3576
3577 if (!pnode || !NLP_CHK_NODE_ACT(pnode))
3578 return;
3579
3580
3581 if ((cmnd->result == SAM_STAT_TASK_SET_FULL) ||
3582 (cmnd->result == SAM_STAT_BUSY)) {
3583 fast_path_evt = lpfc_alloc_fast_evt(phba);
3584 if (!fast_path_evt)
3585 return;
3586 fast_path_evt->un.scsi_evt.event_type =
3587 FC_REG_SCSI_EVENT;
3588 fast_path_evt->un.scsi_evt.subcategory =
3589 (cmnd->result == SAM_STAT_TASK_SET_FULL) ?
3590 LPFC_EVENT_QFULL : LPFC_EVENT_DEVBSY;
3591 fast_path_evt->un.scsi_evt.lun = cmnd->device->lun;
3592 memcpy(&fast_path_evt->un.scsi_evt.wwpn,
3593 &pnode->nlp_portname, sizeof(struct lpfc_name));
3594 memcpy(&fast_path_evt->un.scsi_evt.wwnn,
3595 &pnode->nlp_nodename, sizeof(struct lpfc_name));
3596 } else if ((resp_info & SNS_LEN_VALID) && fcprsp->rspSnsLen &&
3597 ((cmnd->cmnd[0] == READ_10) || (cmnd->cmnd[0] == WRITE_10))) {
3598 fast_path_evt = lpfc_alloc_fast_evt(phba);
3599 if (!fast_path_evt)
3600 return;
3601 fast_path_evt->un.check_cond_evt.scsi_event.event_type =
3602 FC_REG_SCSI_EVENT;
3603 fast_path_evt->un.check_cond_evt.scsi_event.subcategory =
3604 LPFC_EVENT_CHECK_COND;
3605 fast_path_evt->un.check_cond_evt.scsi_event.lun =
3606 cmnd->device->lun;
3607 memcpy(&fast_path_evt->un.check_cond_evt.scsi_event.wwpn,
3608 &pnode->nlp_portname, sizeof(struct lpfc_name));
3609 memcpy(&fast_path_evt->un.check_cond_evt.scsi_event.wwnn,
3610 &pnode->nlp_nodename, sizeof(struct lpfc_name));
3611 fast_path_evt->un.check_cond_evt.sense_key =
3612 cmnd->sense_buffer[2] & 0xf;
3613 fast_path_evt->un.check_cond_evt.asc = cmnd->sense_buffer[12];
3614 fast_path_evt->un.check_cond_evt.ascq = cmnd->sense_buffer[13];
3615 } else if ((cmnd->sc_data_direction == DMA_FROM_DEVICE) &&
3616 fcpi_parm &&
3617 ((be32_to_cpu(fcprsp->rspResId) != fcpi_parm) ||
3618 ((scsi_status == SAM_STAT_GOOD) &&
3619 !(resp_info & (RESID_UNDER | RESID_OVER))))) {
3620
3621
3622
3623
3624 fast_path_evt = lpfc_alloc_fast_evt(phba);
3625 if (!fast_path_evt)
3626 return;
3627 fast_path_evt->un.read_check_error.header.event_type =
3628 FC_REG_FABRIC_EVENT;
3629 fast_path_evt->un.read_check_error.header.subcategory =
3630 LPFC_EVENT_FCPRDCHKERR;
3631 memcpy(&fast_path_evt->un.read_check_error.header.wwpn,
3632 &pnode->nlp_portname, sizeof(struct lpfc_name));
3633 memcpy(&fast_path_evt->un.read_check_error.header.wwnn,
3634 &pnode->nlp_nodename, sizeof(struct lpfc_name));
3635 fast_path_evt->un.read_check_error.lun = cmnd->device->lun;
3636 fast_path_evt->un.read_check_error.opcode = cmnd->cmnd[0];
3637 fast_path_evt->un.read_check_error.fcpiparam =
3638 fcpi_parm;
3639 } else
3640 return;
3641
3642 fast_path_evt->vport = vport;
3643 spin_lock_irqsave(&phba->hbalock, flags);
3644 list_add_tail(&fast_path_evt->work_evt.evt_listp, &phba->work_list);
3645 spin_unlock_irqrestore(&phba->hbalock, flags);
3646 lpfc_worker_wake_up(phba);
3647 return;
3648}
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658static void
3659lpfc_scsi_unprep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *psb)
3660{
3661
3662
3663
3664
3665
3666
3667 if (psb->seg_cnt > 0)
3668 scsi_dma_unmap(psb->pCmd);
3669 if (psb->prot_seg_cnt > 0)
3670 dma_unmap_sg(&phba->pcidev->dev, scsi_prot_sglist(psb->pCmd),
3671 scsi_prot_sg_count(psb->pCmd),
3672 psb->pCmd->sc_data_direction);
3673}
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685static void
3686lpfc_handle_fcp_err(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,
3687 struct lpfc_iocbq *rsp_iocb)
3688{
3689 struct lpfc_hba *phba = vport->phba;
3690 struct scsi_cmnd *cmnd = lpfc_cmd->pCmd;
3691 struct fcp_cmnd *fcpcmd = lpfc_cmd->fcp_cmnd;
3692 struct fcp_rsp *fcprsp = lpfc_cmd->fcp_rsp;
3693 uint32_t fcpi_parm = rsp_iocb->iocb.un.fcpi.fcpi_parm;
3694 uint32_t resp_info = fcprsp->rspStatus2;
3695 uint32_t scsi_status = fcprsp->rspStatus3;
3696 uint32_t *lp;
3697 uint32_t host_status = DID_OK;
3698 uint32_t rsplen = 0;
3699 uint32_t fcpDl;
3700 uint32_t logit = LOG_FCP | LOG_FCP_ERROR;
3701
3702
3703
3704
3705
3706
3707
3708 if (fcpcmd->fcpCntl2) {
3709 scsi_status = 0;
3710 goto out;
3711 }
3712
3713 if (resp_info & RSP_LEN_VALID) {
3714 rsplen = be32_to_cpu(fcprsp->rspRspLen);
3715 if (rsplen != 0 && rsplen != 4 && rsplen != 8) {
3716 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
3717 "2719 Invalid response length: "
3718 "tgt x%x lun x%llx cmnd x%x rsplen x%x\n",
3719 cmnd->device->id,
3720 cmnd->device->lun, cmnd->cmnd[0],
3721 rsplen);
3722 host_status = DID_ERROR;
3723 goto out;
3724 }
3725 if (fcprsp->rspInfo3 != RSP_NO_FAILURE) {
3726 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
3727 "2757 Protocol failure detected during "
3728 "processing of FCP I/O op: "
3729 "tgt x%x lun x%llx cmnd x%x rspInfo3 x%x\n",
3730 cmnd->device->id,
3731 cmnd->device->lun, cmnd->cmnd[0],
3732 fcprsp->rspInfo3);
3733 host_status = DID_ERROR;
3734 goto out;
3735 }
3736 }
3737
3738 if ((resp_info & SNS_LEN_VALID) && fcprsp->rspSnsLen) {
3739 uint32_t snslen = be32_to_cpu(fcprsp->rspSnsLen);
3740 if (snslen > SCSI_SENSE_BUFFERSIZE)
3741 snslen = SCSI_SENSE_BUFFERSIZE;
3742
3743 if (resp_info & RSP_LEN_VALID)
3744 rsplen = be32_to_cpu(fcprsp->rspRspLen);
3745 memcpy(cmnd->sense_buffer, &fcprsp->rspInfo0 + rsplen, snslen);
3746 }
3747 lp = (uint32_t *)cmnd->sense_buffer;
3748
3749
3750 if (!scsi_status && (resp_info & RESID_UNDER)) {
3751
3752 if (vport->cfg_log_verbose & LOG_FCP)
3753 logit = LOG_FCP_ERROR;
3754
3755 if (vport->cfg_log_verbose & LOG_FCP_UNDER)
3756 logit = LOG_FCP_UNDER;
3757 }
3758
3759 lpfc_printf_vlog(vport, KERN_WARNING, logit,
3760 "9024 FCP command x%x failed: x%x SNS x%x x%x "
3761 "Data: x%x x%x x%x x%x x%x\n",
3762 cmnd->cmnd[0], scsi_status,
3763 be32_to_cpu(*lp), be32_to_cpu(*(lp + 3)), resp_info,
3764 be32_to_cpu(fcprsp->rspResId),
3765 be32_to_cpu(fcprsp->rspSnsLen),
3766 be32_to_cpu(fcprsp->rspRspLen),
3767 fcprsp->rspInfo3);
3768
3769 scsi_set_resid(cmnd, 0);
3770 fcpDl = be32_to_cpu(fcpcmd->fcpDl);
3771 if (resp_info & RESID_UNDER) {
3772 scsi_set_resid(cmnd, be32_to_cpu(fcprsp->rspResId));
3773
3774 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP_UNDER,
3775 "9025 FCP Read Underrun, expected %d, "
3776 "residual %d Data: x%x x%x x%x\n",
3777 fcpDl,
3778 scsi_get_resid(cmnd), fcpi_parm, cmnd->cmnd[0],
3779 cmnd->underflow);
3780
3781
3782
3783
3784
3785
3786 if ((cmnd->sc_data_direction == DMA_FROM_DEVICE) &&
3787 fcpi_parm &&
3788 (scsi_get_resid(cmnd) != fcpi_parm)) {
3789 lpfc_printf_vlog(vport, KERN_WARNING,
3790 LOG_FCP | LOG_FCP_ERROR,
3791 "9026 FCP Read Check Error "
3792 "and Underrun Data: x%x x%x x%x x%x\n",
3793 fcpDl,
3794 scsi_get_resid(cmnd), fcpi_parm,
3795 cmnd->cmnd[0]);
3796 scsi_set_resid(cmnd, scsi_bufflen(cmnd));
3797 host_status = DID_ERROR;
3798 }
3799
3800
3801
3802
3803
3804
3805 if (!(resp_info & SNS_LEN_VALID) &&
3806 (scsi_status == SAM_STAT_GOOD) &&
3807 (scsi_bufflen(cmnd) - scsi_get_resid(cmnd)
3808 < cmnd->underflow)) {
3809 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
3810 "9027 FCP command x%x residual "
3811 "underrun converted to error "
3812 "Data: x%x x%x x%x\n",
3813 cmnd->cmnd[0], scsi_bufflen(cmnd),
3814 scsi_get_resid(cmnd), cmnd->underflow);
3815 host_status = DID_ERROR;
3816 }
3817 } else if (resp_info & RESID_OVER) {
3818 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
3819 "9028 FCP command x%x residual overrun error. "
3820 "Data: x%x x%x\n", cmnd->cmnd[0],
3821 scsi_bufflen(cmnd), scsi_get_resid(cmnd));
3822 host_status = DID_ERROR;
3823
3824
3825
3826
3827
3828 } else if (fcpi_parm) {
3829 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP | LOG_FCP_ERROR,
3830 "9029 FCP %s Check Error xri x%x Data: "
3831 "x%x x%x x%x x%x x%x\n",
3832 ((cmnd->sc_data_direction == DMA_FROM_DEVICE) ?
3833 "Read" : "Write"),
3834 ((phba->sli_rev == LPFC_SLI_REV4) ?
3835 lpfc_cmd->cur_iocbq.sli4_xritag :
3836 rsp_iocb->iocb.ulpContext),
3837 fcpDl, be32_to_cpu(fcprsp->rspResId),
3838 fcpi_parm, cmnd->cmnd[0], scsi_status);
3839
3840
3841
3842
3843
3844 if (fcpi_parm > fcpDl)
3845 goto out;
3846
3847 switch (scsi_status) {
3848 case SAM_STAT_GOOD:
3849 case SAM_STAT_CHECK_CONDITION:
3850
3851
3852
3853
3854
3855 host_status = DID_ERROR;
3856 break;
3857 }
3858 scsi_set_resid(cmnd, scsi_bufflen(cmnd));
3859 }
3860
3861 out:
3862 cmnd->result = ScsiResult(host_status, scsi_status);
3863 lpfc_send_scsi_error_event(vport->phba, vport, lpfc_cmd, rsp_iocb);
3864}
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878int lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba,
3879 struct lpfc_scsi_buf *lpfc_cmd)
3880{
3881 struct scsi_cmnd *cmnd = lpfc_cmd->pCmd;
3882 struct lpfc_vector_map_info *cpup;
3883 int chann, cpu;
3884 uint32_t tag;
3885 uint16_t hwq;
3886
3887 if (cmnd && shost_use_blk_mq(cmnd->device->host)) {
3888 tag = blk_mq_unique_tag(cmnd->request);
3889 hwq = blk_mq_unique_tag_to_hwq(tag);
3890
3891 return hwq;
3892 }
3893
3894 if (phba->cfg_fcp_io_sched == LPFC_FCP_SCHED_BY_CPU
3895 && phba->cfg_fcp_io_channel > 1) {
3896 cpu = smp_processor_id();
3897 if (cpu < phba->sli4_hba.num_present_cpu) {
3898 cpup = phba->sli4_hba.cpu_map;
3899 cpup += cpu;
3900 return cpup->channel_id;
3901 }
3902 }
3903 chann = atomic_add_return(1, &phba->fcp_qidx);
3904 chann = chann % phba->cfg_fcp_io_channel;
3905 return chann;
3906}
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919static void
3920lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
3921 struct lpfc_iocbq *pIocbOut)
3922{
3923 struct lpfc_scsi_buf *lpfc_cmd =
3924 (struct lpfc_scsi_buf *) pIocbIn->context1;
3925 struct lpfc_vport *vport = pIocbIn->vport;
3926 struct lpfc_rport_data *rdata = lpfc_cmd->rdata;
3927 struct lpfc_nodelist *pnode = rdata->pnode;
3928 struct scsi_cmnd *cmd;
3929 int depth;
3930 unsigned long flags;
3931 struct lpfc_fast_path_event *fast_path_evt;
3932 struct Scsi_Host *shost;
3933 uint32_t logit = LOG_FCP;
3934
3935 atomic_inc(&phba->fc4ScsiIoCmpls);
3936
3937
3938 cmd = lpfc_cmd->pCmd;
3939 if (!cmd)
3940 return;
3941 shost = cmd->device->host;
3942
3943 lpfc_cmd->result = (pIocbOut->iocb.un.ulpWord[4] & IOERR_PARAM_MASK);
3944 lpfc_cmd->status = pIocbOut->iocb.ulpStatus;
3945
3946 lpfc_cmd->exch_busy = pIocbOut->iocb_flag & LPFC_EXCHANGE_BUSY;
3947
3948#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
3949 if (lpfc_cmd->prot_data_type) {
3950 struct scsi_dif_tuple *src = NULL;
3951
3952 src = (struct scsi_dif_tuple *)lpfc_cmd->prot_data_segment;
3953
3954
3955
3956
3957 switch (lpfc_cmd->prot_data_type) {
3958 case LPFC_INJERR_REFTAG:
3959 src->ref_tag =
3960 lpfc_cmd->prot_data;
3961 break;
3962 case LPFC_INJERR_APPTAG:
3963 src->app_tag =
3964 (uint16_t)lpfc_cmd->prot_data;
3965 break;
3966 case LPFC_INJERR_GUARD:
3967 src->guard_tag =
3968 (uint16_t)lpfc_cmd->prot_data;
3969 break;
3970 default:
3971 break;
3972 }
3973
3974 lpfc_cmd->prot_data = 0;
3975 lpfc_cmd->prot_data_type = 0;
3976 lpfc_cmd->prot_data_segment = NULL;
3977 }
3978#endif
3979
3980 if (pnode && NLP_CHK_NODE_ACT(pnode))
3981 atomic_dec(&pnode->cmd_pending);
3982
3983 if (lpfc_cmd->status) {
3984 if (lpfc_cmd->status == IOSTAT_LOCAL_REJECT &&
3985 (lpfc_cmd->result & IOERR_DRVR_MASK))
3986 lpfc_cmd->status = IOSTAT_DRIVER_REJECT;
3987 else if (lpfc_cmd->status >= IOSTAT_CNT)
3988 lpfc_cmd->status = IOSTAT_DEFAULT;
3989 if (lpfc_cmd->status == IOSTAT_FCP_RSP_ERROR &&
3990 !lpfc_cmd->fcp_rsp->rspStatus3 &&
3991 (lpfc_cmd->fcp_rsp->rspStatus2 & RESID_UNDER) &&
3992 !(vport->cfg_log_verbose & LOG_FCP_UNDER))
3993 logit = 0;
3994 else
3995 logit = LOG_FCP | LOG_FCP_UNDER;
3996 lpfc_printf_vlog(vport, KERN_WARNING, logit,
3997 "9030 FCP cmd x%x failed <%d/%lld> "
3998 "status: x%x result: x%x "
3999 "sid: x%x did: x%x oxid: x%x "
4000 "Data: x%x x%x\n",
4001 cmd->cmnd[0],
4002 cmd->device ? cmd->device->id : 0xffff,
4003 cmd->device ? cmd->device->lun : 0xffff,
4004 lpfc_cmd->status, lpfc_cmd->result,
4005 vport->fc_myDID,
4006 (pnode) ? pnode->nlp_DID : 0,
4007 phba->sli_rev == LPFC_SLI_REV4 ?
4008 lpfc_cmd->cur_iocbq.sli4_xritag : 0xffff,
4009 pIocbOut->iocb.ulpContext,
4010 lpfc_cmd->cur_iocbq.iocb.ulpIoTag);
4011
4012 switch (lpfc_cmd->status) {
4013 case IOSTAT_FCP_RSP_ERROR:
4014
4015 lpfc_handle_fcp_err(vport, lpfc_cmd, pIocbOut);
4016 break;
4017 case IOSTAT_NPORT_BSY:
4018 case IOSTAT_FABRIC_BSY:
4019 cmd->result = ScsiResult(DID_TRANSPORT_DISRUPTED, 0);
4020 fast_path_evt = lpfc_alloc_fast_evt(phba);
4021 if (!fast_path_evt)
4022 break;
4023 fast_path_evt->un.fabric_evt.event_type =
4024 FC_REG_FABRIC_EVENT;
4025 fast_path_evt->un.fabric_evt.subcategory =
4026 (lpfc_cmd->status == IOSTAT_NPORT_BSY) ?
4027 LPFC_EVENT_PORT_BUSY : LPFC_EVENT_FABRIC_BUSY;
4028 if (pnode && NLP_CHK_NODE_ACT(pnode)) {
4029 memcpy(&fast_path_evt->un.fabric_evt.wwpn,
4030 &pnode->nlp_portname,
4031 sizeof(struct lpfc_name));
4032 memcpy(&fast_path_evt->un.fabric_evt.wwnn,
4033 &pnode->nlp_nodename,
4034 sizeof(struct lpfc_name));
4035 }
4036 fast_path_evt->vport = vport;
4037 fast_path_evt->work_evt.evt =
4038 LPFC_EVT_FASTPATH_MGMT_EVT;
4039 spin_lock_irqsave(&phba->hbalock, flags);
4040 list_add_tail(&fast_path_evt->work_evt.evt_listp,
4041 &phba->work_list);
4042 spin_unlock_irqrestore(&phba->hbalock, flags);
4043 lpfc_worker_wake_up(phba);
4044 break;
4045 case IOSTAT_LOCAL_REJECT:
4046 case IOSTAT_REMOTE_STOP:
4047 if (lpfc_cmd->result == IOERR_ELXSEC_KEY_UNWRAP_ERROR ||
4048 lpfc_cmd->result ==
4049 IOERR_ELXSEC_KEY_UNWRAP_COMPARE_ERROR ||
4050 lpfc_cmd->result == IOERR_ELXSEC_CRYPTO_ERROR ||
4051 lpfc_cmd->result ==
4052 IOERR_ELXSEC_CRYPTO_COMPARE_ERROR) {
4053 cmd->result = ScsiResult(DID_NO_CONNECT, 0);
4054 break;
4055 }
4056 if (lpfc_cmd->result == IOERR_INVALID_RPI ||
4057 lpfc_cmd->result == IOERR_NO_RESOURCES ||
4058 lpfc_cmd->result == IOERR_ABORT_REQUESTED ||
4059 lpfc_cmd->result == IOERR_SLER_CMD_RCV_FAILURE) {
4060 cmd->result = ScsiResult(DID_REQUEUE, 0);
4061 break;
4062 }
4063 if ((lpfc_cmd->result == IOERR_RX_DMA_FAILED ||
4064 lpfc_cmd->result == IOERR_TX_DMA_FAILED) &&
4065 pIocbOut->iocb.unsli3.sli3_bg.bgstat) {
4066 if (scsi_get_prot_op(cmd) != SCSI_PROT_NORMAL) {
4067
4068
4069
4070
4071 lpfc_parse_bg_err(phba, lpfc_cmd,
4072 pIocbOut);
4073 break;
4074 } else {
4075 lpfc_printf_vlog(vport, KERN_WARNING,
4076 LOG_BG,
4077 "9031 non-zero BGSTAT "
4078 "on unprotected cmd\n");
4079 }
4080 }
4081 if ((lpfc_cmd->status == IOSTAT_REMOTE_STOP)
4082 && (phba->sli_rev == LPFC_SLI_REV4)
4083 && (pnode && NLP_CHK_NODE_ACT(pnode))) {
4084
4085
4086
4087
4088 lpfc_set_rrq_active(phba, pnode,
4089 lpfc_cmd->cur_iocbq.sli4_lxritag,
4090 0, 0);
4091 }
4092
4093 default:
4094 cmd->result = ScsiResult(DID_ERROR, 0);
4095 break;
4096 }
4097
4098 if (!pnode || !NLP_CHK_NODE_ACT(pnode)
4099 || (pnode->nlp_state != NLP_STE_MAPPED_NODE))
4100 cmd->result = ScsiResult(DID_TRANSPORT_DISRUPTED,
4101 SAM_STAT_BUSY);
4102 } else
4103 cmd->result = ScsiResult(DID_OK, 0);
4104
4105 if (cmd->result || lpfc_cmd->fcp_rsp->rspSnsLen) {
4106 uint32_t *lp = (uint32_t *)cmd->sense_buffer;
4107
4108 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
4109 "0710 Iodone <%d/%llu> cmd %p, error "
4110 "x%x SNS x%x x%x Data: x%x x%x\n",
4111 cmd->device->id, cmd->device->lun, cmd,
4112 cmd->result, *lp, *(lp + 3), cmd->retries,
4113 scsi_get_resid(cmd));
4114 }
4115
4116 lpfc_update_stats(phba, lpfc_cmd);
4117 if (vport->cfg_max_scsicmpl_time &&
4118 time_after(jiffies, lpfc_cmd->start_time +
4119 msecs_to_jiffies(vport->cfg_max_scsicmpl_time))) {
4120 spin_lock_irqsave(shost->host_lock, flags);
4121 if (pnode && NLP_CHK_NODE_ACT(pnode)) {
4122 if (pnode->cmd_qdepth >
4123 atomic_read(&pnode->cmd_pending) &&
4124 (atomic_read(&pnode->cmd_pending) >
4125 LPFC_MIN_TGT_QDEPTH) &&
4126 ((cmd->cmnd[0] == READ_10) ||
4127 (cmd->cmnd[0] == WRITE_10)))
4128 pnode->cmd_qdepth =
4129 atomic_read(&pnode->cmd_pending);
4130
4131 pnode->last_change_time = jiffies;
4132 }
4133 spin_unlock_irqrestore(shost->host_lock, flags);
4134 } else if (pnode && NLP_CHK_NODE_ACT(pnode)) {
4135 if ((pnode->cmd_qdepth < vport->cfg_tgt_queue_depth) &&
4136 time_after(jiffies, pnode->last_change_time +
4137 msecs_to_jiffies(LPFC_TGTQ_INTERVAL))) {
4138 spin_lock_irqsave(shost->host_lock, flags);
4139 depth = pnode->cmd_qdepth * LPFC_TGTQ_RAMPUP_PCENT
4140 / 100;
4141 depth = depth ? depth : 1;
4142 pnode->cmd_qdepth += depth;
4143 if (pnode->cmd_qdepth > vport->cfg_tgt_queue_depth)
4144 pnode->cmd_qdepth = vport->cfg_tgt_queue_depth;
4145 pnode->last_change_time = jiffies;
4146 spin_unlock_irqrestore(shost->host_lock, flags);
4147 }
4148 }
4149
4150 lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd);
4151
4152 spin_lock_irqsave(&phba->hbalock, flags);
4153 lpfc_cmd->pCmd = NULL;
4154 spin_unlock_irqrestore(&phba->hbalock, flags);
4155
4156
4157 cmd->scsi_done(cmd);
4158
4159
4160
4161
4162
4163 spin_lock_irqsave(shost->host_lock, flags);
4164 if (lpfc_cmd->waitq)
4165 wake_up(lpfc_cmd->waitq);
4166 spin_unlock_irqrestore(shost->host_lock, flags);
4167
4168 lpfc_release_scsi_buf(phba, lpfc_cmd);
4169}
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179static void
4180lpfc_fcpcmd_to_iocb(uint8_t *data, struct fcp_cmnd *fcp_cmnd)
4181{
4182 int i, j;
4183 for (i = 0, j = 0; i < sizeof(struct fcp_cmnd);
4184 i += sizeof(uint32_t), j++) {
4185 ((uint32_t *)data)[j] = cpu_to_be32(((uint32_t *)fcp_cmnd)[j]);
4186 }
4187}
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198static void
4199lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,
4200 struct lpfc_nodelist *pnode)
4201{
4202 struct lpfc_hba *phba = vport->phba;
4203 struct scsi_cmnd *scsi_cmnd = lpfc_cmd->pCmd;
4204 struct fcp_cmnd *fcp_cmnd = lpfc_cmd->fcp_cmnd;
4205 IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;
4206 struct lpfc_iocbq *piocbq = &(lpfc_cmd->cur_iocbq);
4207 int datadir = scsi_cmnd->sc_data_direction;
4208 uint8_t *ptr;
4209 bool sli4;
4210 uint32_t fcpdl;
4211
4212 if (!pnode || !NLP_CHK_NODE_ACT(pnode))
4213 return;
4214
4215 lpfc_cmd->fcp_rsp->rspSnsLen = 0;
4216
4217 lpfc_cmd->fcp_cmnd->fcpCntl2 = 0;
4218
4219 int_to_scsilun(lpfc_cmd->pCmd->device->lun,
4220 &lpfc_cmd->fcp_cmnd->fcp_lun);
4221
4222 ptr = &fcp_cmnd->fcpCdb[0];
4223 memcpy(ptr, scsi_cmnd->cmnd, scsi_cmnd->cmd_len);
4224 if (scsi_cmnd->cmd_len < LPFC_FCP_CDB_LEN) {
4225 ptr += scsi_cmnd->cmd_len;
4226 memset(ptr, 0, (LPFC_FCP_CDB_LEN - scsi_cmnd->cmd_len));
4227 }
4228
4229 fcp_cmnd->fcpCntl1 = SIMPLE_Q;
4230
4231 sli4 = (phba->sli_rev == LPFC_SLI_REV4);
4232 piocbq->iocb.un.fcpi.fcpi_XRdy = 0;
4233
4234
4235
4236
4237
4238
4239
4240 if (scsi_sg_count(scsi_cmnd)) {
4241 if (datadir == DMA_TO_DEVICE) {
4242 iocb_cmd->ulpCommand = CMD_FCP_IWRITE64_CR;
4243 iocb_cmd->ulpPU = PARM_READ_CHECK;
4244 if (vport->cfg_first_burst_size &&
4245 (pnode->nlp_flag & NLP_FIRSTBURST)) {
4246 fcpdl = scsi_bufflen(scsi_cmnd);
4247 if (fcpdl < vport->cfg_first_burst_size)
4248 piocbq->iocb.un.fcpi.fcpi_XRdy = fcpdl;
4249 else
4250 piocbq->iocb.un.fcpi.fcpi_XRdy =
4251 vport->cfg_first_burst_size;
4252 }
4253 fcp_cmnd->fcpCntl3 = WRITE_DATA;
4254 atomic_inc(&phba->fc4ScsiOutputRequests);
4255 } else {
4256 iocb_cmd->ulpCommand = CMD_FCP_IREAD64_CR;
4257 iocb_cmd->ulpPU = PARM_READ_CHECK;
4258 fcp_cmnd->fcpCntl3 = READ_DATA;
4259 atomic_inc(&phba->fc4ScsiInputRequests);
4260 }
4261 } else {
4262 iocb_cmd->ulpCommand = CMD_FCP_ICMND64_CR;
4263 iocb_cmd->un.fcpi.fcpi_parm = 0;
4264 iocb_cmd->ulpPU = 0;
4265 fcp_cmnd->fcpCntl3 = 0;
4266 atomic_inc(&phba->fc4ScsiControlRequests);
4267 }
4268 if (phba->sli_rev == 3 &&
4269 !(phba->sli3_options & LPFC_SLI3_BG_ENABLED))
4270 lpfc_fcpcmd_to_iocb(iocb_cmd->unsli3.fcp_ext.icd, fcp_cmnd);
4271
4272
4273
4274
4275 piocbq->iocb.ulpContext = pnode->nlp_rpi;
4276 if (sli4)
4277 piocbq->iocb.ulpContext =
4278 phba->sli4_hba.rpi_ids[pnode->nlp_rpi];
4279 if (pnode->nlp_fcp_info & NLP_FCP_2_DEVICE)
4280 piocbq->iocb.ulpFCP2Rcvy = 1;
4281 else
4282 piocbq->iocb.ulpFCP2Rcvy = 0;
4283
4284 piocbq->iocb.ulpClass = (pnode->nlp_fcp_info & 0x0f);
4285 piocbq->context1 = lpfc_cmd;
4286 piocbq->iocb_cmpl = lpfc_scsi_cmd_iocb_cmpl;
4287 piocbq->iocb.ulpTimeout = lpfc_cmd->timeout;
4288 piocbq->vport = vport;
4289}
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305static int
4306lpfc_scsi_prep_task_mgmt_cmd(struct lpfc_vport *vport,
4307 struct lpfc_scsi_buf *lpfc_cmd,
4308 uint64_t lun,
4309 uint8_t task_mgmt_cmd)
4310{
4311 struct lpfc_iocbq *piocbq;
4312 IOCB_t *piocb;
4313 struct fcp_cmnd *fcp_cmnd;
4314 struct lpfc_rport_data *rdata = lpfc_cmd->rdata;
4315 struct lpfc_nodelist *ndlp = rdata->pnode;
4316
4317 if (!ndlp || !NLP_CHK_NODE_ACT(ndlp) ||
4318 ndlp->nlp_state != NLP_STE_MAPPED_NODE)
4319 return 0;
4320
4321 piocbq = &(lpfc_cmd->cur_iocbq);
4322 piocbq->vport = vport;
4323
4324 piocb = &piocbq->iocb;
4325
4326 fcp_cmnd = lpfc_cmd->fcp_cmnd;
4327
4328 memset(fcp_cmnd, 0, sizeof(struct fcp_cmnd));
4329 int_to_scsilun(lun, &fcp_cmnd->fcp_lun);
4330 fcp_cmnd->fcpCntl2 = task_mgmt_cmd;
4331 if (vport->phba->sli_rev == 3 &&
4332 !(vport->phba->sli3_options & LPFC_SLI3_BG_ENABLED))
4333 lpfc_fcpcmd_to_iocb(piocb->unsli3.fcp_ext.icd, fcp_cmnd);
4334 piocb->ulpCommand = CMD_FCP_ICMND64_CR;
4335 piocb->ulpContext = ndlp->nlp_rpi;
4336 if (vport->phba->sli_rev == LPFC_SLI_REV4) {
4337 piocb->ulpContext =
4338 vport->phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
4339 }
4340 piocb->ulpFCP2Rcvy = (ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE) ? 1 : 0;
4341 piocb->ulpClass = (ndlp->nlp_fcp_info & 0x0f);
4342 piocb->ulpPU = 0;
4343 piocb->un.fcpi.fcpi_parm = 0;
4344
4345
4346 if (lpfc_cmd->timeout > 0xff) {
4347
4348
4349
4350
4351 piocb->ulpTimeout = 0;
4352 } else
4353 piocb->ulpTimeout = lpfc_cmd->timeout;
4354
4355 if (vport->phba->sli_rev == LPFC_SLI_REV4)
4356 lpfc_sli4_set_rsp_sgl_last(vport->phba, lpfc_cmd);
4357
4358 return 1;
4359}
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370int
4371lpfc_scsi_api_table_setup(struct lpfc_hba *phba, uint8_t dev_grp)
4372{
4373
4374 phba->lpfc_scsi_unprep_dma_buf = lpfc_scsi_unprep_dma_buf;
4375 phba->lpfc_scsi_prep_cmnd = lpfc_scsi_prep_cmnd;
4376
4377 switch (dev_grp) {
4378 case LPFC_PCI_DEV_LP:
4379 phba->lpfc_new_scsi_buf = lpfc_new_scsi_buf_s3;
4380 phba->lpfc_scsi_prep_dma_buf = lpfc_scsi_prep_dma_buf_s3;
4381 phba->lpfc_bg_scsi_prep_dma_buf = lpfc_bg_scsi_prep_dma_buf_s3;
4382 phba->lpfc_release_scsi_buf = lpfc_release_scsi_buf_s3;
4383 phba->lpfc_get_scsi_buf = lpfc_get_scsi_buf_s3;
4384 break;
4385 case LPFC_PCI_DEV_OC:
4386 phba->lpfc_new_scsi_buf = lpfc_new_scsi_buf_s4;
4387 phba->lpfc_scsi_prep_dma_buf = lpfc_scsi_prep_dma_buf_s4;
4388 phba->lpfc_bg_scsi_prep_dma_buf = lpfc_bg_scsi_prep_dma_buf_s4;
4389 phba->lpfc_release_scsi_buf = lpfc_release_scsi_buf_s4;
4390 phba->lpfc_get_scsi_buf = lpfc_get_scsi_buf_s4;
4391 break;
4392 default:
4393 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4394 "1418 Invalid HBA PCI-device group: 0x%x\n",
4395 dev_grp);
4396 return -ENODEV;
4397 break;
4398 }
4399 phba->lpfc_rampdown_queue_depth = lpfc_rampdown_queue_depth;
4400 phba->lpfc_scsi_cmd_iocb_cmpl = lpfc_scsi_cmd_iocb_cmpl;
4401 return 0;
4402}
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413static void
4414lpfc_tskmgmt_def_cmpl(struct lpfc_hba *phba,
4415 struct lpfc_iocbq *cmdiocbq,
4416 struct lpfc_iocbq *rspiocbq)
4417{
4418 struct lpfc_scsi_buf *lpfc_cmd =
4419 (struct lpfc_scsi_buf *) cmdiocbq->context1;
4420 if (lpfc_cmd)
4421 lpfc_release_scsi_buf(phba, lpfc_cmd);
4422 return;
4423}
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434const char *
4435lpfc_info(struct Scsi_Host *host)
4436{
4437 struct lpfc_vport *vport = (struct lpfc_vport *) host->hostdata;
4438 struct lpfc_hba *phba = vport->phba;
4439 int len, link_speed = 0;
4440 static char lpfcinfobuf[384];
4441
4442 memset(lpfcinfobuf,0,384);
4443 if (phba && phba->pcidev){
4444 strncpy(lpfcinfobuf, phba->ModelDesc, 256);
4445 len = strlen(lpfcinfobuf);
4446 snprintf(lpfcinfobuf + len,
4447 384-len,
4448 " on PCI bus %02x device %02x irq %d",
4449 phba->pcidev->bus->number,
4450 phba->pcidev->devfn,
4451 phba->pcidev->irq);
4452 len = strlen(lpfcinfobuf);
4453 if (phba->Port[0]) {
4454 snprintf(lpfcinfobuf + len,
4455 384-len,
4456 " port %s",
4457 phba->Port);
4458 }
4459 len = strlen(lpfcinfobuf);
4460 link_speed = lpfc_sli_port_speed_get(phba);
4461 if (link_speed != 0)
4462 snprintf(lpfcinfobuf + len, 384-len,
4463 " Logical Link Speed: %d Mbps", link_speed);
4464 }
4465 return lpfcinfobuf;
4466}
4467
4468
4469
4470
4471
4472
4473
4474
4475static __inline__ void lpfc_poll_rearm_timer(struct lpfc_hba * phba)
4476{
4477 unsigned long poll_tmo_expires =
4478 (jiffies + msecs_to_jiffies(phba->cfg_poll_tmo));
4479
4480 if (!list_empty(&phba->sli.sli3_ring[LPFC_FCP_RING].txcmplq))
4481 mod_timer(&phba->fcp_poll_timer,
4482 poll_tmo_expires);
4483}
4484
4485
4486
4487
4488
4489
4490
4491void lpfc_poll_start_timer(struct lpfc_hba * phba)
4492{
4493 lpfc_poll_rearm_timer(phba);
4494}
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504void lpfc_poll_timeout(unsigned long ptr)
4505{
4506 struct lpfc_hba *phba = (struct lpfc_hba *) ptr;
4507
4508 if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) {
4509 lpfc_sli_handle_fast_ring_event(phba,
4510 &phba->sli.sli3_ring[LPFC_FCP_RING], HA_R0RE_REQ);
4511
4512 if (phba->cfg_poll & DISABLE_FCP_RING_INT)
4513 lpfc_poll_rearm_timer(phba);
4514 }
4515}
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530static int
4531lpfc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *cmnd)
4532{
4533 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4534 struct lpfc_hba *phba = vport->phba;
4535 struct lpfc_rport_data *rdata;
4536 struct lpfc_nodelist *ndlp;
4537 struct lpfc_scsi_buf *lpfc_cmd;
4538 struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
4539 int err;
4540
4541 rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
4542 err = fc_remote_port_chkready(rport);
4543 if (err) {
4544 cmnd->result = err;
4545 goto out_fail_command;
4546 }
4547 ndlp = rdata->pnode;
4548
4549 if ((scsi_get_prot_op(cmnd) != SCSI_PROT_NORMAL) &&
4550 (!(phba->sli3_options & LPFC_SLI3_BG_ENABLED))) {
4551
4552 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
4553 "9058 BLKGRD: ERROR: rcvd protected cmd:%02x"
4554 " op:%02x str=%s without registering for"
4555 " BlockGuard - Rejecting command\n",
4556 cmnd->cmnd[0], scsi_get_prot_op(cmnd),
4557 dif_op_str[scsi_get_prot_op(cmnd)]);
4558 goto out_fail_command;
4559 }
4560
4561
4562
4563
4564
4565 if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
4566 goto out_tgt_busy;
4567 if (atomic_read(&ndlp->cmd_pending) >= ndlp->cmd_qdepth)
4568 goto out_tgt_busy;
4569
4570 lpfc_cmd = lpfc_get_scsi_buf(phba, ndlp);
4571 if (lpfc_cmd == NULL) {
4572 lpfc_rampdown_queue_depth(phba);
4573
4574 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP_ERROR,
4575 "0707 driver's buffer pool is empty, "
4576 "IO busied\n");
4577 goto out_host_busy;
4578 }
4579
4580
4581
4582
4583
4584 lpfc_cmd->pCmd = cmnd;
4585 lpfc_cmd->rdata = rdata;
4586 lpfc_cmd->timeout = 0;
4587 lpfc_cmd->start_time = jiffies;
4588 cmnd->host_scribble = (unsigned char *)lpfc_cmd;
4589
4590 if (scsi_get_prot_op(cmnd) != SCSI_PROT_NORMAL) {
4591 if (vport->phba->cfg_enable_bg) {
4592 lpfc_printf_vlog(vport,
4593 KERN_INFO, LOG_SCSI_CMD,
4594 "9033 BLKGRD: rcvd %s cmd:x%x "
4595 "sector x%llx cnt %u pt %x\n",
4596 dif_op_str[scsi_get_prot_op(cmnd)],
4597 cmnd->cmnd[0],
4598 (unsigned long long)scsi_get_lba(cmnd),
4599 blk_rq_sectors(cmnd->request),
4600 (cmnd->cmnd[1]>>5));
4601 }
4602 err = lpfc_bg_scsi_prep_dma_buf(phba, lpfc_cmd);
4603 } else {
4604 if (vport->phba->cfg_enable_bg) {
4605 lpfc_printf_vlog(vport,
4606 KERN_INFO, LOG_SCSI_CMD,
4607 "9038 BLKGRD: rcvd PROT_NORMAL cmd: "
4608 "x%x sector x%llx cnt %u pt %x\n",
4609 cmnd->cmnd[0],
4610 (unsigned long long)scsi_get_lba(cmnd),
4611 blk_rq_sectors(cmnd->request),
4612 (cmnd->cmnd[1]>>5));
4613 }
4614 err = lpfc_scsi_prep_dma_buf(phba, lpfc_cmd);
4615 }
4616
4617 if (err)
4618 goto out_host_busy_free_buf;
4619
4620 lpfc_scsi_prep_cmnd(vport, lpfc_cmd, ndlp);
4621
4622 atomic_inc(&ndlp->cmd_pending);
4623 err = lpfc_sli_issue_iocb(phba, LPFC_FCP_RING,
4624 &lpfc_cmd->cur_iocbq, SLI_IOCB_RET_IOCB);
4625 if (err) {
4626 atomic_dec(&ndlp->cmd_pending);
4627 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
4628 "3376 FCP could not issue IOCB err %x"
4629 "FCP cmd x%x <%d/%llu> "
4630 "sid: x%x did: x%x oxid: x%x "
4631 "Data: x%x x%x x%x x%x\n",
4632 err, cmnd->cmnd[0],
4633 cmnd->device ? cmnd->device->id : 0xffff,
4634 cmnd->device ? cmnd->device->lun : (u64) -1,
4635 vport->fc_myDID, ndlp->nlp_DID,
4636 phba->sli_rev == LPFC_SLI_REV4 ?
4637 lpfc_cmd->cur_iocbq.sli4_xritag : 0xffff,
4638 lpfc_cmd->cur_iocbq.iocb.ulpContext,
4639 lpfc_cmd->cur_iocbq.iocb.ulpIoTag,
4640 lpfc_cmd->cur_iocbq.iocb.ulpTimeout,
4641 (uint32_t)
4642 (cmnd->request->timeout / 1000));
4643
4644 switch (lpfc_cmd->fcp_cmnd->fcpCntl3) {
4645 case WRITE_DATA:
4646 atomic_dec(&phba->fc4ScsiOutputRequests);
4647 break;
4648 case READ_DATA:
4649 atomic_dec(&phba->fc4ScsiInputRequests);
4650 break;
4651 default:
4652 atomic_dec(&phba->fc4ScsiControlRequests);
4653 }
4654 goto out_host_busy_free_buf;
4655 }
4656 if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) {
4657 lpfc_sli_handle_fast_ring_event(phba,
4658 &phba->sli.sli3_ring[LPFC_FCP_RING], HA_R0RE_REQ);
4659
4660 if (phba->cfg_poll & DISABLE_FCP_RING_INT)
4661 lpfc_poll_rearm_timer(phba);
4662 }
4663
4664 return 0;
4665
4666 out_host_busy_free_buf:
4667 lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd);
4668 lpfc_release_scsi_buf(phba, lpfc_cmd);
4669 out_host_busy:
4670 return SCSI_MLQUEUE_HOST_BUSY;
4671
4672 out_tgt_busy:
4673 return SCSI_MLQUEUE_TARGET_BUSY;
4674
4675 out_fail_command:
4676 cmnd->scsi_done(cmnd);
4677 return 0;
4678}
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691static int
4692lpfc_abort_handler(struct scsi_cmnd *cmnd)
4693{
4694 struct Scsi_Host *shost = cmnd->device->host;
4695 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4696 struct lpfc_hba *phba = vport->phba;
4697 struct lpfc_iocbq *iocb;
4698 struct lpfc_iocbq *abtsiocb;
4699 struct lpfc_scsi_buf *lpfc_cmd;
4700 IOCB_t *cmd, *icmd;
4701 int ret = SUCCESS, status = 0;
4702 struct lpfc_sli_ring *pring_s4;
4703 int ret_val;
4704 unsigned long flags, iflags;
4705 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(waitq);
4706
4707 status = fc_block_scsi_eh(cmnd);
4708 if (status != 0 && status != SUCCESS)
4709 return status;
4710
4711 spin_lock_irqsave(&phba->hbalock, flags);
4712
4713 if (phba->hba_flag & HBA_FCP_IOQ_FLUSH) {
4714 spin_unlock_irqrestore(&phba->hbalock, flags);
4715 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
4716 "3168 SCSI Layer abort requested I/O has been "
4717 "flushed by LLD.\n");
4718 return FAILED;
4719 }
4720
4721 lpfc_cmd = (struct lpfc_scsi_buf *)cmnd->host_scribble;
4722 if (!lpfc_cmd || !lpfc_cmd->pCmd) {
4723 spin_unlock_irqrestore(&phba->hbalock, flags);
4724 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
4725 "2873 SCSI Layer I/O Abort Request IO CMPL Status "
4726 "x%x ID %d LUN %llu\n",
4727 SUCCESS, cmnd->device->id, cmnd->device->lun);
4728 return SUCCESS;
4729 }
4730
4731 iocb = &lpfc_cmd->cur_iocbq;
4732
4733 if (!(iocb->iocb_flag & LPFC_IO_ON_TXCMPLQ)) {
4734 spin_unlock_irqrestore(&phba->hbalock, flags);
4735 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
4736 "3169 SCSI Layer abort requested I/O has been "
4737 "cancelled by LLD.\n");
4738 return FAILED;
4739 }
4740
4741
4742
4743
4744
4745
4746 if (lpfc_cmd->pCmd != cmnd) {
4747 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
4748 "3170 SCSI Layer abort requested I/O has been "
4749 "completed by LLD.\n");
4750 goto out_unlock;
4751 }
4752
4753 BUG_ON(iocb->context1 != lpfc_cmd);
4754
4755
4756 if (iocb->iocb_flag & LPFC_DRIVER_ABORTED) {
4757 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
4758 "3389 SCSI Layer I/O Abort Request is pending\n");
4759 spin_unlock_irqrestore(&phba->hbalock, flags);
4760 goto wait_for_cmpl;
4761 }
4762
4763 abtsiocb = __lpfc_sli_get_iocbq(phba);
4764 if (abtsiocb == NULL) {
4765 ret = FAILED;
4766 goto out_unlock;
4767 }
4768
4769
4770 iocb->iocb_flag |= LPFC_DRIVER_ABORTED;
4771
4772
4773
4774
4775
4776
4777
4778 cmd = &iocb->iocb;
4779 icmd = &abtsiocb->iocb;
4780 icmd->un.acxri.abortType = ABORT_TYPE_ABTS;
4781 icmd->un.acxri.abortContextTag = cmd->ulpContext;
4782 if (phba->sli_rev == LPFC_SLI_REV4)
4783 icmd->un.acxri.abortIoTag = iocb->sli4_xritag;
4784 else
4785 icmd->un.acxri.abortIoTag = cmd->ulpIoTag;
4786
4787 icmd->ulpLe = 1;
4788 icmd->ulpClass = cmd->ulpClass;
4789
4790
4791 abtsiocb->hba_wqidx = iocb->hba_wqidx;
4792 abtsiocb->iocb_flag |= LPFC_USE_FCPWQIDX;
4793 if (iocb->iocb_flag & LPFC_IO_FOF)
4794 abtsiocb->iocb_flag |= LPFC_IO_FOF;
4795
4796 if (lpfc_is_link_up(phba))
4797 icmd->ulpCommand = CMD_ABORT_XRI_CN;
4798 else
4799 icmd->ulpCommand = CMD_CLOSE_XRI_CN;
4800
4801 abtsiocb->iocb_cmpl = lpfc_sli_abort_fcp_cmpl;
4802 abtsiocb->vport = vport;
4803 if (phba->sli_rev == LPFC_SLI_REV4) {
4804 pring_s4 = lpfc_sli4_calc_ring(phba, iocb);
4805 if (pring_s4 == NULL) {
4806 ret = FAILED;
4807 goto out_unlock;
4808 }
4809
4810 spin_lock_irqsave(&pring_s4->ring_lock, iflags);
4811 ret_val = __lpfc_sli_issue_iocb(phba, pring_s4->ringno,
4812 abtsiocb, 0);
4813 spin_unlock_irqrestore(&pring_s4->ring_lock, iflags);
4814 } else {
4815 ret_val = __lpfc_sli_issue_iocb(phba, LPFC_FCP_RING,
4816 abtsiocb, 0);
4817 }
4818
4819 spin_unlock_irqrestore(&phba->hbalock, flags);
4820
4821
4822 if (ret_val == IOCB_ERROR) {
4823 lpfc_sli_release_iocbq(phba, abtsiocb);
4824 ret = FAILED;
4825 goto out;
4826 }
4827
4828 if (phba->cfg_poll & DISABLE_FCP_RING_INT)
4829 lpfc_sli_handle_fast_ring_event(phba,
4830 &phba->sli.sli3_ring[LPFC_FCP_RING], HA_R0RE_REQ);
4831
4832wait_for_cmpl:
4833 lpfc_cmd->waitq = &waitq;
4834
4835 wait_event_timeout(waitq,
4836 (lpfc_cmd->pCmd != cmnd),
4837 msecs_to_jiffies(2*vport->cfg_devloss_tmo*1000));
4838
4839 spin_lock_irqsave(shost->host_lock, flags);
4840 lpfc_cmd->waitq = NULL;
4841 spin_unlock_irqrestore(shost->host_lock, flags);
4842
4843 if (lpfc_cmd->pCmd == cmnd) {
4844 ret = FAILED;
4845 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
4846 "0748 abort handler timed out waiting "
4847 "for aborting I/O (xri:x%x) to complete: "
4848 "ret %#x, ID %d, LUN %llu\n",
4849 iocb->sli4_xritag, ret,
4850 cmnd->device->id, cmnd->device->lun);
4851 }
4852 goto out;
4853
4854out_unlock:
4855 spin_unlock_irqrestore(&phba->hbalock, flags);
4856out:
4857 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
4858 "0749 SCSI Layer I/O Abort Request Status x%x ID %d "
4859 "LUN %llu\n", ret, cmnd->device->id,
4860 cmnd->device->lun);
4861 return ret;
4862}
4863
4864static char *
4865lpfc_taskmgmt_name(uint8_t task_mgmt_cmd)
4866{
4867 switch (task_mgmt_cmd) {
4868 case FCP_ABORT_TASK_SET:
4869 return "ABORT_TASK_SET";
4870 case FCP_CLEAR_TASK_SET:
4871 return "FCP_CLEAR_TASK_SET";
4872 case FCP_BUS_RESET:
4873 return "FCP_BUS_RESET";
4874 case FCP_LUN_RESET:
4875 return "FCP_LUN_RESET";
4876 case FCP_TARGET_RESET:
4877 return "FCP_TARGET_RESET";
4878 case FCP_CLEAR_ACA:
4879 return "FCP_CLEAR_ACA";
4880 case FCP_TERMINATE_TASK:
4881 return "FCP_TERMINATE_TASK";
4882 default:
4883 return "unknown";
4884 }
4885}
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899static int
4900lpfc_check_fcp_rsp(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd)
4901{
4902 struct fcp_rsp *fcprsp = lpfc_cmd->fcp_rsp;
4903 uint32_t rsp_info;
4904 uint32_t rsp_len;
4905 uint8_t rsp_info_code;
4906 int ret = FAILED;
4907
4908
4909 if (fcprsp == NULL)
4910 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
4911 "0703 fcp_rsp is missing\n");
4912 else {
4913 rsp_info = fcprsp->rspStatus2;
4914 rsp_len = be32_to_cpu(fcprsp->rspRspLen);
4915 rsp_info_code = fcprsp->rspInfo3;
4916
4917
4918 lpfc_printf_vlog(vport, KERN_INFO,
4919 LOG_FCP,
4920 "0706 fcp_rsp valid 0x%x,"
4921 " rsp len=%d code 0x%x\n",
4922 rsp_info,
4923 rsp_len, rsp_info_code);
4924
4925 if ((fcprsp->rspStatus2&RSP_LEN_VALID) && (rsp_len == 8)) {
4926 switch (rsp_info_code) {
4927 case RSP_NO_FAILURE:
4928 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
4929 "0715 Task Mgmt No Failure\n");
4930 ret = SUCCESS;
4931 break;
4932 case RSP_TM_NOT_SUPPORTED:
4933 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
4934 "0716 Task Mgmt Target "
4935 "reject\n");
4936 break;
4937 case RSP_TM_NOT_COMPLETED:
4938 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
4939 "0717 Task Mgmt Target "
4940 "failed TM\n");
4941 break;
4942 case RSP_TM_INVALID_LU:
4943 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
4944 "0718 Task Mgmt to invalid "
4945 "LUN\n");
4946 break;
4947 }
4948 }
4949 }
4950 return ret;
4951}
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969static int
4970lpfc_send_taskmgmt(struct lpfc_vport *vport, struct scsi_cmnd *cmnd,
4971 unsigned int tgt_id, uint64_t lun_id,
4972 uint8_t task_mgmt_cmd)
4973{
4974 struct lpfc_hba *phba = vport->phba;
4975 struct lpfc_scsi_buf *lpfc_cmd;
4976 struct lpfc_iocbq *iocbq;
4977 struct lpfc_iocbq *iocbqrsp;
4978 struct lpfc_rport_data *rdata;
4979 struct lpfc_nodelist *pnode;
4980 int ret;
4981 int status;
4982
4983 rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
4984 if (!rdata || !rdata->pnode || !NLP_CHK_NODE_ACT(rdata->pnode))
4985 return FAILED;
4986 pnode = rdata->pnode;
4987
4988 lpfc_cmd = lpfc_get_scsi_buf(phba, pnode);
4989 if (lpfc_cmd == NULL)
4990 return FAILED;
4991 lpfc_cmd->timeout = phba->cfg_task_mgmt_tmo;
4992 lpfc_cmd->rdata = rdata;
4993 lpfc_cmd->pCmd = cmnd;
4994
4995 status = lpfc_scsi_prep_task_mgmt_cmd(vport, lpfc_cmd, lun_id,
4996 task_mgmt_cmd);
4997 if (!status) {
4998 lpfc_release_scsi_buf(phba, lpfc_cmd);
4999 return FAILED;
5000 }
5001
5002 iocbq = &lpfc_cmd->cur_iocbq;
5003 iocbqrsp = lpfc_sli_get_iocbq(phba);
5004 if (iocbqrsp == NULL) {
5005 lpfc_release_scsi_buf(phba, lpfc_cmd);
5006 return FAILED;
5007 }
5008 iocbq->iocb_cmpl = lpfc_tskmgmt_def_cmpl;
5009
5010 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
5011 "0702 Issue %s to TGT %d LUN %llu "
5012 "rpi x%x nlp_flag x%x Data: x%x x%x\n",
5013 lpfc_taskmgmt_name(task_mgmt_cmd), tgt_id, lun_id,
5014 pnode->nlp_rpi, pnode->nlp_flag, iocbq->sli4_xritag,
5015 iocbq->iocb_flag);
5016
5017 status = lpfc_sli_issue_iocb_wait(phba, LPFC_FCP_RING,
5018 iocbq, iocbqrsp, lpfc_cmd->timeout);
5019 if ((status != IOCB_SUCCESS) ||
5020 (iocbqrsp->iocb.ulpStatus != IOSTAT_SUCCESS)) {
5021 if (status != IOCB_SUCCESS ||
5022 iocbqrsp->iocb.ulpStatus != IOSTAT_FCP_RSP_ERROR)
5023 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5024 "0727 TMF %s to TGT %d LUN %llu "
5025 "failed (%d, %d) iocb_flag x%x\n",
5026 lpfc_taskmgmt_name(task_mgmt_cmd),
5027 tgt_id, lun_id,
5028 iocbqrsp->iocb.ulpStatus,
5029 iocbqrsp->iocb.un.ulpWord[4],
5030 iocbq->iocb_flag);
5031
5032 if (status == IOCB_SUCCESS) {
5033 if (iocbqrsp->iocb.ulpStatus == IOSTAT_FCP_RSP_ERROR)
5034
5035
5036 ret = lpfc_check_fcp_rsp(vport, lpfc_cmd);
5037 else
5038 ret = FAILED;
5039 } else if (status == IOCB_TIMEDOUT) {
5040 ret = TIMEOUT_ERROR;
5041 } else {
5042 ret = FAILED;
5043 }
5044 } else
5045 ret = SUCCESS;
5046
5047 lpfc_sli_release_iocbq(phba, iocbqrsp);
5048
5049 if (ret != TIMEOUT_ERROR)
5050 lpfc_release_scsi_buf(phba, lpfc_cmd);
5051
5052 return ret;
5053}
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067static int
5068lpfc_chk_tgt_mapped(struct lpfc_vport *vport, struct scsi_cmnd *cmnd)
5069{
5070 struct lpfc_rport_data *rdata;
5071 struct lpfc_nodelist *pnode;
5072 unsigned long later;
5073
5074 rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
5075 if (!rdata) {
5076 lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
5077 "0797 Tgt Map rport failure: rdata x%p\n", rdata);
5078 return FAILED;
5079 }
5080 pnode = rdata->pnode;
5081
5082
5083
5084
5085 later = msecs_to_jiffies(2 * vport->cfg_devloss_tmo * 1000) + jiffies;
5086 while (time_after(later, jiffies)) {
5087 if (!pnode || !NLP_CHK_NODE_ACT(pnode))
5088 return FAILED;
5089 if (pnode->nlp_state == NLP_STE_MAPPED_NODE)
5090 return SUCCESS;
5091 schedule_timeout_uninterruptible(msecs_to_jiffies(500));
5092 rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
5093 if (!rdata)
5094 return FAILED;
5095 pnode = rdata->pnode;
5096 }
5097 if (!pnode || !NLP_CHK_NODE_ACT(pnode) ||
5098 (pnode->nlp_state != NLP_STE_MAPPED_NODE))
5099 return FAILED;
5100 return SUCCESS;
5101}
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119static int
5120lpfc_reset_flush_io_context(struct lpfc_vport *vport, uint16_t tgt_id,
5121 uint64_t lun_id, lpfc_ctx_cmd context)
5122{
5123 struct lpfc_hba *phba = vport->phba;
5124 unsigned long later;
5125 int cnt;
5126
5127 cnt = lpfc_sli_sum_iocb(vport, tgt_id, lun_id, context);
5128 if (cnt)
5129 lpfc_sli_abort_taskmgmt(vport,
5130 &phba->sli.sli3_ring[LPFC_FCP_RING],
5131 tgt_id, lun_id, context);
5132 later = msecs_to_jiffies(2 * vport->cfg_devloss_tmo * 1000) + jiffies;
5133 while (time_after(later, jiffies) && cnt) {
5134 schedule_timeout_uninterruptible(msecs_to_jiffies(20));
5135 cnt = lpfc_sli_sum_iocb(vport, tgt_id, lun_id, context);
5136 }
5137 if (cnt) {
5138 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5139 "0724 I/O flush failure for context %s : cnt x%x\n",
5140 ((context == LPFC_CTX_LUN) ? "LUN" :
5141 ((context == LPFC_CTX_TGT) ? "TGT" :
5142 ((context == LPFC_CTX_HOST) ? "HOST" : "Unknown"))),
5143 cnt);
5144 return FAILED;
5145 }
5146 return SUCCESS;
5147}
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160static int
5161lpfc_device_reset_handler(struct scsi_cmnd *cmnd)
5162{
5163 struct Scsi_Host *shost = cmnd->device->host;
5164 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5165 struct lpfc_rport_data *rdata;
5166 struct lpfc_nodelist *pnode;
5167 unsigned tgt_id = cmnd->device->id;
5168 uint64_t lun_id = cmnd->device->lun;
5169 struct lpfc_scsi_event_header scsi_event;
5170 int status;
5171
5172 rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
5173 if (!rdata || !rdata->pnode) {
5174 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5175 "0798 Device Reset rport failure: rdata x%p\n",
5176 rdata);
5177 return FAILED;
5178 }
5179 pnode = rdata->pnode;
5180 status = fc_block_scsi_eh(cmnd);
5181 if (status != 0 && status != SUCCESS)
5182 return status;
5183
5184 status = lpfc_chk_tgt_mapped(vport, cmnd);
5185 if (status == FAILED) {
5186 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5187 "0721 Device Reset rport failure: rdata x%p\n", rdata);
5188 return FAILED;
5189 }
5190
5191 scsi_event.event_type = FC_REG_SCSI_EVENT;
5192 scsi_event.subcategory = LPFC_EVENT_LUNRESET;
5193 scsi_event.lun = lun_id;
5194 memcpy(scsi_event.wwpn, &pnode->nlp_portname, sizeof(struct lpfc_name));
5195 memcpy(scsi_event.wwnn, &pnode->nlp_nodename, sizeof(struct lpfc_name));
5196
5197 fc_host_post_vendor_event(shost, fc_get_event_number(),
5198 sizeof(scsi_event), (char *)&scsi_event, LPFC_NL_VENDOR_ID);
5199
5200 status = lpfc_send_taskmgmt(vport, cmnd, tgt_id, lun_id,
5201 FCP_LUN_RESET);
5202
5203 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5204 "0713 SCSI layer issued Device Reset (%d, %llu) "
5205 "return x%x\n", tgt_id, lun_id, status);
5206
5207
5208
5209
5210
5211
5212
5213 if (status == SUCCESS)
5214 status = lpfc_reset_flush_io_context(vport, tgt_id, lun_id,
5215 LPFC_CTX_LUN);
5216
5217 return status;
5218}
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231static int
5232lpfc_target_reset_handler(struct scsi_cmnd *cmnd)
5233{
5234 struct Scsi_Host *shost = cmnd->device->host;
5235 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5236 struct lpfc_rport_data *rdata;
5237 struct lpfc_nodelist *pnode;
5238 unsigned tgt_id = cmnd->device->id;
5239 uint64_t lun_id = cmnd->device->lun;
5240 struct lpfc_scsi_event_header scsi_event;
5241 int status;
5242
5243 rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
5244 if (!rdata) {
5245 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5246 "0799 Target Reset rport failure: rdata x%p\n", rdata);
5247 return FAILED;
5248 }
5249 pnode = rdata->pnode;
5250 status = fc_block_scsi_eh(cmnd);
5251 if (status != 0 && status != SUCCESS)
5252 return status;
5253
5254 status = lpfc_chk_tgt_mapped(vport, cmnd);
5255 if (status == FAILED) {
5256 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5257 "0722 Target Reset rport failure: rdata x%p\n", rdata);
5258 if (pnode) {
5259 spin_lock_irq(shost->host_lock);
5260 pnode->nlp_flag &= ~NLP_NPR_ADISC;
5261 pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
5262 spin_unlock_irq(shost->host_lock);
5263 }
5264 lpfc_reset_flush_io_context(vport, tgt_id, lun_id,
5265 LPFC_CTX_TGT);
5266 return FAST_IO_FAIL;
5267 }
5268
5269 scsi_event.event_type = FC_REG_SCSI_EVENT;
5270 scsi_event.subcategory = LPFC_EVENT_TGTRESET;
5271 scsi_event.lun = 0;
5272 memcpy(scsi_event.wwpn, &pnode->nlp_portname, sizeof(struct lpfc_name));
5273 memcpy(scsi_event.wwnn, &pnode->nlp_nodename, sizeof(struct lpfc_name));
5274
5275 fc_host_post_vendor_event(shost, fc_get_event_number(),
5276 sizeof(scsi_event), (char *)&scsi_event, LPFC_NL_VENDOR_ID);
5277
5278 status = lpfc_send_taskmgmt(vport, cmnd, tgt_id, lun_id,
5279 FCP_TARGET_RESET);
5280
5281 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5282 "0723 SCSI layer issued Target Reset (%d, %llu) "
5283 "return x%x\n", tgt_id, lun_id, status);
5284
5285
5286
5287
5288
5289
5290
5291 if (status == SUCCESS)
5292 status = lpfc_reset_flush_io_context(vport, tgt_id, lun_id,
5293 LPFC_CTX_TGT);
5294 return status;
5295}
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308static int
5309lpfc_bus_reset_handler(struct scsi_cmnd *cmnd)
5310{
5311 struct Scsi_Host *shost = cmnd->device->host;
5312 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5313 struct lpfc_nodelist *ndlp = NULL;
5314 struct lpfc_scsi_event_header scsi_event;
5315 int match;
5316 int ret = SUCCESS, status, i;
5317
5318 scsi_event.event_type = FC_REG_SCSI_EVENT;
5319 scsi_event.subcategory = LPFC_EVENT_BUSRESET;
5320 scsi_event.lun = 0;
5321 memcpy(scsi_event.wwpn, &vport->fc_portname, sizeof(struct lpfc_name));
5322 memcpy(scsi_event.wwnn, &vport->fc_nodename, sizeof(struct lpfc_name));
5323
5324 fc_host_post_vendor_event(shost, fc_get_event_number(),
5325 sizeof(scsi_event), (char *)&scsi_event, LPFC_NL_VENDOR_ID);
5326
5327 status = fc_block_scsi_eh(cmnd);
5328 if (status != 0 && status != SUCCESS)
5329 return status;
5330
5331
5332
5333
5334
5335
5336 for (i = 0; i < LPFC_MAX_TARGET; i++) {
5337
5338 match = 0;
5339 spin_lock_irq(shost->host_lock);
5340 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
5341 if (!NLP_CHK_NODE_ACT(ndlp))
5342 continue;
5343 if (vport->phba->cfg_fcp2_no_tgt_reset &&
5344 (ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE))
5345 continue;
5346 if (ndlp->nlp_state == NLP_STE_MAPPED_NODE &&
5347 ndlp->nlp_sid == i &&
5348 ndlp->rport &&
5349 ndlp->nlp_type & NLP_FCP_TARGET) {
5350 match = 1;
5351 break;
5352 }
5353 }
5354 spin_unlock_irq(shost->host_lock);
5355 if (!match)
5356 continue;
5357
5358 status = lpfc_send_taskmgmt(vport, cmnd,
5359 i, 0, FCP_TARGET_RESET);
5360
5361 if (status != SUCCESS) {
5362 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5363 "0700 Bus Reset on target %d failed\n",
5364 i);
5365 ret = FAILED;
5366 }
5367 }
5368
5369
5370
5371
5372
5373
5374
5375 status = lpfc_reset_flush_io_context(vport, 0, 0, LPFC_CTX_HOST);
5376 if (status != SUCCESS)
5377 ret = FAILED;
5378
5379 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5380 "0714 SCSI layer issued Bus Reset Data: x%x\n", ret);
5381 return ret;
5382}
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400static int
5401lpfc_host_reset_handler(struct scsi_cmnd *cmnd)
5402{
5403 struct Scsi_Host *shost = cmnd->device->host;
5404 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5405 struct lpfc_hba *phba = vport->phba;
5406 int rc, ret = SUCCESS;
5407
5408 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5409 "3172 SCSI layer issued Host Reset Data:\n");
5410
5411 lpfc_offline_prep(phba, LPFC_MBX_WAIT);
5412 lpfc_offline(phba);
5413 rc = lpfc_sli_brdrestart(phba);
5414 if (rc)
5415 ret = FAILED;
5416 rc = lpfc_online(phba);
5417 if (rc)
5418 ret = FAILED;
5419 lpfc_unblock_mgmt_io(phba);
5420
5421 if (ret == FAILED) {
5422 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5423 "3323 Failed host reset, bring it offline\n");
5424 lpfc_sli4_offline_eratt(phba);
5425 }
5426 return ret;
5427}
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442static int
5443lpfc_slave_alloc(struct scsi_device *sdev)
5444{
5445 struct lpfc_vport *vport = (struct lpfc_vport *) sdev->host->hostdata;
5446 struct lpfc_hba *phba = vport->phba;
5447 struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
5448 uint32_t total = 0;
5449 uint32_t num_to_alloc = 0;
5450 int num_allocated = 0;
5451 uint32_t sdev_cnt;
5452 struct lpfc_device_data *device_data;
5453 unsigned long flags;
5454 struct lpfc_name target_wwpn;
5455
5456 if (!rport || fc_remote_port_chkready(rport))
5457 return -ENXIO;
5458
5459 if (phba->cfg_fof) {
5460
5461
5462
5463
5464
5465
5466 u64_to_wwn(rport->port_name, target_wwpn.u.wwn);
5467 spin_lock_irqsave(&phba->devicelock, flags);
5468 device_data = __lpfc_get_device_data(phba,
5469 &phba->luns,
5470 &vport->fc_portname,
5471 &target_wwpn,
5472 sdev->lun);
5473 if (!device_data) {
5474 spin_unlock_irqrestore(&phba->devicelock, flags);
5475 device_data = lpfc_create_device_data(phba,
5476 &vport->fc_portname,
5477 &target_wwpn,
5478 sdev->lun,
5479 phba->cfg_XLanePriority,
5480 true);
5481 if (!device_data)
5482 return -ENOMEM;
5483 spin_lock_irqsave(&phba->devicelock, flags);
5484 list_add_tail(&device_data->listentry, &phba->luns);
5485 }
5486 device_data->rport_data = rport->dd_data;
5487 device_data->available = true;
5488 spin_unlock_irqrestore(&phba->devicelock, flags);
5489 sdev->hostdata = device_data;
5490 } else {
5491 sdev->hostdata = rport->dd_data;
5492 }
5493 sdev_cnt = atomic_inc_return(&phba->sdev_cnt);
5494
5495
5496
5497
5498
5499
5500
5501
5502 total = phba->total_scsi_bufs;
5503 num_to_alloc = vport->cfg_lun_queue_depth + 2;
5504
5505
5506 if ((sdev_cnt * (vport->cfg_lun_queue_depth + 2)) < total)
5507 return 0;
5508
5509
5510 if (total >= phba->cfg_hba_queue_depth - LPFC_DISC_IOCB_BUFF_COUNT ) {
5511 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
5512 "0704 At limitation of %d preallocated "
5513 "command buffers\n", total);
5514 return 0;
5515
5516 } else if (total + num_to_alloc >
5517 phba->cfg_hba_queue_depth - LPFC_DISC_IOCB_BUFF_COUNT ) {
5518 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
5519 "0705 Allocation request of %d "
5520 "command buffers will exceed max of %d. "
5521 "Reducing allocation request to %d.\n",
5522 num_to_alloc, phba->cfg_hba_queue_depth,
5523 (phba->cfg_hba_queue_depth - total));
5524 num_to_alloc = phba->cfg_hba_queue_depth - total;
5525 }
5526 num_allocated = lpfc_new_scsi_buf(vport, num_to_alloc);
5527 if (num_to_alloc != num_allocated) {
5528 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
5529 "0708 Allocation request of %d "
5530 "command buffers did not succeed. "
5531 "Allocated %d buffers.\n",
5532 num_to_alloc, num_allocated);
5533 }
5534 if (num_allocated > 0)
5535 phba->total_scsi_bufs += num_allocated;
5536 return 0;
5537}
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550static int
5551lpfc_slave_configure(struct scsi_device *sdev)
5552{
5553 struct lpfc_vport *vport = (struct lpfc_vport *) sdev->host->hostdata;
5554 struct lpfc_hba *phba = vport->phba;
5555
5556 scsi_change_queue_depth(sdev, vport->cfg_lun_queue_depth);
5557
5558 if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) {
5559 lpfc_sli_handle_fast_ring_event(phba,
5560 &phba->sli.sli3_ring[LPFC_FCP_RING], HA_R0RE_REQ);
5561 if (phba->cfg_poll & DISABLE_FCP_RING_INT)
5562 lpfc_poll_rearm_timer(phba);
5563 }
5564
5565 return 0;
5566}
5567
5568
5569
5570
5571
5572
5573
5574static void
5575lpfc_slave_destroy(struct scsi_device *sdev)
5576{
5577 struct lpfc_vport *vport = (struct lpfc_vport *) sdev->host->hostdata;
5578 struct lpfc_hba *phba = vport->phba;
5579 unsigned long flags;
5580 struct lpfc_device_data *device_data = sdev->hostdata;
5581
5582 atomic_dec(&phba->sdev_cnt);
5583 if ((phba->cfg_fof) && (device_data)) {
5584 spin_lock_irqsave(&phba->devicelock, flags);
5585 device_data->available = false;
5586 if (!device_data->oas_enabled)
5587 lpfc_delete_device_data(phba, device_data);
5588 spin_unlock_irqrestore(&phba->devicelock, flags);
5589 }
5590 sdev->hostdata = NULL;
5591 return;
5592}
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612struct lpfc_device_data*
5613lpfc_create_device_data(struct lpfc_hba *phba, struct lpfc_name *vport_wwpn,
5614 struct lpfc_name *target_wwpn, uint64_t lun,
5615 uint32_t pri, bool atomic_create)
5616{
5617
5618 struct lpfc_device_data *lun_info;
5619 int memory_flags;
5620
5621 if (unlikely(!phba) || !vport_wwpn || !target_wwpn ||
5622 !(phba->cfg_fof))
5623 return NULL;
5624
5625
5626
5627 if (atomic_create)
5628 memory_flags = GFP_ATOMIC;
5629 else
5630 memory_flags = GFP_KERNEL;
5631 lun_info = mempool_alloc(phba->device_data_mem_pool, memory_flags);
5632 if (!lun_info)
5633 return NULL;
5634 INIT_LIST_HEAD(&lun_info->listentry);
5635 lun_info->rport_data = NULL;
5636 memcpy(&lun_info->device_id.vport_wwpn, vport_wwpn,
5637 sizeof(struct lpfc_name));
5638 memcpy(&lun_info->device_id.target_wwpn, target_wwpn,
5639 sizeof(struct lpfc_name));
5640 lun_info->device_id.lun = lun;
5641 lun_info->oas_enabled = false;
5642 lun_info->priority = pri;
5643 lun_info->available = false;
5644 return lun_info;
5645}
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655void
5656lpfc_delete_device_data(struct lpfc_hba *phba,
5657 struct lpfc_device_data *lun_info)
5658{
5659
5660 if (unlikely(!phba) || !lun_info ||
5661 !(phba->cfg_fof))
5662 return;
5663
5664 if (!list_empty(&lun_info->listentry))
5665 list_del(&lun_info->listentry);
5666 mempool_free(lun_info, phba->device_data_mem_pool);
5667 return;
5668}
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686struct lpfc_device_data*
5687__lpfc_get_device_data(struct lpfc_hba *phba, struct list_head *list,
5688 struct lpfc_name *vport_wwpn,
5689 struct lpfc_name *target_wwpn, uint64_t lun)
5690{
5691
5692 struct lpfc_device_data *lun_info;
5693
5694 if (unlikely(!phba) || !list || !vport_wwpn || !target_wwpn ||
5695 !phba->cfg_fof)
5696 return NULL;
5697
5698
5699
5700 list_for_each_entry(lun_info, list, listentry) {
5701 if ((memcmp(&lun_info->device_id.vport_wwpn, vport_wwpn,
5702 sizeof(struct lpfc_name)) == 0) &&
5703 (memcmp(&lun_info->device_id.target_wwpn, target_wwpn,
5704 sizeof(struct lpfc_name)) == 0) &&
5705 (lun_info->device_id.lun == lun))
5706 return lun_info;
5707 }
5708
5709 return NULL;
5710}
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738bool
5739lpfc_find_next_oas_lun(struct lpfc_hba *phba, struct lpfc_name *vport_wwpn,
5740 struct lpfc_name *target_wwpn, uint64_t *starting_lun,
5741 struct lpfc_name *found_vport_wwpn,
5742 struct lpfc_name *found_target_wwpn,
5743 uint64_t *found_lun,
5744 uint32_t *found_lun_status,
5745 uint32_t *found_lun_pri)
5746{
5747
5748 unsigned long flags;
5749 struct lpfc_device_data *lun_info;
5750 struct lpfc_device_id *device_id;
5751 uint64_t lun;
5752 bool found = false;
5753
5754 if (unlikely(!phba) || !vport_wwpn || !target_wwpn ||
5755 !starting_lun || !found_vport_wwpn ||
5756 !found_target_wwpn || !found_lun || !found_lun_status ||
5757 (*starting_lun == NO_MORE_OAS_LUN) ||
5758 !phba->cfg_fof)
5759 return false;
5760
5761 lun = *starting_lun;
5762 *found_lun = NO_MORE_OAS_LUN;
5763 *starting_lun = NO_MORE_OAS_LUN;
5764
5765
5766
5767 spin_lock_irqsave(&phba->devicelock, flags);
5768 list_for_each_entry(lun_info, &phba->luns, listentry) {
5769 if (((wwn_to_u64(vport_wwpn->u.wwn) == 0) ||
5770 (memcmp(&lun_info->device_id.vport_wwpn, vport_wwpn,
5771 sizeof(struct lpfc_name)) == 0)) &&
5772 ((wwn_to_u64(target_wwpn->u.wwn) == 0) ||
5773 (memcmp(&lun_info->device_id.target_wwpn, target_wwpn,
5774 sizeof(struct lpfc_name)) == 0)) &&
5775 (lun_info->oas_enabled)) {
5776 device_id = &lun_info->device_id;
5777 if ((!found) &&
5778 ((lun == FIND_FIRST_OAS_LUN) ||
5779 (device_id->lun == lun))) {
5780 *found_lun = device_id->lun;
5781 memcpy(found_vport_wwpn,
5782 &device_id->vport_wwpn,
5783 sizeof(struct lpfc_name));
5784 memcpy(found_target_wwpn,
5785 &device_id->target_wwpn,
5786 sizeof(struct lpfc_name));
5787 if (lun_info->available)
5788 *found_lun_status =
5789 OAS_LUN_STATUS_EXISTS;
5790 else
5791 *found_lun_status = 0;
5792 *found_lun_pri = lun_info->priority;
5793 if (phba->cfg_oas_flags & OAS_FIND_ANY_VPORT)
5794 memset(vport_wwpn, 0x0,
5795 sizeof(struct lpfc_name));
5796 if (phba->cfg_oas_flags & OAS_FIND_ANY_TARGET)
5797 memset(target_wwpn, 0x0,
5798 sizeof(struct lpfc_name));
5799 found = true;
5800 } else if (found) {
5801 *starting_lun = device_id->lun;
5802 memcpy(vport_wwpn, &device_id->vport_wwpn,
5803 sizeof(struct lpfc_name));
5804 memcpy(target_wwpn, &device_id->target_wwpn,
5805 sizeof(struct lpfc_name));
5806 break;
5807 }
5808 }
5809 }
5810 spin_unlock_irqrestore(&phba->devicelock, flags);
5811 return found;
5812}
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834bool
5835lpfc_enable_oas_lun(struct lpfc_hba *phba, struct lpfc_name *vport_wwpn,
5836 struct lpfc_name *target_wwpn, uint64_t lun, uint8_t pri)
5837{
5838
5839 struct lpfc_device_data *lun_info;
5840 unsigned long flags;
5841
5842 if (unlikely(!phba) || !vport_wwpn || !target_wwpn ||
5843 !phba->cfg_fof)
5844 return false;
5845
5846 spin_lock_irqsave(&phba->devicelock, flags);
5847
5848
5849 lun_info = __lpfc_get_device_data(phba, &phba->luns, vport_wwpn,
5850 target_wwpn, lun);
5851 if (lun_info) {
5852 if (!lun_info->oas_enabled)
5853 lun_info->oas_enabled = true;
5854 lun_info->priority = pri;
5855 spin_unlock_irqrestore(&phba->devicelock, flags);
5856 return true;
5857 }
5858
5859
5860 lun_info = lpfc_create_device_data(phba, vport_wwpn, target_wwpn, lun,
5861 pri, false);
5862 if (lun_info) {
5863 lun_info->oas_enabled = true;
5864 lun_info->priority = pri;
5865 lun_info->available = false;
5866 list_add_tail(&lun_info->listentry, &phba->luns);
5867 spin_unlock_irqrestore(&phba->devicelock, flags);
5868 return true;
5869 }
5870 spin_unlock_irqrestore(&phba->devicelock, flags);
5871 return false;
5872}
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893bool
5894lpfc_disable_oas_lun(struct lpfc_hba *phba, struct lpfc_name *vport_wwpn,
5895 struct lpfc_name *target_wwpn, uint64_t lun, uint8_t pri)
5896{
5897
5898 struct lpfc_device_data *lun_info;
5899 unsigned long flags;
5900
5901 if (unlikely(!phba) || !vport_wwpn || !target_wwpn ||
5902 !phba->cfg_fof)
5903 return false;
5904
5905 spin_lock_irqsave(&phba->devicelock, flags);
5906
5907
5908 lun_info = __lpfc_get_device_data(phba,
5909 &phba->luns, vport_wwpn,
5910 target_wwpn, lun);
5911 if (lun_info) {
5912 lun_info->oas_enabled = false;
5913 lun_info->priority = pri;
5914 if (!lun_info->available)
5915 lpfc_delete_device_data(phba, lun_info);
5916 spin_unlock_irqrestore(&phba->devicelock, flags);
5917 return true;
5918 }
5919
5920 spin_unlock_irqrestore(&phba->devicelock, flags);
5921 return false;
5922}
5923
5924static int
5925lpfc_no_command(struct Scsi_Host *shost, struct scsi_cmnd *cmnd)
5926{
5927 return SCSI_MLQUEUE_HOST_BUSY;
5928}
5929
5930static int
5931lpfc_no_handler(struct scsi_cmnd *cmnd)
5932{
5933 return FAILED;
5934}
5935
5936static int
5937lpfc_no_slave(struct scsi_device *sdev)
5938{
5939 return -ENODEV;
5940}
5941
5942struct scsi_host_template lpfc_template_nvme = {
5943 .module = THIS_MODULE,
5944 .name = LPFC_DRIVER_NAME,
5945 .proc_name = LPFC_DRIVER_NAME,
5946 .info = lpfc_info,
5947 .queuecommand = lpfc_no_command,
5948 .eh_abort_handler = lpfc_no_handler,
5949 .eh_device_reset_handler = lpfc_no_handler,
5950 .eh_target_reset_handler = lpfc_no_handler,
5951 .eh_bus_reset_handler = lpfc_no_handler,
5952 .eh_host_reset_handler = lpfc_no_handler,
5953 .slave_alloc = lpfc_no_slave,
5954 .slave_configure = lpfc_no_slave,
5955 .scan_finished = lpfc_scan_finished,
5956 .this_id = -1,
5957 .sg_tablesize = 1,
5958 .cmd_per_lun = 1,
5959 .use_clustering = ENABLE_CLUSTERING,
5960 .shost_attrs = lpfc_hba_attrs,
5961 .max_sectors = 0xFFFF,
5962 .vendor_id = LPFC_NL_VENDOR_ID,
5963 .track_queue_depth = 0,
5964};
5965
5966struct scsi_host_template lpfc_template_no_hr = {
5967 .module = THIS_MODULE,
5968 .name = LPFC_DRIVER_NAME,
5969 .proc_name = LPFC_DRIVER_NAME,
5970 .info = lpfc_info,
5971 .queuecommand = lpfc_queuecommand,
5972 .eh_timed_out = fc_eh_timed_out,
5973 .eh_abort_handler = lpfc_abort_handler,
5974 .eh_device_reset_handler = lpfc_device_reset_handler,
5975 .eh_target_reset_handler = lpfc_target_reset_handler,
5976 .eh_bus_reset_handler = lpfc_bus_reset_handler,
5977 .slave_alloc = lpfc_slave_alloc,
5978 .slave_configure = lpfc_slave_configure,
5979 .slave_destroy = lpfc_slave_destroy,
5980 .scan_finished = lpfc_scan_finished,
5981 .this_id = -1,
5982 .sg_tablesize = LPFC_DEFAULT_SG_SEG_CNT,
5983 .cmd_per_lun = LPFC_CMD_PER_LUN,
5984 .use_clustering = ENABLE_CLUSTERING,
5985 .shost_attrs = lpfc_hba_attrs,
5986 .max_sectors = 0xFFFF,
5987 .vendor_id = LPFC_NL_VENDOR_ID,
5988 .change_queue_depth = scsi_change_queue_depth,
5989 .track_queue_depth = 1,
5990};
5991
5992struct scsi_host_template lpfc_template = {
5993 .module = THIS_MODULE,
5994 .name = LPFC_DRIVER_NAME,
5995 .proc_name = LPFC_DRIVER_NAME,
5996 .info = lpfc_info,
5997 .queuecommand = lpfc_queuecommand,
5998 .eh_timed_out = fc_eh_timed_out,
5999 .eh_abort_handler = lpfc_abort_handler,
6000 .eh_device_reset_handler = lpfc_device_reset_handler,
6001 .eh_target_reset_handler = lpfc_target_reset_handler,
6002 .eh_bus_reset_handler = lpfc_bus_reset_handler,
6003 .eh_host_reset_handler = lpfc_host_reset_handler,
6004 .slave_alloc = lpfc_slave_alloc,
6005 .slave_configure = lpfc_slave_configure,
6006 .slave_destroy = lpfc_slave_destroy,
6007 .scan_finished = lpfc_scan_finished,
6008 .this_id = -1,
6009 .sg_tablesize = LPFC_DEFAULT_SG_SEG_CNT,
6010 .cmd_per_lun = LPFC_CMD_PER_LUN,
6011 .use_clustering = ENABLE_CLUSTERING,
6012 .shost_attrs = lpfc_hba_attrs,
6013 .max_sectors = 0xFFFF,
6014 .vendor_id = LPFC_NL_VENDOR_ID,
6015 .change_queue_depth = scsi_change_queue_depth,
6016 .track_queue_depth = 1,
6017};
6018
6019struct scsi_host_template lpfc_vport_template = {
6020 .module = THIS_MODULE,
6021 .name = LPFC_DRIVER_NAME,
6022 .proc_name = LPFC_DRIVER_NAME,
6023 .info = lpfc_info,
6024 .queuecommand = lpfc_queuecommand,
6025 .eh_timed_out = fc_eh_timed_out,
6026 .eh_abort_handler = lpfc_abort_handler,
6027 .eh_device_reset_handler = lpfc_device_reset_handler,
6028 .eh_target_reset_handler = lpfc_target_reset_handler,
6029 .slave_alloc = lpfc_slave_alloc,
6030 .slave_configure = lpfc_slave_configure,
6031 .slave_destroy = lpfc_slave_destroy,
6032 .scan_finished = lpfc_scan_finished,
6033 .this_id = -1,
6034 .sg_tablesize = LPFC_DEFAULT_SG_SEG_CNT,
6035 .cmd_per_lun = LPFC_CMD_PER_LUN,
6036 .use_clustering = ENABLE_CLUSTERING,
6037 .shost_attrs = lpfc_vport_attrs,
6038 .max_sectors = 0xFFFF,
6039 .change_queue_depth = scsi_change_queue_depth,
6040 .track_queue_depth = 1,
6041};
6042