1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <linux/blkdev.h>
23#include <linux/pci.h>
24#include <linux/interrupt.h>
25#include <linux/delay.h>
26#include <linux/slab.h>
27
28#include <scsi/scsi.h>
29#include <scsi/scsi_cmnd.h>
30#include <scsi/scsi_device.h>
31#include <scsi/scsi_host.h>
32#include <scsi/scsi_transport_fc.h>
33#include <scsi/fc/fc_fs.h>
34#include <linux/aer.h>
35
36#include "lpfc_hw4.h"
37#include "lpfc_hw.h"
38#include "lpfc_sli.h"
39#include "lpfc_sli4.h"
40#include "lpfc_nl.h"
41#include "lpfc_disc.h"
42#include "lpfc_scsi.h"
43#include "lpfc.h"
44#include "lpfc_crtn.h"
45#include "lpfc_logmsg.h"
46#include "lpfc_compat.h"
47#include "lpfc_debugfs.h"
48#include "lpfc_vport.h"
49
50
51typedef enum _lpfc_iocb_type {
52 LPFC_UNKNOWN_IOCB,
53 LPFC_UNSOL_IOCB,
54 LPFC_SOL_IOCB,
55 LPFC_ABORT_IOCB
56} lpfc_iocb_type;
57
58
59
60static int lpfc_sli_issue_mbox_s4(struct lpfc_hba *, LPFC_MBOXQ_t *,
61 uint32_t);
62static int lpfc_sli4_read_rev(struct lpfc_hba *, LPFC_MBOXQ_t *,
63 uint8_t *, uint32_t *);
64static struct lpfc_iocbq *lpfc_sli4_els_wcqe_to_rspiocbq(struct lpfc_hba *,
65 struct lpfc_iocbq *);
66static void lpfc_sli4_send_seq_to_ulp(struct lpfc_vport *,
67 struct hbq_dmabuf *);
68static int lpfc_sli4_fp_handle_wcqe(struct lpfc_hba *, struct lpfc_queue *,
69 struct lpfc_cqe *);
70static int lpfc_sli4_post_els_sgl_list(struct lpfc_hba *, struct list_head *,
71 int);
72static void lpfc_sli4_hba_handle_eqe(struct lpfc_hba *, struct lpfc_eqe *,
73 uint32_t);
74
75static IOCB_t *
76lpfc_get_iocb_from_iocbq(struct lpfc_iocbq *iocbq)
77{
78 return &iocbq->iocb;
79}
80
81
82
83
84
85
86
87
88
89
90
91
92
93static uint32_t
94lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe *wqe)
95{
96 union lpfc_wqe *temp_wqe;
97 struct lpfc_register doorbell;
98 uint32_t host_index;
99 uint32_t idx;
100
101
102 if (unlikely(!q))
103 return -ENOMEM;
104 temp_wqe = q->qe[q->host_index].wqe;
105
106
107 idx = ((q->host_index + 1) % q->entry_count);
108 if (idx == q->hba_index) {
109 q->WQ_overflow++;
110 return -ENOMEM;
111 }
112 q->WQ_posted++;
113
114 if (!((q->host_index + 1) % q->entry_repost))
115 bf_set(wqe_wqec, &wqe->generic.wqe_com, 1);
116 if (q->phba->sli3_options & LPFC_SLI4_PHWQ_ENABLED)
117 bf_set(wqe_wqid, &wqe->generic.wqe_com, q->queue_id);
118 lpfc_sli_pcimem_bcopy(wqe, temp_wqe, q->entry_size);
119
120
121 host_index = q->host_index;
122
123 q->host_index = idx;
124
125
126 doorbell.word0 = 0;
127 if (q->db_format == LPFC_DB_LIST_FORMAT) {
128 bf_set(lpfc_wq_db_list_fm_num_posted, &doorbell, 1);
129 bf_set(lpfc_wq_db_list_fm_index, &doorbell, host_index);
130 bf_set(lpfc_wq_db_list_fm_id, &doorbell, q->queue_id);
131 } else if (q->db_format == LPFC_DB_RING_FORMAT) {
132 bf_set(lpfc_wq_db_ring_fm_num_posted, &doorbell, 1);
133 bf_set(lpfc_wq_db_ring_fm_id, &doorbell, q->queue_id);
134 } else {
135 return -EINVAL;
136 }
137 writel(doorbell.word0, q->db_regaddr);
138
139 return 0;
140}
141
142
143
144
145
146
147
148
149
150
151
152
153static uint32_t
154lpfc_sli4_wq_release(struct lpfc_queue *q, uint32_t index)
155{
156 uint32_t released = 0;
157
158
159 if (unlikely(!q))
160 return 0;
161
162 if (q->hba_index == index)
163 return 0;
164 do {
165 q->hba_index = ((q->hba_index + 1) % q->entry_count);
166 released++;
167 } while (q->hba_index != index);
168 return released;
169}
170
171
172
173
174
175
176
177
178
179
180
181
182
183static uint32_t
184lpfc_sli4_mq_put(struct lpfc_queue *q, struct lpfc_mqe *mqe)
185{
186 struct lpfc_mqe *temp_mqe;
187 struct lpfc_register doorbell;
188 uint32_t host_index;
189
190
191 if (unlikely(!q))
192 return -ENOMEM;
193 temp_mqe = q->qe[q->host_index].mqe;
194
195
196 if (((q->host_index + 1) % q->entry_count) == q->hba_index)
197 return -ENOMEM;
198 lpfc_sli_pcimem_bcopy(mqe, temp_mqe, q->entry_size);
199
200 q->phba->mbox = (MAILBOX_t *)temp_mqe;
201
202
203 host_index = q->host_index;
204 q->host_index = ((q->host_index + 1) % q->entry_count);
205
206
207 doorbell.word0 = 0;
208 bf_set(lpfc_mq_doorbell_num_posted, &doorbell, 1);
209 bf_set(lpfc_mq_doorbell_id, &doorbell, q->queue_id);
210 writel(doorbell.word0, q->phba->sli4_hba.MQDBregaddr);
211 return 0;
212}
213
214
215
216
217
218
219
220
221
222
223
224static uint32_t
225lpfc_sli4_mq_release(struct lpfc_queue *q)
226{
227
228 if (unlikely(!q))
229 return 0;
230
231
232 q->phba->mbox = NULL;
233 q->hba_index = ((q->hba_index + 1) % q->entry_count);
234 return 1;
235}
236
237
238
239
240
241
242
243
244
245
246static struct lpfc_eqe *
247lpfc_sli4_eq_get(struct lpfc_queue *q)
248{
249 struct lpfc_eqe *eqe;
250 uint32_t idx;
251
252
253 if (unlikely(!q))
254 return NULL;
255 eqe = q->qe[q->hba_index].eqe;
256
257
258 if (!bf_get_le32(lpfc_eqe_valid, eqe))
259 return NULL;
260
261 idx = ((q->hba_index + 1) % q->entry_count);
262 if (idx == q->host_index)
263 return NULL;
264
265 q->hba_index = idx;
266 return eqe;
267}
268
269
270
271
272
273
274static inline void
275lpfc_sli4_eq_clr_intr(struct lpfc_queue *q)
276{
277 struct lpfc_register doorbell;
278
279 doorbell.word0 = 0;
280 bf_set(lpfc_eqcq_doorbell_eqci, &doorbell, 1);
281 bf_set(lpfc_eqcq_doorbell_qt, &doorbell, LPFC_QUEUE_TYPE_EVENT);
282 bf_set(lpfc_eqcq_doorbell_eqid_hi, &doorbell,
283 (q->queue_id >> LPFC_EQID_HI_FIELD_SHIFT));
284 bf_set(lpfc_eqcq_doorbell_eqid_lo, &doorbell, q->queue_id);
285 writel(doorbell.word0, q->phba->sli4_hba.EQCQDBregaddr);
286}
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303uint32_t
304lpfc_sli4_eq_release(struct lpfc_queue *q, bool arm)
305{
306 uint32_t released = 0;
307 struct lpfc_eqe *temp_eqe;
308 struct lpfc_register doorbell;
309
310
311 if (unlikely(!q))
312 return 0;
313
314
315 while (q->hba_index != q->host_index) {
316 temp_eqe = q->qe[q->host_index].eqe;
317 bf_set_le32(lpfc_eqe_valid, temp_eqe, 0);
318 released++;
319 q->host_index = ((q->host_index + 1) % q->entry_count);
320 }
321 if (unlikely(released == 0 && !arm))
322 return 0;
323
324
325 doorbell.word0 = 0;
326 if (arm) {
327 bf_set(lpfc_eqcq_doorbell_arm, &doorbell, 1);
328 bf_set(lpfc_eqcq_doorbell_eqci, &doorbell, 1);
329 }
330 bf_set(lpfc_eqcq_doorbell_num_released, &doorbell, released);
331 bf_set(lpfc_eqcq_doorbell_qt, &doorbell, LPFC_QUEUE_TYPE_EVENT);
332 bf_set(lpfc_eqcq_doorbell_eqid_hi, &doorbell,
333 (q->queue_id >> LPFC_EQID_HI_FIELD_SHIFT));
334 bf_set(lpfc_eqcq_doorbell_eqid_lo, &doorbell, q->queue_id);
335 writel(doorbell.word0, q->phba->sli4_hba.EQCQDBregaddr);
336
337 if ((q->phba->intr_type == INTx) && (arm == LPFC_QUEUE_REARM))
338 readl(q->phba->sli4_hba.EQCQDBregaddr);
339 return released;
340}
341
342
343
344
345
346
347
348
349
350
351static struct lpfc_cqe *
352lpfc_sli4_cq_get(struct lpfc_queue *q)
353{
354 struct lpfc_cqe *cqe;
355 uint32_t idx;
356
357
358 if (unlikely(!q))
359 return NULL;
360
361
362 if (!bf_get_le32(lpfc_cqe_valid, q->qe[q->hba_index].cqe))
363 return NULL;
364
365 idx = ((q->hba_index + 1) % q->entry_count);
366 if (idx == q->host_index)
367 return NULL;
368
369 cqe = q->qe[q->hba_index].cqe;
370 q->hba_index = idx;
371 return cqe;
372}
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389uint32_t
390lpfc_sli4_cq_release(struct lpfc_queue *q, bool arm)
391{
392 uint32_t released = 0;
393 struct lpfc_cqe *temp_qe;
394 struct lpfc_register doorbell;
395
396
397 if (unlikely(!q))
398 return 0;
399
400 while (q->hba_index != q->host_index) {
401 temp_qe = q->qe[q->host_index].cqe;
402 bf_set_le32(lpfc_cqe_valid, temp_qe, 0);
403 released++;
404 q->host_index = ((q->host_index + 1) % q->entry_count);
405 }
406 if (unlikely(released == 0 && !arm))
407 return 0;
408
409
410 doorbell.word0 = 0;
411 if (arm)
412 bf_set(lpfc_eqcq_doorbell_arm, &doorbell, 1);
413 bf_set(lpfc_eqcq_doorbell_num_released, &doorbell, released);
414 bf_set(lpfc_eqcq_doorbell_qt, &doorbell, LPFC_QUEUE_TYPE_COMPLETION);
415 bf_set(lpfc_eqcq_doorbell_cqid_hi, &doorbell,
416 (q->queue_id >> LPFC_CQID_HI_FIELD_SHIFT));
417 bf_set(lpfc_eqcq_doorbell_cqid_lo, &doorbell, q->queue_id);
418 writel(doorbell.word0, q->phba->sli4_hba.EQCQDBregaddr);
419 return released;
420}
421
422
423
424
425
426
427
428
429
430
431
432
433
434static int
435lpfc_sli4_rq_put(struct lpfc_queue *hq, struct lpfc_queue *dq,
436 struct lpfc_rqe *hrqe, struct lpfc_rqe *drqe)
437{
438 struct lpfc_rqe *temp_hrqe;
439 struct lpfc_rqe *temp_drqe;
440 struct lpfc_register doorbell;
441 int put_index;
442
443
444 if (unlikely(!hq) || unlikely(!dq))
445 return -ENOMEM;
446 put_index = hq->host_index;
447 temp_hrqe = hq->qe[hq->host_index].rqe;
448 temp_drqe = dq->qe[dq->host_index].rqe;
449
450 if (hq->type != LPFC_HRQ || dq->type != LPFC_DRQ)
451 return -EINVAL;
452 if (hq->host_index != dq->host_index)
453 return -EINVAL;
454
455 if (((hq->host_index + 1) % hq->entry_count) == hq->hba_index)
456 return -EBUSY;
457 lpfc_sli_pcimem_bcopy(hrqe, temp_hrqe, hq->entry_size);
458 lpfc_sli_pcimem_bcopy(drqe, temp_drqe, dq->entry_size);
459
460
461 hq->host_index = ((hq->host_index + 1) % hq->entry_count);
462 dq->host_index = ((dq->host_index + 1) % dq->entry_count);
463
464
465 if (!(hq->host_index % hq->entry_repost)) {
466 doorbell.word0 = 0;
467 if (hq->db_format == LPFC_DB_RING_FORMAT) {
468 bf_set(lpfc_rq_db_ring_fm_num_posted, &doorbell,
469 hq->entry_repost);
470 bf_set(lpfc_rq_db_ring_fm_id, &doorbell, hq->queue_id);
471 } else if (hq->db_format == LPFC_DB_LIST_FORMAT) {
472 bf_set(lpfc_rq_db_list_fm_num_posted, &doorbell,
473 hq->entry_repost);
474 bf_set(lpfc_rq_db_list_fm_index, &doorbell,
475 hq->host_index);
476 bf_set(lpfc_rq_db_list_fm_id, &doorbell, hq->queue_id);
477 } else {
478 return -EINVAL;
479 }
480 writel(doorbell.word0, hq->db_regaddr);
481 }
482 return put_index;
483}
484
485
486
487
488
489
490
491
492
493
494
495static uint32_t
496lpfc_sli4_rq_release(struct lpfc_queue *hq, struct lpfc_queue *dq)
497{
498
499 if (unlikely(!hq) || unlikely(!dq))
500 return 0;
501
502 if ((hq->type != LPFC_HRQ) || (dq->type != LPFC_DRQ))
503 return 0;
504 hq->hba_index = ((hq->hba_index + 1) % hq->entry_count);
505 dq->hba_index = ((dq->hba_index + 1) % dq->entry_count);
506 return 1;
507}
508
509
510
511
512
513
514
515
516
517
518
519static inline IOCB_t *
520lpfc_cmd_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
521{
522 return (IOCB_t *) (((char *) pring->sli.sli3.cmdringaddr) +
523 pring->sli.sli3.cmdidx * phba->iocb_cmd_size);
524}
525
526
527
528
529
530
531
532
533
534
535
536static inline IOCB_t *
537lpfc_resp_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
538{
539 return (IOCB_t *) (((char *) pring->sli.sli3.rspringaddr) +
540 pring->sli.sli3.rspidx * phba->iocb_rsp_size);
541}
542
543
544
545
546
547
548
549
550
551
552struct lpfc_iocbq *
553__lpfc_sli_get_iocbq(struct lpfc_hba *phba)
554{
555 struct list_head *lpfc_iocb_list = &phba->lpfc_iocb_list;
556 struct lpfc_iocbq * iocbq = NULL;
557
558 list_remove_head(lpfc_iocb_list, iocbq, struct lpfc_iocbq, list);
559 if (iocbq)
560 phba->iocb_cnt++;
561 if (phba->iocb_cnt > phba->iocb_max)
562 phba->iocb_max = phba->iocb_cnt;
563 return iocbq;
564}
565
566
567
568
569
570
571
572
573
574
575
576
577
578static struct lpfc_sglq *
579__lpfc_clear_active_sglq(struct lpfc_hba *phba, uint16_t xritag)
580{
581 struct lpfc_sglq *sglq;
582
583 sglq = phba->sli4_hba.lpfc_sglq_active_list[xritag];
584 phba->sli4_hba.lpfc_sglq_active_list[xritag] = NULL;
585 return sglq;
586}
587
588
589
590
591
592
593
594
595
596
597
598
599
600struct lpfc_sglq *
601__lpfc_get_active_sglq(struct lpfc_hba *phba, uint16_t xritag)
602{
603 struct lpfc_sglq *sglq;
604
605 sglq = phba->sli4_hba.lpfc_sglq_active_list[xritag];
606 return sglq;
607}
608
609
610
611
612
613
614
615
616void
617lpfc_clr_rrq_active(struct lpfc_hba *phba,
618 uint16_t xritag,
619 struct lpfc_node_rrq *rrq)
620{
621 struct lpfc_nodelist *ndlp = NULL;
622
623 if ((rrq->vport) && NLP_CHK_NODE_ACT(rrq->ndlp))
624 ndlp = lpfc_findnode_did(rrq->vport, rrq->nlp_DID);
625
626
627
628
629
630 if ((!ndlp) && rrq->ndlp)
631 ndlp = rrq->ndlp;
632
633 if (!ndlp)
634 goto out;
635
636 if (test_and_clear_bit(xritag, ndlp->active_rrqs.xri_bitmap)) {
637 rrq->send_rrq = 0;
638 rrq->xritag = 0;
639 rrq->rrq_stop_time = 0;
640 }
641out:
642 mempool_free(rrq, phba->rrq_pool);
643}
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659void
660lpfc_handle_rrq_active(struct lpfc_hba *phba)
661{
662 struct lpfc_node_rrq *rrq;
663 struct lpfc_node_rrq *nextrrq;
664 unsigned long next_time;
665 unsigned long iflags;
666 LIST_HEAD(send_rrq);
667
668 spin_lock_irqsave(&phba->hbalock, iflags);
669 phba->hba_flag &= ~HBA_RRQ_ACTIVE;
670 next_time = jiffies + HZ * (phba->fc_ratov + 1);
671 list_for_each_entry_safe(rrq, nextrrq,
672 &phba->active_rrq_list, list) {
673 if (time_after(jiffies, rrq->rrq_stop_time))
674 list_move(&rrq->list, &send_rrq);
675 else if (time_before(rrq->rrq_stop_time, next_time))
676 next_time = rrq->rrq_stop_time;
677 }
678 spin_unlock_irqrestore(&phba->hbalock, iflags);
679 if (!list_empty(&phba->active_rrq_list))
680 mod_timer(&phba->rrq_tmr, next_time);
681 list_for_each_entry_safe(rrq, nextrrq, &send_rrq, list) {
682 list_del(&rrq->list);
683 if (!rrq->send_rrq)
684
685 lpfc_clr_rrq_active(phba, rrq->xritag, rrq);
686 else if (lpfc_send_rrq(phba, rrq)) {
687
688
689
690 lpfc_clr_rrq_active(phba, rrq->xritag,
691 rrq);
692 }
693 }
694}
695
696
697
698
699
700
701
702
703
704
705struct lpfc_node_rrq *
706lpfc_get_active_rrq(struct lpfc_vport *vport, uint16_t xri, uint32_t did)
707{
708 struct lpfc_hba *phba = vport->phba;
709 struct lpfc_node_rrq *rrq;
710 struct lpfc_node_rrq *nextrrq;
711 unsigned long iflags;
712
713 if (phba->sli_rev != LPFC_SLI_REV4)
714 return NULL;
715 spin_lock_irqsave(&phba->hbalock, iflags);
716 list_for_each_entry_safe(rrq, nextrrq, &phba->active_rrq_list, list) {
717 if (rrq->vport == vport && rrq->xritag == xri &&
718 rrq->nlp_DID == did){
719 list_del(&rrq->list);
720 spin_unlock_irqrestore(&phba->hbalock, iflags);
721 return rrq;
722 }
723 }
724 spin_unlock_irqrestore(&phba->hbalock, iflags);
725 return NULL;
726}
727
728
729
730
731
732
733
734
735
736void
737lpfc_cleanup_vports_rrqs(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
738
739{
740 struct lpfc_hba *phba = vport->phba;
741 struct lpfc_node_rrq *rrq;
742 struct lpfc_node_rrq *nextrrq;
743 unsigned long iflags;
744 LIST_HEAD(rrq_list);
745
746 if (phba->sli_rev != LPFC_SLI_REV4)
747 return;
748 if (!ndlp) {
749 lpfc_sli4_vport_delete_els_xri_aborted(vport);
750 lpfc_sli4_vport_delete_fcp_xri_aborted(vport);
751 }
752 spin_lock_irqsave(&phba->hbalock, iflags);
753 list_for_each_entry_safe(rrq, nextrrq, &phba->active_rrq_list, list)
754 if ((rrq->vport == vport) && (!ndlp || rrq->ndlp == ndlp))
755 list_move(&rrq->list, &rrq_list);
756 spin_unlock_irqrestore(&phba->hbalock, iflags);
757
758 list_for_each_entry_safe(rrq, nextrrq, &rrq_list, list) {
759 list_del(&rrq->list);
760 lpfc_clr_rrq_active(phba, rrq->xritag, rrq);
761 }
762}
763
764
765
766
767
768
769
770
771
772void
773lpfc_cleanup_wt_rrqs(struct lpfc_hba *phba)
774{
775 struct lpfc_node_rrq *rrq;
776 struct lpfc_node_rrq *nextrrq;
777 unsigned long next_time;
778 unsigned long iflags;
779 LIST_HEAD(rrq_list);
780
781 if (phba->sli_rev != LPFC_SLI_REV4)
782 return;
783 spin_lock_irqsave(&phba->hbalock, iflags);
784 phba->hba_flag &= ~HBA_RRQ_ACTIVE;
785 next_time = jiffies + HZ * (phba->fc_ratov * 2);
786 list_splice_init(&phba->active_rrq_list, &rrq_list);
787 spin_unlock_irqrestore(&phba->hbalock, iflags);
788
789 list_for_each_entry_safe(rrq, nextrrq, &rrq_list, list) {
790 list_del(&rrq->list);
791 lpfc_clr_rrq_active(phba, rrq->xritag, rrq);
792 }
793 if (!list_empty(&phba->active_rrq_list))
794 mod_timer(&phba->rrq_tmr, next_time);
795}
796
797
798
799
800
801
802
803
804
805
806
807
808int
809lpfc_test_rrq_active(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
810 uint16_t xritag)
811{
812 if (!ndlp)
813 return 0;
814 if (test_bit(xritag, ndlp->active_rrqs.xri_bitmap))
815 return 1;
816 else
817 return 0;
818}
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835int
836lpfc_set_rrq_active(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
837 uint16_t xritag, uint16_t rxid, uint16_t send_rrq)
838{
839 unsigned long iflags;
840 struct lpfc_node_rrq *rrq;
841 int empty;
842
843 if (!ndlp)
844 return -EINVAL;
845
846 if (!phba->cfg_enable_rrq)
847 return -EINVAL;
848
849 spin_lock_irqsave(&phba->hbalock, iflags);
850 if (phba->pport->load_flag & FC_UNLOADING) {
851 phba->hba_flag &= ~HBA_RRQ_ACTIVE;
852 goto out;
853 }
854
855
856
857
858 if (NLP_CHK_FREE_REQ(ndlp))
859 goto out;
860
861 if (ndlp->vport && (ndlp->vport->load_flag & FC_UNLOADING))
862 goto out;
863
864 if (test_and_set_bit(xritag, ndlp->active_rrqs.xri_bitmap))
865 goto out;
866
867 spin_unlock_irqrestore(&phba->hbalock, iflags);
868 rrq = mempool_alloc(phba->rrq_pool, GFP_KERNEL);
869 if (!rrq) {
870 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
871 "3155 Unable to allocate RRQ xri:0x%x rxid:0x%x"
872 " DID:0x%x Send:%d\n",
873 xritag, rxid, ndlp->nlp_DID, send_rrq);
874 return -EINVAL;
875 }
876 rrq->send_rrq = send_rrq;
877 rrq->xritag = xritag;
878 rrq->rrq_stop_time = jiffies + HZ * (phba->fc_ratov + 1);
879 rrq->ndlp = ndlp;
880 rrq->nlp_DID = ndlp->nlp_DID;
881 rrq->vport = ndlp->vport;
882 rrq->rxid = rxid;
883 rrq->send_rrq = send_rrq;
884 spin_lock_irqsave(&phba->hbalock, iflags);
885 empty = list_empty(&phba->active_rrq_list);
886 list_add_tail(&rrq->list, &phba->active_rrq_list);
887 phba->hba_flag |= HBA_RRQ_ACTIVE;
888 if (empty)
889 lpfc_worker_wake_up(phba);
890 spin_unlock_irqrestore(&phba->hbalock, iflags);
891 return 0;
892out:
893 spin_unlock_irqrestore(&phba->hbalock, iflags);
894 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
895 "2921 Can't set rrq active xri:0x%x rxid:0x%x"
896 " DID:0x%x Send:%d\n",
897 xritag, rxid, ndlp->nlp_DID, send_rrq);
898 return -EINVAL;
899}
900
901
902
903
904
905
906
907
908
909
910
911static struct lpfc_sglq *
912__lpfc_sli_get_sglq(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq)
913{
914 struct list_head *lpfc_sgl_list = &phba->sli4_hba.lpfc_sgl_list;
915 struct lpfc_sglq *sglq = NULL;
916 struct lpfc_sglq *start_sglq = NULL;
917 struct lpfc_scsi_buf *lpfc_cmd;
918 struct lpfc_nodelist *ndlp;
919 int found = 0;
920
921 if (piocbq->iocb_flag & LPFC_IO_FCP) {
922 lpfc_cmd = (struct lpfc_scsi_buf *) piocbq->context1;
923 ndlp = lpfc_cmd->rdata->pnode;
924 } else if ((piocbq->iocb.ulpCommand == CMD_GEN_REQUEST64_CR) &&
925 !(piocbq->iocb_flag & LPFC_IO_LIBDFC))
926 ndlp = piocbq->context_un.ndlp;
927 else if ((piocbq->iocb.ulpCommand == CMD_ELS_REQUEST64_CR) &&
928 (piocbq->iocb_flag & LPFC_IO_LIBDFC))
929 ndlp = piocbq->context_un.ndlp;
930 else
931 ndlp = piocbq->context1;
932
933 list_remove_head(lpfc_sgl_list, sglq, struct lpfc_sglq, list);
934 start_sglq = sglq;
935 while (!found) {
936 if (!sglq)
937 return NULL;
938 if (lpfc_test_rrq_active(phba, ndlp, sglq->sli4_lxritag)) {
939
940
941
942 list_add_tail(&sglq->list, lpfc_sgl_list);
943 sglq = NULL;
944 list_remove_head(lpfc_sgl_list, sglq,
945 struct lpfc_sglq, list);
946 if (sglq == start_sglq) {
947 sglq = NULL;
948 break;
949 } else
950 continue;
951 }
952 sglq->ndlp = ndlp;
953 found = 1;
954 phba->sli4_hba.lpfc_sglq_active_list[sglq->sli4_lxritag] = sglq;
955 sglq->state = SGL_ALLOCATED;
956 }
957 return sglq;
958}
959
960
961
962
963
964
965
966
967
968
969struct lpfc_iocbq *
970lpfc_sli_get_iocbq(struct lpfc_hba *phba)
971{
972 struct lpfc_iocbq * iocbq = NULL;
973 unsigned long iflags;
974
975 spin_lock_irqsave(&phba->hbalock, iflags);
976 iocbq = __lpfc_sli_get_iocbq(phba);
977 spin_unlock_irqrestore(&phba->hbalock, iflags);
978 return iocbq;
979}
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999static void
1000__lpfc_sli_release_iocbq_s4(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
1001{
1002 struct lpfc_sglq *sglq;
1003 size_t start_clean = offsetof(struct lpfc_iocbq, iocb);
1004 unsigned long iflag = 0;
1005 struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
1006
1007 if (iocbq->sli4_xritag == NO_XRI)
1008 sglq = NULL;
1009 else
1010 sglq = __lpfc_clear_active_sglq(phba, iocbq->sli4_lxritag);
1011
1012 if (sglq) {
1013 if ((iocbq->iocb_flag & LPFC_EXCHANGE_BUSY) &&
1014 (sglq->state != SGL_XRI_ABORTED)) {
1015 spin_lock_irqsave(&phba->sli4_hba.abts_sgl_list_lock,
1016 iflag);
1017 list_add(&sglq->list,
1018 &phba->sli4_hba.lpfc_abts_els_sgl_list);
1019 spin_unlock_irqrestore(
1020 &phba->sli4_hba.abts_sgl_list_lock, iflag);
1021 } else {
1022 sglq->state = SGL_FREED;
1023 sglq->ndlp = NULL;
1024 list_add_tail(&sglq->list,
1025 &phba->sli4_hba.lpfc_sgl_list);
1026
1027
1028 if (pring->txq_cnt)
1029 lpfc_worker_wake_up(phba);
1030 }
1031 }
1032
1033
1034
1035
1036
1037 memset((char *)iocbq + start_clean, 0, sizeof(*iocbq) - start_clean);
1038 iocbq->sli4_lxritag = NO_XRI;
1039 iocbq->sli4_xritag = NO_XRI;
1040 list_add_tail(&iocbq->list, &phba->lpfc_iocb_list);
1041}
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054static void
1055__lpfc_sli_release_iocbq_s3(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
1056{
1057 size_t start_clean = offsetof(struct lpfc_iocbq, iocb);
1058
1059
1060
1061
1062 memset((char*)iocbq + start_clean, 0, sizeof(*iocbq) - start_clean);
1063 iocbq->sli4_xritag = NO_XRI;
1064 list_add_tail(&iocbq->list, &phba->lpfc_iocb_list);
1065}
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077static void
1078__lpfc_sli_release_iocbq(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
1079{
1080 phba->__lpfc_sli_release_iocbq(phba, iocbq);
1081 phba->iocb_cnt--;
1082}
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092void
1093lpfc_sli_release_iocbq(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
1094{
1095 unsigned long iflags;
1096
1097
1098
1099
1100 spin_lock_irqsave(&phba->hbalock, iflags);
1101 __lpfc_sli_release_iocbq(phba, iocbq);
1102 spin_unlock_irqrestore(&phba->hbalock, iflags);
1103}
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117void
1118lpfc_sli_cancel_iocbs(struct lpfc_hba *phba, struct list_head *iocblist,
1119 uint32_t ulpstatus, uint32_t ulpWord4)
1120{
1121 struct lpfc_iocbq *piocb;
1122
1123 while (!list_empty(iocblist)) {
1124 list_remove_head(iocblist, piocb, struct lpfc_iocbq, list);
1125
1126 if (!piocb->iocb_cmpl)
1127 lpfc_sli_release_iocbq(phba, piocb);
1128 else {
1129 piocb->iocb.ulpStatus = ulpstatus;
1130 piocb->iocb.un.ulpWord[4] = ulpWord4;
1131 (piocb->iocb_cmpl) (phba, piocb, piocb);
1132 }
1133 }
1134 return;
1135}
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152static lpfc_iocb_type
1153lpfc_sli_iocb_cmd_type(uint8_t iocb_cmnd)
1154{
1155 lpfc_iocb_type type = LPFC_UNKNOWN_IOCB;
1156
1157 if (iocb_cmnd > CMD_MAX_IOCB_CMD)
1158 return 0;
1159
1160 switch (iocb_cmnd) {
1161 case CMD_XMIT_SEQUENCE_CR:
1162 case CMD_XMIT_SEQUENCE_CX:
1163 case CMD_XMIT_BCAST_CN:
1164 case CMD_XMIT_BCAST_CX:
1165 case CMD_ELS_REQUEST_CR:
1166 case CMD_ELS_REQUEST_CX:
1167 case CMD_CREATE_XRI_CR:
1168 case CMD_CREATE_XRI_CX:
1169 case CMD_GET_RPI_CN:
1170 case CMD_XMIT_ELS_RSP_CX:
1171 case CMD_GET_RPI_CR:
1172 case CMD_FCP_IWRITE_CR:
1173 case CMD_FCP_IWRITE_CX:
1174 case CMD_FCP_IREAD_CR:
1175 case CMD_FCP_IREAD_CX:
1176 case CMD_FCP_ICMND_CR:
1177 case CMD_FCP_ICMND_CX:
1178 case CMD_FCP_TSEND_CX:
1179 case CMD_FCP_TRSP_CX:
1180 case CMD_FCP_TRECEIVE_CX:
1181 case CMD_FCP_AUTO_TRSP_CX:
1182 case CMD_ADAPTER_MSG:
1183 case CMD_ADAPTER_DUMP:
1184 case CMD_XMIT_SEQUENCE64_CR:
1185 case CMD_XMIT_SEQUENCE64_CX:
1186 case CMD_XMIT_BCAST64_CN:
1187 case CMD_XMIT_BCAST64_CX:
1188 case CMD_ELS_REQUEST64_CR:
1189 case CMD_ELS_REQUEST64_CX:
1190 case CMD_FCP_IWRITE64_CR:
1191 case CMD_FCP_IWRITE64_CX:
1192 case CMD_FCP_IREAD64_CR:
1193 case CMD_FCP_IREAD64_CX:
1194 case CMD_FCP_ICMND64_CR:
1195 case CMD_FCP_ICMND64_CX:
1196 case CMD_FCP_TSEND64_CX:
1197 case CMD_FCP_TRSP64_CX:
1198 case CMD_FCP_TRECEIVE64_CX:
1199 case CMD_GEN_REQUEST64_CR:
1200 case CMD_GEN_REQUEST64_CX:
1201 case CMD_XMIT_ELS_RSP64_CX:
1202 case DSSCMD_IWRITE64_CR:
1203 case DSSCMD_IWRITE64_CX:
1204 case DSSCMD_IREAD64_CR:
1205 case DSSCMD_IREAD64_CX:
1206 type = LPFC_SOL_IOCB;
1207 break;
1208 case CMD_ABORT_XRI_CN:
1209 case CMD_ABORT_XRI_CX:
1210 case CMD_CLOSE_XRI_CN:
1211 case CMD_CLOSE_XRI_CX:
1212 case CMD_XRI_ABORTED_CX:
1213 case CMD_ABORT_MXRI64_CN:
1214 case CMD_XMIT_BLS_RSP64_CX:
1215 type = LPFC_ABORT_IOCB;
1216 break;
1217 case CMD_RCV_SEQUENCE_CX:
1218 case CMD_RCV_ELS_REQ_CX:
1219 case CMD_RCV_SEQUENCE64_CX:
1220 case CMD_RCV_ELS_REQ64_CX:
1221 case CMD_ASYNC_STATUS:
1222 case CMD_IOCB_RCV_SEQ64_CX:
1223 case CMD_IOCB_RCV_ELS64_CX:
1224 case CMD_IOCB_RCV_CONT64_CX:
1225 case CMD_IOCB_RET_XRI64_CX:
1226 type = LPFC_UNSOL_IOCB;
1227 break;
1228 case CMD_IOCB_XMIT_MSEQ64_CR:
1229 case CMD_IOCB_XMIT_MSEQ64_CX:
1230 case CMD_IOCB_RCV_SEQ_LIST64_CX:
1231 case CMD_IOCB_RCV_ELS_LIST64_CX:
1232 case CMD_IOCB_CLOSE_EXTENDED_CN:
1233 case CMD_IOCB_ABORT_EXTENDED_CN:
1234 case CMD_IOCB_RET_HBQE64_CN:
1235 case CMD_IOCB_FCP_IBIDIR64_CR:
1236 case CMD_IOCB_FCP_IBIDIR64_CX:
1237 case CMD_IOCB_FCP_ITASKMGT64_CX:
1238 case CMD_IOCB_LOGENTRY_CN:
1239 case CMD_IOCB_LOGENTRY_ASYNC_CN:
1240 printk("%s - Unhandled SLI-3 Command x%x\n",
1241 __func__, iocb_cmnd);
1242 type = LPFC_UNKNOWN_IOCB;
1243 break;
1244 default:
1245 type = LPFC_UNKNOWN_IOCB;
1246 break;
1247 }
1248
1249 return type;
1250}
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263static int
1264lpfc_sli_ring_map(struct lpfc_hba *phba)
1265{
1266 struct lpfc_sli *psli = &phba->sli;
1267 LPFC_MBOXQ_t *pmb;
1268 MAILBOX_t *pmbox;
1269 int i, rc, ret = 0;
1270
1271 pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1272 if (!pmb)
1273 return -ENOMEM;
1274 pmbox = &pmb->u.mb;
1275 phba->link_state = LPFC_INIT_MBX_CMDS;
1276 for (i = 0; i < psli->num_rings; i++) {
1277 lpfc_config_ring(phba, i, pmb);
1278 rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL);
1279 if (rc != MBX_SUCCESS) {
1280 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
1281 "0446 Adapter failed to init (%d), "
1282 "mbxCmd x%x CFG_RING, mbxStatus x%x, "
1283 "ring %d\n",
1284 rc, pmbox->mbxCommand,
1285 pmbox->mbxStatus, i);
1286 phba->link_state = LPFC_HBA_ERROR;
1287 ret = -ENXIO;
1288 break;
1289 }
1290 }
1291 mempool_free(pmb, phba->mbox_mem_pool);
1292 return ret;
1293}
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307static int
1308lpfc_sli_ringtxcmpl_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
1309 struct lpfc_iocbq *piocb)
1310{
1311 list_add_tail(&piocb->list, &pring->txcmplq);
1312 piocb->iocb_flag |= LPFC_IO_ON_TXCMPLQ;
1313 pring->txcmplq_cnt++;
1314 if (pring->txcmplq_cnt > pring->txcmplq_max)
1315 pring->txcmplq_max = pring->txcmplq_cnt;
1316
1317 if ((unlikely(pring->ringno == LPFC_ELS_RING)) &&
1318 (piocb->iocb.ulpCommand != CMD_ABORT_XRI_CN) &&
1319 (piocb->iocb.ulpCommand != CMD_CLOSE_XRI_CN)) {
1320 if (!piocb->vport)
1321 BUG();
1322 else
1323 mod_timer(&piocb->vport->els_tmofunc,
1324 jiffies + HZ * (phba->fc_ratov << 1));
1325 }
1326
1327
1328 return 0;
1329}
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341struct lpfc_iocbq *
1342lpfc_sli_ringtx_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
1343{
1344 struct lpfc_iocbq *cmd_iocb;
1345
1346 list_remove_head((&pring->txq), cmd_iocb, struct lpfc_iocbq, list);
1347 if (cmd_iocb != NULL)
1348 pring->txq_cnt--;
1349 return cmd_iocb;
1350}
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366static IOCB_t *
1367lpfc_sli_next_iocb_slot (struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
1368{
1369 struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno];
1370 uint32_t max_cmd_idx = pring->sli.sli3.numCiocb;
1371 if ((pring->sli.sli3.next_cmdidx == pring->sli.sli3.cmdidx) &&
1372 (++pring->sli.sli3.next_cmdidx >= max_cmd_idx))
1373 pring->sli.sli3.next_cmdidx = 0;
1374
1375 if (unlikely(pring->sli.sli3.local_getidx ==
1376 pring->sli.sli3.next_cmdidx)) {
1377
1378 pring->sli.sli3.local_getidx = le32_to_cpu(pgp->cmdGetInx);
1379
1380 if (unlikely(pring->sli.sli3.local_getidx >= max_cmd_idx)) {
1381 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
1382 "0315 Ring %d issue: portCmdGet %d "
1383 "is bigger than cmd ring %d\n",
1384 pring->ringno,
1385 pring->sli.sli3.local_getidx,
1386 max_cmd_idx);
1387
1388 phba->link_state = LPFC_HBA_ERROR;
1389
1390
1391
1392
1393 phba->work_ha |= HA_ERATT;
1394 phba->work_hs = HS_FFER3;
1395
1396 lpfc_worker_wake_up(phba);
1397
1398 return NULL;
1399 }
1400
1401 if (pring->sli.sli3.local_getidx == pring->sli.sli3.next_cmdidx)
1402 return NULL;
1403 }
1404
1405 return lpfc_cmd_iocb(phba, pring);
1406}
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420uint16_t
1421lpfc_sli_next_iotag(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
1422{
1423 struct lpfc_iocbq **new_arr;
1424 struct lpfc_iocbq **old_arr;
1425 size_t new_len;
1426 struct lpfc_sli *psli = &phba->sli;
1427 uint16_t iotag;
1428
1429 spin_lock_irq(&phba->hbalock);
1430 iotag = psli->last_iotag;
1431 if(++iotag < psli->iocbq_lookup_len) {
1432 psli->last_iotag = iotag;
1433 psli->iocbq_lookup[iotag] = iocbq;
1434 spin_unlock_irq(&phba->hbalock);
1435 iocbq->iotag = iotag;
1436 return iotag;
1437 } else if (psli->iocbq_lookup_len < (0xffff
1438 - LPFC_IOCBQ_LOOKUP_INCREMENT)) {
1439 new_len = psli->iocbq_lookup_len + LPFC_IOCBQ_LOOKUP_INCREMENT;
1440 spin_unlock_irq(&phba->hbalock);
1441 new_arr = kzalloc(new_len * sizeof (struct lpfc_iocbq *),
1442 GFP_KERNEL);
1443 if (new_arr) {
1444 spin_lock_irq(&phba->hbalock);
1445 old_arr = psli->iocbq_lookup;
1446 if (new_len <= psli->iocbq_lookup_len) {
1447
1448 kfree(new_arr);
1449 iotag = psli->last_iotag;
1450 if(++iotag < psli->iocbq_lookup_len) {
1451 psli->last_iotag = iotag;
1452 psli->iocbq_lookup[iotag] = iocbq;
1453 spin_unlock_irq(&phba->hbalock);
1454 iocbq->iotag = iotag;
1455 return iotag;
1456 }
1457 spin_unlock_irq(&phba->hbalock);
1458 return 0;
1459 }
1460 if (psli->iocbq_lookup)
1461 memcpy(new_arr, old_arr,
1462 ((psli->last_iotag + 1) *
1463 sizeof (struct lpfc_iocbq *)));
1464 psli->iocbq_lookup = new_arr;
1465 psli->iocbq_lookup_len = new_len;
1466 psli->last_iotag = iotag;
1467 psli->iocbq_lookup[iotag] = iocbq;
1468 spin_unlock_irq(&phba->hbalock);
1469 iocbq->iotag = iotag;
1470 kfree(old_arr);
1471 return iotag;
1472 }
1473 } else
1474 spin_unlock_irq(&phba->hbalock);
1475
1476 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
1477 "0318 Failed to allocate IOTAG.last IOTAG is %d\n",
1478 psli->last_iotag);
1479
1480 return 0;
1481}
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497static void
1498lpfc_sli_submit_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
1499 IOCB_t *iocb, struct lpfc_iocbq *nextiocb)
1500{
1501
1502
1503
1504 nextiocb->iocb.ulpIoTag = (nextiocb->iocb_cmpl) ? nextiocb->iotag : 0;
1505
1506
1507 if (pring->ringno == LPFC_ELS_RING) {
1508 lpfc_debugfs_slow_ring_trc(phba,
1509 "IOCB cmd ring: wd4:x%08x wd6:x%08x wd7:x%08x",
1510 *(((uint32_t *) &nextiocb->iocb) + 4),
1511 *(((uint32_t *) &nextiocb->iocb) + 6),
1512 *(((uint32_t *) &nextiocb->iocb) + 7));
1513 }
1514
1515
1516
1517
1518 lpfc_sli_pcimem_bcopy(&nextiocb->iocb, iocb, phba->iocb_cmd_size);
1519 wmb();
1520 pring->stats.iocb_cmd++;
1521
1522
1523
1524
1525
1526
1527 if (nextiocb->iocb_cmpl)
1528 lpfc_sli_ringtxcmpl_put(phba, pring, nextiocb);
1529 else
1530 __lpfc_sli_release_iocbq(phba, nextiocb);
1531
1532
1533
1534
1535
1536 pring->sli.sli3.cmdidx = pring->sli.sli3.next_cmdidx;
1537 writel(pring->sli.sli3.cmdidx, &phba->host_gp[pring->ringno].cmdPutInx);
1538}
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552static void
1553lpfc_sli_update_full_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
1554{
1555 int ringno = pring->ringno;
1556
1557 pring->flag |= LPFC_CALL_RING_AVAILABLE;
1558
1559 wmb();
1560
1561
1562
1563
1564
1565 writel((CA_R0ATT|CA_R0CE_REQ) << (ringno*4), phba->CAregaddr);
1566 readl(phba->CAregaddr);
1567
1568 pring->stats.iocb_cmd_full++;
1569}
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580static void
1581lpfc_sli_update_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
1582{
1583 int ringno = pring->ringno;
1584
1585
1586
1587
1588 if (!(phba->sli3_options & LPFC_SLI3_CRP_ENABLED)) {
1589 wmb();
1590 writel(CA_R0ATT << (ringno * 4), phba->CAregaddr);
1591 readl(phba->CAregaddr);
1592 }
1593}
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604static void
1605lpfc_sli_resume_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
1606{
1607 IOCB_t *iocb;
1608 struct lpfc_iocbq *nextiocb;
1609
1610
1611
1612
1613
1614
1615
1616
1617 if (pring->txq_cnt &&
1618 lpfc_is_link_up(phba) &&
1619 (pring->ringno != phba->sli.fcp_ring ||
1620 phba->sli.sli_flag & LPFC_PROCESS_LA)) {
1621
1622 while ((iocb = lpfc_sli_next_iocb_slot(phba, pring)) &&
1623 (nextiocb = lpfc_sli_ringtx_get(phba, pring)))
1624 lpfc_sli_submit_iocb(phba, pring, iocb, nextiocb);
1625
1626 if (iocb)
1627 lpfc_sli_update_ring(phba, pring);
1628 else
1629 lpfc_sli_update_full_ring(phba, pring);
1630 }
1631
1632 return;
1633}
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645static struct lpfc_hbq_entry *
1646lpfc_sli_next_hbq_slot(struct lpfc_hba *phba, uint32_t hbqno)
1647{
1648 struct hbq_s *hbqp = &phba->hbqs[hbqno];
1649
1650 if (hbqp->next_hbqPutIdx == hbqp->hbqPutIdx &&
1651 ++hbqp->next_hbqPutIdx >= hbqp->entry_count)
1652 hbqp->next_hbqPutIdx = 0;
1653
1654 if (unlikely(hbqp->local_hbqGetIdx == hbqp->next_hbqPutIdx)) {
1655 uint32_t raw_index = phba->hbq_get[hbqno];
1656 uint32_t getidx = le32_to_cpu(raw_index);
1657
1658 hbqp->local_hbqGetIdx = getidx;
1659
1660 if (unlikely(hbqp->local_hbqGetIdx >= hbqp->entry_count)) {
1661 lpfc_printf_log(phba, KERN_ERR,
1662 LOG_SLI | LOG_VPORT,
1663 "1802 HBQ %d: local_hbqGetIdx "
1664 "%u is > than hbqp->entry_count %u\n",
1665 hbqno, hbqp->local_hbqGetIdx,
1666 hbqp->entry_count);
1667
1668 phba->link_state = LPFC_HBA_ERROR;
1669 return NULL;
1670 }
1671
1672 if (hbqp->local_hbqGetIdx == hbqp->next_hbqPutIdx)
1673 return NULL;
1674 }
1675
1676 return (struct lpfc_hbq_entry *) phba->hbqs[hbqno].hbq_virt +
1677 hbqp->hbqPutIdx;
1678}
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689void
1690lpfc_sli_hbqbuf_free_all(struct lpfc_hba *phba)
1691{
1692 struct lpfc_dmabuf *dmabuf, *next_dmabuf;
1693 struct hbq_dmabuf *hbq_buf;
1694 unsigned long flags;
1695 int i, hbq_count;
1696 uint32_t hbqno;
1697
1698 hbq_count = lpfc_sli_hbq_count();
1699
1700 spin_lock_irqsave(&phba->hbalock, flags);
1701 for (i = 0; i < hbq_count; ++i) {
1702 list_for_each_entry_safe(dmabuf, next_dmabuf,
1703 &phba->hbqs[i].hbq_buffer_list, list) {
1704 hbq_buf = container_of(dmabuf, struct hbq_dmabuf, dbuf);
1705 list_del(&hbq_buf->dbuf.list);
1706 (phba->hbqs[i].hbq_free_buffer)(phba, hbq_buf);
1707 }
1708 phba->hbqs[i].buffer_count = 0;
1709 }
1710
1711 list_for_each_entry_safe(dmabuf, next_dmabuf, &phba->rb_pend_list,
1712 list) {
1713 hbq_buf = container_of(dmabuf, struct hbq_dmabuf, dbuf);
1714 list_del(&hbq_buf->dbuf.list);
1715 if (hbq_buf->tag == -1) {
1716 (phba->hbqs[LPFC_ELS_HBQ].hbq_free_buffer)
1717 (phba, hbq_buf);
1718 } else {
1719 hbqno = hbq_buf->tag >> 16;
1720 if (hbqno >= LPFC_MAX_HBQS)
1721 (phba->hbqs[LPFC_ELS_HBQ].hbq_free_buffer)
1722 (phba, hbq_buf);
1723 else
1724 (phba->hbqs[hbqno].hbq_free_buffer)(phba,
1725 hbq_buf);
1726 }
1727 }
1728
1729
1730 phba->hbq_in_use = 0;
1731 spin_unlock_irqrestore(&phba->hbalock, flags);
1732}
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746static int
1747lpfc_sli_hbq_to_firmware(struct lpfc_hba *phba, uint32_t hbqno,
1748 struct hbq_dmabuf *hbq_buf)
1749{
1750 return phba->lpfc_sli_hbq_to_firmware(phba, hbqno, hbq_buf);
1751}
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764static int
1765lpfc_sli_hbq_to_firmware_s3(struct lpfc_hba *phba, uint32_t hbqno,
1766 struct hbq_dmabuf *hbq_buf)
1767{
1768 struct lpfc_hbq_entry *hbqe;
1769 dma_addr_t physaddr = hbq_buf->dbuf.phys;
1770
1771
1772 hbqe = lpfc_sli_next_hbq_slot(phba, hbqno);
1773 if (hbqe) {
1774 struct hbq_s *hbqp = &phba->hbqs[hbqno];
1775
1776 hbqe->bde.addrHigh = le32_to_cpu(putPaddrHigh(physaddr));
1777 hbqe->bde.addrLow = le32_to_cpu(putPaddrLow(physaddr));
1778 hbqe->bde.tus.f.bdeSize = hbq_buf->size;
1779 hbqe->bde.tus.f.bdeFlags = 0;
1780 hbqe->bde.tus.w = le32_to_cpu(hbqe->bde.tus.w);
1781 hbqe->buffer_tag = le32_to_cpu(hbq_buf->tag);
1782
1783 hbqp->hbqPutIdx = hbqp->next_hbqPutIdx;
1784 writel(hbqp->hbqPutIdx, phba->hbq_put + hbqno);
1785
1786 readl(phba->hbq_put + hbqno);
1787 list_add_tail(&hbq_buf->dbuf.list, &hbqp->hbq_buffer_list);
1788 return 0;
1789 } else
1790 return -ENOMEM;
1791}
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803static int
1804lpfc_sli_hbq_to_firmware_s4(struct lpfc_hba *phba, uint32_t hbqno,
1805 struct hbq_dmabuf *hbq_buf)
1806{
1807 int rc;
1808 struct lpfc_rqe hrqe;
1809 struct lpfc_rqe drqe;
1810
1811 hrqe.address_lo = putPaddrLow(hbq_buf->hbuf.phys);
1812 hrqe.address_hi = putPaddrHigh(hbq_buf->hbuf.phys);
1813 drqe.address_lo = putPaddrLow(hbq_buf->dbuf.phys);
1814 drqe.address_hi = putPaddrHigh(hbq_buf->dbuf.phys);
1815 rc = lpfc_sli4_rq_put(phba->sli4_hba.hdr_rq, phba->sli4_hba.dat_rq,
1816 &hrqe, &drqe);
1817 if (rc < 0)
1818 return rc;
1819 hbq_buf->tag = rc;
1820 list_add_tail(&hbq_buf->dbuf.list, &phba->hbqs[hbqno].hbq_buffer_list);
1821 return 0;
1822}
1823
1824
1825static struct lpfc_hbq_init lpfc_els_hbq = {
1826 .rn = 1,
1827 .entry_count = 256,
1828 .mask_count = 0,
1829 .profile = 0,
1830 .ring_mask = (1 << LPFC_ELS_RING),
1831 .buffer_count = 0,
1832 .init_count = 40,
1833 .add_count = 40,
1834};
1835
1836
1837static struct lpfc_hbq_init lpfc_extra_hbq = {
1838 .rn = 1,
1839 .entry_count = 200,
1840 .mask_count = 0,
1841 .profile = 0,
1842 .ring_mask = (1 << LPFC_EXTRA_RING),
1843 .buffer_count = 0,
1844 .init_count = 0,
1845 .add_count = 5,
1846};
1847
1848
1849struct lpfc_hbq_init *lpfc_hbq_defs[] = {
1850 &lpfc_els_hbq,
1851 &lpfc_extra_hbq,
1852};
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864static int
1865lpfc_sli_hbqbuf_fill_hbqs(struct lpfc_hba *phba, uint32_t hbqno, uint32_t count)
1866{
1867 uint32_t i, posted = 0;
1868 unsigned long flags;
1869 struct hbq_dmabuf *hbq_buffer;
1870 LIST_HEAD(hbq_buf_list);
1871 if (!phba->hbqs[hbqno].hbq_alloc_buffer)
1872 return 0;
1873
1874 if ((phba->hbqs[hbqno].buffer_count + count) >
1875 lpfc_hbq_defs[hbqno]->entry_count)
1876 count = lpfc_hbq_defs[hbqno]->entry_count -
1877 phba->hbqs[hbqno].buffer_count;
1878 if (!count)
1879 return 0;
1880
1881 for (i = 0; i < count; i++) {
1882 hbq_buffer = (phba->hbqs[hbqno].hbq_alloc_buffer)(phba);
1883 if (!hbq_buffer)
1884 break;
1885 list_add_tail(&hbq_buffer->dbuf.list, &hbq_buf_list);
1886 }
1887
1888 spin_lock_irqsave(&phba->hbalock, flags);
1889 if (!phba->hbq_in_use)
1890 goto err;
1891 while (!list_empty(&hbq_buf_list)) {
1892 list_remove_head(&hbq_buf_list, hbq_buffer, struct hbq_dmabuf,
1893 dbuf.list);
1894 hbq_buffer->tag = (phba->hbqs[hbqno].buffer_count |
1895 (hbqno << 16));
1896 if (!lpfc_sli_hbq_to_firmware(phba, hbqno, hbq_buffer)) {
1897 phba->hbqs[hbqno].buffer_count++;
1898 posted++;
1899 } else
1900 (phba->hbqs[hbqno].hbq_free_buffer)(phba, hbq_buffer);
1901 }
1902 spin_unlock_irqrestore(&phba->hbalock, flags);
1903 return posted;
1904err:
1905 spin_unlock_irqrestore(&phba->hbalock, flags);
1906 while (!list_empty(&hbq_buf_list)) {
1907 list_remove_head(&hbq_buf_list, hbq_buffer, struct hbq_dmabuf,
1908 dbuf.list);
1909 (phba->hbqs[hbqno].hbq_free_buffer)(phba, hbq_buffer);
1910 }
1911 return 0;
1912}
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923int
1924lpfc_sli_hbqbuf_add_hbqs(struct lpfc_hba *phba, uint32_t qno)
1925{
1926 if (phba->sli_rev == LPFC_SLI_REV4)
1927 return 0;
1928 else
1929 return lpfc_sli_hbqbuf_fill_hbqs(phba, qno,
1930 lpfc_hbq_defs[qno]->add_count);
1931}
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942static int
1943lpfc_sli_hbqbuf_init_hbqs(struct lpfc_hba *phba, uint32_t qno)
1944{
1945 if (phba->sli_rev == LPFC_SLI_REV4)
1946 return lpfc_sli_hbqbuf_fill_hbqs(phba, qno,
1947 lpfc_hbq_defs[qno]->entry_count);
1948 else
1949 return lpfc_sli_hbqbuf_fill_hbqs(phba, qno,
1950 lpfc_hbq_defs[qno]->init_count);
1951}
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961static struct hbq_dmabuf *
1962lpfc_sli_hbqbuf_get(struct list_head *rb_list)
1963{
1964 struct lpfc_dmabuf *d_buf;
1965
1966 list_remove_head(rb_list, d_buf, struct lpfc_dmabuf, list);
1967 if (!d_buf)
1968 return NULL;
1969 return container_of(d_buf, struct hbq_dmabuf, dbuf);
1970}
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982static struct hbq_dmabuf *
1983lpfc_sli_hbqbuf_find(struct lpfc_hba *phba, uint32_t tag)
1984{
1985 struct lpfc_dmabuf *d_buf;
1986 struct hbq_dmabuf *hbq_buf;
1987 uint32_t hbqno;
1988
1989 hbqno = tag >> 16;
1990 if (hbqno >= LPFC_MAX_HBQS)
1991 return NULL;
1992
1993 spin_lock_irq(&phba->hbalock);
1994 list_for_each_entry(d_buf, &phba->hbqs[hbqno].hbq_buffer_list, list) {
1995 hbq_buf = container_of(d_buf, struct hbq_dmabuf, dbuf);
1996 if (hbq_buf->tag == tag) {
1997 spin_unlock_irq(&phba->hbalock);
1998 return hbq_buf;
1999 }
2000 }
2001 spin_unlock_irq(&phba->hbalock);
2002 lpfc_printf_log(phba, KERN_ERR, LOG_SLI | LOG_VPORT,
2003 "1803 Bad hbq tag. Data: x%x x%x\n",
2004 tag, phba->hbqs[tag >> 16].buffer_count);
2005 return NULL;
2006}
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017void
2018lpfc_sli_free_hbq(struct lpfc_hba *phba, struct hbq_dmabuf *hbq_buffer)
2019{
2020 uint32_t hbqno;
2021
2022 if (hbq_buffer) {
2023 hbqno = hbq_buffer->tag >> 16;
2024 if (lpfc_sli_hbq_to_firmware(phba, hbqno, hbq_buffer))
2025 (phba->hbqs[hbqno].hbq_free_buffer)(phba, hbq_buffer);
2026 }
2027}
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038static int
2039lpfc_sli_chk_mbx_command(uint8_t mbxCommand)
2040{
2041 uint8_t ret;
2042
2043 switch (mbxCommand) {
2044 case MBX_LOAD_SM:
2045 case MBX_READ_NV:
2046 case MBX_WRITE_NV:
2047 case MBX_WRITE_VPARMS:
2048 case MBX_RUN_BIU_DIAG:
2049 case MBX_INIT_LINK:
2050 case MBX_DOWN_LINK:
2051 case MBX_CONFIG_LINK:
2052 case MBX_CONFIG_RING:
2053 case MBX_RESET_RING:
2054 case MBX_READ_CONFIG:
2055 case MBX_READ_RCONFIG:
2056 case MBX_READ_SPARM:
2057 case MBX_READ_STATUS:
2058 case MBX_READ_RPI:
2059 case MBX_READ_XRI:
2060 case MBX_READ_REV:
2061 case MBX_READ_LNK_STAT:
2062 case MBX_REG_LOGIN:
2063 case MBX_UNREG_LOGIN:
2064 case MBX_CLEAR_LA:
2065 case MBX_DUMP_MEMORY:
2066 case MBX_DUMP_CONTEXT:
2067 case MBX_RUN_DIAGS:
2068 case MBX_RESTART:
2069 case MBX_UPDATE_CFG:
2070 case MBX_DOWN_LOAD:
2071 case MBX_DEL_LD_ENTRY:
2072 case MBX_RUN_PROGRAM:
2073 case MBX_SET_MASK:
2074 case MBX_SET_VARIABLE:
2075 case MBX_UNREG_D_ID:
2076 case MBX_KILL_BOARD:
2077 case MBX_CONFIG_FARP:
2078 case MBX_BEACON:
2079 case MBX_LOAD_AREA:
2080 case MBX_RUN_BIU_DIAG64:
2081 case MBX_CONFIG_PORT:
2082 case MBX_READ_SPARM64:
2083 case MBX_READ_RPI64:
2084 case MBX_REG_LOGIN64:
2085 case MBX_READ_TOPOLOGY:
2086 case MBX_WRITE_WWN:
2087 case MBX_SET_DEBUG:
2088 case MBX_LOAD_EXP_ROM:
2089 case MBX_ASYNCEVT_ENABLE:
2090 case MBX_REG_VPI:
2091 case MBX_UNREG_VPI:
2092 case MBX_HEARTBEAT:
2093 case MBX_PORT_CAPABILITIES:
2094 case MBX_PORT_IOV_CONTROL:
2095 case MBX_SLI4_CONFIG:
2096 case MBX_SLI4_REQ_FTRS:
2097 case MBX_REG_FCFI:
2098 case MBX_UNREG_FCFI:
2099 case MBX_REG_VFI:
2100 case MBX_UNREG_VFI:
2101 case MBX_INIT_VPI:
2102 case MBX_INIT_VFI:
2103 case MBX_RESUME_RPI:
2104 case MBX_READ_EVENT_LOG_STATUS:
2105 case MBX_READ_EVENT_LOG:
2106 case MBX_SECURITY_MGMT:
2107 case MBX_AUTH_PORT:
2108 case MBX_ACCESS_VDATA:
2109 ret = mbxCommand;
2110 break;
2111 default:
2112 ret = MBX_SHUTDOWN;
2113 break;
2114 }
2115 return ret;
2116}
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129void
2130lpfc_sli_wake_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
2131{
2132 wait_queue_head_t *pdone_q;
2133 unsigned long drvr_flag;
2134
2135
2136
2137
2138
2139 pmboxq->mbox_flag |= LPFC_MBX_WAKE;
2140 spin_lock_irqsave(&phba->hbalock, drvr_flag);
2141 pdone_q = (wait_queue_head_t *) pmboxq->context1;
2142 if (pdone_q)
2143 wake_up_interruptible(pdone_q);
2144 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
2145 return;
2146}
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159void
2160lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
2161{
2162 struct lpfc_vport *vport = pmb->vport;
2163 struct lpfc_dmabuf *mp;
2164 struct lpfc_nodelist *ndlp;
2165 struct Scsi_Host *shost;
2166 uint16_t rpi, vpi;
2167 int rc;
2168
2169 mp = (struct lpfc_dmabuf *) (pmb->context1);
2170
2171 if (mp) {
2172 lpfc_mbuf_free(phba, mp->virt, mp->phys);
2173 kfree(mp);
2174 }
2175
2176
2177
2178
2179
2180 if (!(phba->pport->load_flag & FC_UNLOADING) &&
2181 pmb->u.mb.mbxCommand == MBX_REG_LOGIN64 &&
2182 !pmb->u.mb.mbxStatus) {
2183 rpi = pmb->u.mb.un.varWords[0];
2184 vpi = pmb->u.mb.un.varRegLogin.vpi;
2185 lpfc_unreg_login(phba, vpi, rpi, pmb);
2186 pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
2187 rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
2188 if (rc != MBX_NOT_FINISHED)
2189 return;
2190 }
2191
2192 if ((pmb->u.mb.mbxCommand == MBX_REG_VPI) &&
2193 !(phba->pport->load_flag & FC_UNLOADING) &&
2194 !pmb->u.mb.mbxStatus) {
2195 shost = lpfc_shost_from_vport(vport);
2196 spin_lock_irq(shost->host_lock);
2197 vport->vpi_state |= LPFC_VPI_REGISTERED;
2198 vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI;
2199 spin_unlock_irq(shost->host_lock);
2200 }
2201
2202 if (pmb->u.mb.mbxCommand == MBX_REG_LOGIN64) {
2203 ndlp = (struct lpfc_nodelist *)pmb->context2;
2204 lpfc_nlp_put(ndlp);
2205 pmb->context2 = NULL;
2206 }
2207
2208
2209 if ((pmb->u.mb.mbxCommand == MBX_INIT_LINK) &&
2210 (pmb->u.mb.mbxStatus == MBXERR_SEC_NO_PERMISSION))
2211 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
2212 "2860 SLI authentication is required "
2213 "for INIT_LINK but has not done yet\n");
2214
2215 if (bf_get(lpfc_mqe_command, &pmb->u.mqe) == MBX_SLI4_CONFIG)
2216 lpfc_sli4_mbox_cmd_free(phba, pmb);
2217 else
2218 mempool_free(pmb, phba->mbox_mem_pool);
2219}
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234int
2235lpfc_sli_handle_mb_event(struct lpfc_hba *phba)
2236{
2237 MAILBOX_t *pmbox;
2238 LPFC_MBOXQ_t *pmb;
2239 int rc;
2240 LIST_HEAD(cmplq);
2241
2242 phba->sli.slistat.mbox_event++;
2243
2244
2245 spin_lock_irq(&phba->hbalock);
2246 list_splice_init(&phba->sli.mboxq_cmpl, &cmplq);
2247 spin_unlock_irq(&phba->hbalock);
2248
2249
2250 do {
2251 list_remove_head(&cmplq, pmb, LPFC_MBOXQ_t, list);
2252 if (pmb == NULL)
2253 break;
2254
2255 pmbox = &pmb->u.mb;
2256
2257 if (pmbox->mbxCommand != MBX_HEARTBEAT) {
2258 if (pmb->vport) {
2259 lpfc_debugfs_disc_trc(pmb->vport,
2260 LPFC_DISC_TRC_MBOX_VPORT,
2261 "MBOX cmpl vport: cmd:x%x mb:x%x x%x",
2262 (uint32_t)pmbox->mbxCommand,
2263 pmbox->un.varWords[0],
2264 pmbox->un.varWords[1]);
2265 }
2266 else {
2267 lpfc_debugfs_disc_trc(phba->pport,
2268 LPFC_DISC_TRC_MBOX,
2269 "MBOX cmpl: cmd:x%x mb:x%x x%x",
2270 (uint32_t)pmbox->mbxCommand,
2271 pmbox->un.varWords[0],
2272 pmbox->un.varWords[1]);
2273 }
2274 }
2275
2276
2277
2278
2279 if (lpfc_sli_chk_mbx_command(pmbox->mbxCommand) ==
2280 MBX_SHUTDOWN) {
2281
2282 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
2283 "(%d):0323 Unknown Mailbox command "
2284 "x%x (x%x/x%x) Cmpl\n",
2285 pmb->vport ? pmb->vport->vpi : 0,
2286 pmbox->mbxCommand,
2287 lpfc_sli_config_mbox_subsys_get(phba,
2288 pmb),
2289 lpfc_sli_config_mbox_opcode_get(phba,
2290 pmb));
2291 phba->link_state = LPFC_HBA_ERROR;
2292 phba->work_hs = HS_FFER3;
2293 lpfc_handle_eratt(phba);
2294 continue;
2295 }
2296
2297 if (pmbox->mbxStatus) {
2298 phba->sli.slistat.mbox_stat_err++;
2299 if (pmbox->mbxStatus == MBXERR_NO_RESOURCES) {
2300
2301 lpfc_printf_log(phba, KERN_INFO,
2302 LOG_MBOX | LOG_SLI,
2303 "(%d):0305 Mbox cmd cmpl "
2304 "error - RETRYing Data: x%x "
2305 "(x%x/x%x) x%x x%x x%x\n",
2306 pmb->vport ? pmb->vport->vpi : 0,
2307 pmbox->mbxCommand,
2308 lpfc_sli_config_mbox_subsys_get(phba,
2309 pmb),
2310 lpfc_sli_config_mbox_opcode_get(phba,
2311 pmb),
2312 pmbox->mbxStatus,
2313 pmbox->un.varWords[0],
2314 pmb->vport->port_state);
2315 pmbox->mbxStatus = 0;
2316 pmbox->mbxOwner = OWN_HOST;
2317 rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
2318 if (rc != MBX_NOT_FINISHED)
2319 continue;
2320 }
2321 }
2322
2323
2324 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
2325 "(%d):0307 Mailbox cmd x%x (x%x/x%x) Cmpl x%p "
2326 "Data: x%x x%x x%x x%x x%x x%x x%x x%x x%x\n",
2327 pmb->vport ? pmb->vport->vpi : 0,
2328 pmbox->mbxCommand,
2329 lpfc_sli_config_mbox_subsys_get(phba, pmb),
2330 lpfc_sli_config_mbox_opcode_get(phba, pmb),
2331 pmb->mbox_cmpl,
2332 *((uint32_t *) pmbox),
2333 pmbox->un.varWords[0],
2334 pmbox->un.varWords[1],
2335 pmbox->un.varWords[2],
2336 pmbox->un.varWords[3],
2337 pmbox->un.varWords[4],
2338 pmbox->un.varWords[5],
2339 pmbox->un.varWords[6],
2340 pmbox->un.varWords[7]);
2341
2342 if (pmb->mbox_cmpl)
2343 pmb->mbox_cmpl(phba,pmb);
2344 } while (1);
2345 return 0;
2346}
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360static struct lpfc_dmabuf *
2361lpfc_sli_get_buff(struct lpfc_hba *phba,
2362 struct lpfc_sli_ring *pring,
2363 uint32_t tag)
2364{
2365 struct hbq_dmabuf *hbq_entry;
2366
2367 if (tag & QUE_BUFTAG_BIT)
2368 return lpfc_sli_ring_taggedbuf_get(phba, pring, tag);
2369 hbq_entry = lpfc_sli_hbqbuf_find(phba, tag);
2370 if (!hbq_entry)
2371 return NULL;
2372 return &hbq_entry->dbuf;
2373}
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387static int
2388lpfc_complete_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
2389 struct lpfc_iocbq *saveq, uint32_t fch_r_ctl,
2390 uint32_t fch_type)
2391{
2392 int i;
2393
2394
2395 if (pring->prt[0].profile) {
2396 if (pring->prt[0].lpfc_sli_rcv_unsol_event)
2397 (pring->prt[0].lpfc_sli_rcv_unsol_event) (phba, pring,
2398 saveq);
2399 return 1;
2400 }
2401
2402
2403 for (i = 0; i < pring->num_mask; i++) {
2404 if ((pring->prt[i].rctl == fch_r_ctl) &&
2405 (pring->prt[i].type == fch_type)) {
2406 if (pring->prt[i].lpfc_sli_rcv_unsol_event)
2407 (pring->prt[i].lpfc_sli_rcv_unsol_event)
2408 (phba, pring, saveq);
2409 return 1;
2410 }
2411 }
2412 return 0;
2413}
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429static int
2430lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
2431 struct lpfc_iocbq *saveq)
2432{
2433 IOCB_t * irsp;
2434 WORD5 * w5p;
2435 uint32_t Rctl, Type;
2436 uint32_t match;
2437 struct lpfc_iocbq *iocbq;
2438 struct lpfc_dmabuf *dmzbuf;
2439
2440 match = 0;
2441 irsp = &(saveq->iocb);
2442
2443 if (irsp->ulpCommand == CMD_ASYNC_STATUS) {
2444 if (pring->lpfc_sli_rcv_async_status)
2445 pring->lpfc_sli_rcv_async_status(phba, pring, saveq);
2446 else
2447 lpfc_printf_log(phba,
2448 KERN_WARNING,
2449 LOG_SLI,
2450 "0316 Ring %d handler: unexpected "
2451 "ASYNC_STATUS iocb received evt_code "
2452 "0x%x\n",
2453 pring->ringno,
2454 irsp->un.asyncstat.evt_code);
2455 return 1;
2456 }
2457
2458 if ((irsp->ulpCommand == CMD_IOCB_RET_XRI64_CX) &&
2459 (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)) {
2460 if (irsp->ulpBdeCount > 0) {
2461 dmzbuf = lpfc_sli_get_buff(phba, pring,
2462 irsp->un.ulpWord[3]);
2463 lpfc_in_buf_free(phba, dmzbuf);
2464 }
2465
2466 if (irsp->ulpBdeCount > 1) {
2467 dmzbuf = lpfc_sli_get_buff(phba, pring,
2468 irsp->unsli3.sli3Words[3]);
2469 lpfc_in_buf_free(phba, dmzbuf);
2470 }
2471
2472 if (irsp->ulpBdeCount > 2) {
2473 dmzbuf = lpfc_sli_get_buff(phba, pring,
2474 irsp->unsli3.sli3Words[7]);
2475 lpfc_in_buf_free(phba, dmzbuf);
2476 }
2477
2478 return 1;
2479 }
2480
2481 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
2482 if (irsp->ulpBdeCount != 0) {
2483 saveq->context2 = lpfc_sli_get_buff(phba, pring,
2484 irsp->un.ulpWord[3]);
2485 if (!saveq->context2)
2486 lpfc_printf_log(phba,
2487 KERN_ERR,
2488 LOG_SLI,
2489 "0341 Ring %d Cannot find buffer for "
2490 "an unsolicited iocb. tag 0x%x\n",
2491 pring->ringno,
2492 irsp->un.ulpWord[3]);
2493 }
2494 if (irsp->ulpBdeCount == 2) {
2495 saveq->context3 = lpfc_sli_get_buff(phba, pring,
2496 irsp->unsli3.sli3Words[7]);
2497 if (!saveq->context3)
2498 lpfc_printf_log(phba,
2499 KERN_ERR,
2500 LOG_SLI,
2501 "0342 Ring %d Cannot find buffer for an"
2502 " unsolicited iocb. tag 0x%x\n",
2503 pring->ringno,
2504 irsp->unsli3.sli3Words[7]);
2505 }
2506 list_for_each_entry(iocbq, &saveq->list, list) {
2507 irsp = &(iocbq->iocb);
2508 if (irsp->ulpBdeCount != 0) {
2509 iocbq->context2 = lpfc_sli_get_buff(phba, pring,
2510 irsp->un.ulpWord[3]);
2511 if (!iocbq->context2)
2512 lpfc_printf_log(phba,
2513 KERN_ERR,
2514 LOG_SLI,
2515 "0343 Ring %d Cannot find "
2516 "buffer for an unsolicited iocb"
2517 ". tag 0x%x\n", pring->ringno,
2518 irsp->un.ulpWord[3]);
2519 }
2520 if (irsp->ulpBdeCount == 2) {
2521 iocbq->context3 = lpfc_sli_get_buff(phba, pring,
2522 irsp->unsli3.sli3Words[7]);
2523 if (!iocbq->context3)
2524 lpfc_printf_log(phba,
2525 KERN_ERR,
2526 LOG_SLI,
2527 "0344 Ring %d Cannot find "
2528 "buffer for an unsolicited "
2529 "iocb. tag 0x%x\n",
2530 pring->ringno,
2531 irsp->unsli3.sli3Words[7]);
2532 }
2533 }
2534 }
2535 if (irsp->ulpBdeCount != 0 &&
2536 (irsp->ulpCommand == CMD_IOCB_RCV_CONT64_CX ||
2537 irsp->ulpStatus == IOSTAT_INTERMED_RSP)) {
2538 int found = 0;
2539
2540
2541 list_for_each_entry(iocbq, &pring->iocb_continue_saveq, clist) {
2542 if (iocbq->iocb.unsli3.rcvsli3.ox_id ==
2543 saveq->iocb.unsli3.rcvsli3.ox_id) {
2544 list_add_tail(&saveq->list, &iocbq->list);
2545 found = 1;
2546 break;
2547 }
2548 }
2549 if (!found)
2550 list_add_tail(&saveq->clist,
2551 &pring->iocb_continue_saveq);
2552 if (saveq->iocb.ulpStatus != IOSTAT_INTERMED_RSP) {
2553 list_del_init(&iocbq->clist);
2554 saveq = iocbq;
2555 irsp = &(saveq->iocb);
2556 } else
2557 return 0;
2558 }
2559 if ((irsp->ulpCommand == CMD_RCV_ELS_REQ64_CX) ||
2560 (irsp->ulpCommand == CMD_RCV_ELS_REQ_CX) ||
2561 (irsp->ulpCommand == CMD_IOCB_RCV_ELS64_CX)) {
2562 Rctl = FC_RCTL_ELS_REQ;
2563 Type = FC_TYPE_ELS;
2564 } else {
2565 w5p = (WORD5 *)&(saveq->iocb.un.ulpWord[5]);
2566 Rctl = w5p->hcsw.Rctl;
2567 Type = w5p->hcsw.Type;
2568
2569
2570 if ((Rctl == 0) && (pring->ringno == LPFC_ELS_RING) &&
2571 (irsp->ulpCommand == CMD_RCV_SEQUENCE64_CX ||
2572 irsp->ulpCommand == CMD_IOCB_RCV_SEQ64_CX)) {
2573 Rctl = FC_RCTL_ELS_REQ;
2574 Type = FC_TYPE_ELS;
2575 w5p->hcsw.Rctl = Rctl;
2576 w5p->hcsw.Type = Type;
2577 }
2578 }
2579
2580 if (!lpfc_complete_unsol_iocb(phba, pring, saveq, Rctl, Type))
2581 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
2582 "0313 Ring %d handler: unexpected Rctl x%x "
2583 "Type x%x received\n",
2584 pring->ringno, Rctl, Type);
2585
2586 return 1;
2587}
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601static struct lpfc_iocbq *
2602lpfc_sli_iocbq_lookup(struct lpfc_hba *phba,
2603 struct lpfc_sli_ring *pring,
2604 struct lpfc_iocbq *prspiocb)
2605{
2606 struct lpfc_iocbq *cmd_iocb = NULL;
2607 uint16_t iotag;
2608
2609 iotag = prspiocb->iocb.ulpIoTag;
2610
2611 if (iotag != 0 && iotag <= phba->sli.last_iotag) {
2612 cmd_iocb = phba->sli.iocbq_lookup[iotag];
2613 list_del_init(&cmd_iocb->list);
2614 if (cmd_iocb->iocb_flag & LPFC_IO_ON_TXCMPLQ) {
2615 pring->txcmplq_cnt--;
2616 cmd_iocb->iocb_flag &= ~LPFC_IO_ON_TXCMPLQ;
2617 }
2618 return cmd_iocb;
2619 }
2620
2621 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
2622 "0317 iotag x%x is out off "
2623 "range: max iotag x%x wd0 x%x\n",
2624 iotag, phba->sli.last_iotag,
2625 *(((uint32_t *) &prspiocb->iocb) + 7));
2626 return NULL;
2627}
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641static struct lpfc_iocbq *
2642lpfc_sli_iocbq_lookup_by_tag(struct lpfc_hba *phba,
2643 struct lpfc_sli_ring *pring, uint16_t iotag)
2644{
2645 struct lpfc_iocbq *cmd_iocb;
2646
2647 if (iotag != 0 && iotag <= phba->sli.last_iotag) {
2648 cmd_iocb = phba->sli.iocbq_lookup[iotag];
2649 if (cmd_iocb->iocb_flag & LPFC_IO_ON_TXCMPLQ) {
2650
2651 list_del_init(&cmd_iocb->list);
2652 cmd_iocb->iocb_flag &= ~LPFC_IO_ON_TXCMPLQ;
2653 pring->txcmplq_cnt--;
2654 return cmd_iocb;
2655 }
2656 }
2657 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
2658 "0372 iotag x%x is out off range: max iotag (x%x)\n",
2659 iotag, phba->sli.last_iotag);
2660 return NULL;
2661}
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680static int
2681lpfc_sli_process_sol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
2682 struct lpfc_iocbq *saveq)
2683{
2684 struct lpfc_iocbq *cmdiocbp;
2685 int rc = 1;
2686 unsigned long iflag;
2687
2688
2689 spin_lock_irqsave(&phba->hbalock, iflag);
2690 cmdiocbp = lpfc_sli_iocbq_lookup(phba, pring, saveq);
2691 spin_unlock_irqrestore(&phba->hbalock, iflag);
2692
2693 if (cmdiocbp) {
2694 if (cmdiocbp->iocb_cmpl) {
2695
2696
2697
2698
2699 if (saveq->iocb.ulpStatus &&
2700 (pring->ringno == LPFC_ELS_RING) &&
2701 (cmdiocbp->iocb.ulpCommand ==
2702 CMD_ELS_REQUEST64_CR))
2703 lpfc_send_els_failure_event(phba,
2704 cmdiocbp, saveq);
2705
2706
2707
2708
2709
2710 if (pring->ringno == LPFC_ELS_RING) {
2711 if ((phba->sli_rev < LPFC_SLI_REV4) &&
2712 (cmdiocbp->iocb_flag &
2713 LPFC_DRIVER_ABORTED)) {
2714 spin_lock_irqsave(&phba->hbalock,
2715 iflag);
2716 cmdiocbp->iocb_flag &=
2717 ~LPFC_DRIVER_ABORTED;
2718 spin_unlock_irqrestore(&phba->hbalock,
2719 iflag);
2720 saveq->iocb.ulpStatus =
2721 IOSTAT_LOCAL_REJECT;
2722 saveq->iocb.un.ulpWord[4] =
2723 IOERR_SLI_ABORTED;
2724
2725
2726
2727
2728
2729 spin_lock_irqsave(&phba->hbalock,
2730 iflag);
2731 saveq->iocb_flag |= LPFC_DELAY_MEM_FREE;
2732 spin_unlock_irqrestore(&phba->hbalock,
2733 iflag);
2734 }
2735 if (phba->sli_rev == LPFC_SLI_REV4) {
2736 if (saveq->iocb_flag &
2737 LPFC_EXCHANGE_BUSY) {
2738
2739
2740
2741
2742
2743
2744 spin_lock_irqsave(
2745 &phba->hbalock, iflag);
2746 cmdiocbp->iocb_flag |=
2747 LPFC_EXCHANGE_BUSY;
2748 spin_unlock_irqrestore(
2749 &phba->hbalock, iflag);
2750 }
2751 if (cmdiocbp->iocb_flag &
2752 LPFC_DRIVER_ABORTED) {
2753
2754
2755
2756
2757
2758 spin_lock_irqsave(
2759 &phba->hbalock, iflag);
2760 cmdiocbp->iocb_flag &=
2761 ~LPFC_DRIVER_ABORTED;
2762 spin_unlock_irqrestore(
2763 &phba->hbalock, iflag);
2764 cmdiocbp->iocb.ulpStatus =
2765 IOSTAT_LOCAL_REJECT;
2766 cmdiocbp->iocb.un.ulpWord[4] =
2767 IOERR_ABORT_REQUESTED;
2768
2769
2770
2771
2772
2773
2774 saveq->iocb.ulpStatus =
2775 IOSTAT_LOCAL_REJECT;
2776 saveq->iocb.un.ulpWord[4] =
2777 IOERR_SLI_ABORTED;
2778 spin_lock_irqsave(
2779 &phba->hbalock, iflag);
2780 saveq->iocb_flag |=
2781 LPFC_DELAY_MEM_FREE;
2782 spin_unlock_irqrestore(
2783 &phba->hbalock, iflag);
2784 }
2785 }
2786 }
2787 (cmdiocbp->iocb_cmpl) (phba, cmdiocbp, saveq);
2788 } else
2789 lpfc_sli_release_iocbq(phba, cmdiocbp);
2790 } else {
2791
2792
2793
2794
2795
2796 if (pring->ringno != LPFC_ELS_RING) {
2797
2798
2799
2800
2801 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
2802 "0322 Ring %d handler: "
2803 "unexpected completion IoTag x%x "
2804 "Data: x%x x%x x%x x%x\n",
2805 pring->ringno,
2806 saveq->iocb.ulpIoTag,
2807 saveq->iocb.ulpStatus,
2808 saveq->iocb.un.ulpWord[4],
2809 saveq->iocb.ulpCommand,
2810 saveq->iocb.ulpContext);
2811 }
2812 }
2813
2814 return rc;
2815}
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827static void
2828lpfc_sli_rsp_pointers_error(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
2829{
2830 struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno];
2831
2832
2833
2834
2835 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
2836 "0312 Ring %d handler: portRspPut %d "
2837 "is bigger than rsp ring %d\n",
2838 pring->ringno, le32_to_cpu(pgp->rspPutInx),
2839 pring->sli.sli3.numRiocb);
2840
2841 phba->link_state = LPFC_HBA_ERROR;
2842
2843
2844
2845
2846
2847 phba->work_ha |= HA_ERATT;
2848 phba->work_hs = HS_FFER3;
2849
2850 lpfc_worker_wake_up(phba);
2851
2852 return;
2853}
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865void lpfc_poll_eratt(unsigned long ptr)
2866{
2867 struct lpfc_hba *phba;
2868 uint32_t eratt = 0, rem;
2869 uint64_t sli_intr, cnt;
2870
2871 phba = (struct lpfc_hba *)ptr;
2872
2873
2874 sli_intr = phba->sli.slistat.sli_intr;
2875
2876 if (phba->sli.slistat.sli_prev_intr > sli_intr)
2877 cnt = (((uint64_t)(-1) - phba->sli.slistat.sli_prev_intr) +
2878 sli_intr);
2879 else
2880 cnt = (sli_intr - phba->sli.slistat.sli_prev_intr);
2881
2882
2883 rem = do_div(cnt, LPFC_ERATT_POLL_INTERVAL);
2884 phba->sli.slistat.sli_ips = cnt;
2885
2886 phba->sli.slistat.sli_prev_intr = sli_intr;
2887
2888
2889 eratt = lpfc_sli_check_eratt(phba);
2890
2891 if (eratt)
2892
2893 lpfc_worker_wake_up(phba);
2894 else
2895
2896 mod_timer(&phba->eratt_poll, jiffies +
2897 HZ * LPFC_ERATT_POLL_INTERVAL);
2898 return;
2899}
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919int
2920lpfc_sli_handle_fast_ring_event(struct lpfc_hba *phba,
2921 struct lpfc_sli_ring *pring, uint32_t mask)
2922{
2923 struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno];
2924 IOCB_t *irsp = NULL;
2925 IOCB_t *entry = NULL;
2926 struct lpfc_iocbq *cmdiocbq = NULL;
2927 struct lpfc_iocbq rspiocbq;
2928 uint32_t status;
2929 uint32_t portRspPut, portRspMax;
2930 int rc = 1;
2931 lpfc_iocb_type type;
2932 unsigned long iflag;
2933 uint32_t rsp_cmpl = 0;
2934
2935 spin_lock_irqsave(&phba->hbalock, iflag);
2936 pring->stats.iocb_event++;
2937
2938
2939
2940
2941
2942 portRspMax = pring->sli.sli3.numRiocb;
2943 portRspPut = le32_to_cpu(pgp->rspPutInx);
2944 if (unlikely(portRspPut >= portRspMax)) {
2945 lpfc_sli_rsp_pointers_error(phba, pring);
2946 spin_unlock_irqrestore(&phba->hbalock, iflag);
2947 return 1;
2948 }
2949 if (phba->fcp_ring_in_use) {
2950 spin_unlock_irqrestore(&phba->hbalock, iflag);
2951 return 1;
2952 } else
2953 phba->fcp_ring_in_use = 1;
2954
2955 rmb();
2956 while (pring->sli.sli3.rspidx != portRspPut) {
2957
2958
2959
2960
2961
2962 entry = lpfc_resp_iocb(phba, pring);
2963 phba->last_completion_time = jiffies;
2964
2965 if (++pring->sli.sli3.rspidx >= portRspMax)
2966 pring->sli.sli3.rspidx = 0;
2967
2968 lpfc_sli_pcimem_bcopy((uint32_t *) entry,
2969 (uint32_t *) &rspiocbq.iocb,
2970 phba->iocb_rsp_size);
2971 INIT_LIST_HEAD(&(rspiocbq.list));
2972 irsp = &rspiocbq.iocb;
2973
2974 type = lpfc_sli_iocb_cmd_type(irsp->ulpCommand & CMD_IOCB_MASK);
2975 pring->stats.iocb_rsp++;
2976 rsp_cmpl++;
2977
2978 if (unlikely(irsp->ulpStatus)) {
2979
2980
2981
2982
2983 if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
2984 ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
2985 IOERR_NO_RESOURCES)) {
2986 spin_unlock_irqrestore(&phba->hbalock, iflag);
2987 phba->lpfc_rampdown_queue_depth(phba);
2988 spin_lock_irqsave(&phba->hbalock, iflag);
2989 }
2990
2991
2992 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
2993 "0336 Rsp Ring %d error: IOCB Data: "
2994 "x%x x%x x%x x%x x%x x%x x%x x%x\n",
2995 pring->ringno,
2996 irsp->un.ulpWord[0],
2997 irsp->un.ulpWord[1],
2998 irsp->un.ulpWord[2],
2999 irsp->un.ulpWord[3],
3000 irsp->un.ulpWord[4],
3001 irsp->un.ulpWord[5],
3002 *(uint32_t *)&irsp->un1,
3003 *((uint32_t *)&irsp->un1 + 1));
3004 }
3005
3006 switch (type) {
3007 case LPFC_ABORT_IOCB:
3008 case LPFC_SOL_IOCB:
3009
3010
3011
3012
3013 if (unlikely(irsp->ulpCommand == CMD_XRI_ABORTED_CX)) {
3014 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
3015 "0333 IOCB cmd 0x%x"
3016 " processed. Skipping"
3017 " completion\n",
3018 irsp->ulpCommand);
3019 break;
3020 }
3021
3022 cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring,
3023 &rspiocbq);
3024 if (unlikely(!cmdiocbq))
3025 break;
3026 if (cmdiocbq->iocb_flag & LPFC_DRIVER_ABORTED)
3027 cmdiocbq->iocb_flag &= ~LPFC_DRIVER_ABORTED;
3028 if (cmdiocbq->iocb_cmpl) {
3029 spin_unlock_irqrestore(&phba->hbalock, iflag);
3030 (cmdiocbq->iocb_cmpl)(phba, cmdiocbq,
3031 &rspiocbq);
3032 spin_lock_irqsave(&phba->hbalock, iflag);
3033 }
3034 break;
3035 case LPFC_UNSOL_IOCB:
3036 spin_unlock_irqrestore(&phba->hbalock, iflag);
3037 lpfc_sli_process_unsol_iocb(phba, pring, &rspiocbq);
3038 spin_lock_irqsave(&phba->hbalock, iflag);
3039 break;
3040 default:
3041 if (irsp->ulpCommand == CMD_ADAPTER_MSG) {
3042 char adaptermsg[LPFC_MAX_ADPTMSG];
3043 memset(adaptermsg, 0, LPFC_MAX_ADPTMSG);
3044 memcpy(&adaptermsg[0], (uint8_t *) irsp,
3045 MAX_MSG_DATA);
3046 dev_warn(&((phba->pcidev)->dev),
3047 "lpfc%d: %s\n",
3048 phba->brd_no, adaptermsg);
3049 } else {
3050
3051 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
3052 "0334 Unknown IOCB command "
3053 "Data: x%x, x%x x%x x%x x%x\n",
3054 type, irsp->ulpCommand,
3055 irsp->ulpStatus,
3056 irsp->ulpIoTag,
3057 irsp->ulpContext);
3058 }
3059 break;
3060 }
3061
3062
3063
3064
3065
3066
3067
3068 writel(pring->sli.sli3.rspidx,
3069 &phba->host_gp[pring->ringno].rspGetInx);
3070
3071 if (pring->sli.sli3.rspidx == portRspPut)
3072 portRspPut = le32_to_cpu(pgp->rspPutInx);
3073 }
3074
3075 if ((rsp_cmpl > 0) && (mask & HA_R0RE_REQ)) {
3076 pring->stats.iocb_rsp_full++;
3077 status = ((CA_R0ATT | CA_R0RE_RSP) << (pring->ringno * 4));
3078 writel(status, phba->CAregaddr);
3079 readl(phba->CAregaddr);
3080 }
3081 if ((mask & HA_R0CE_RSP) && (pring->flag & LPFC_CALL_RING_AVAILABLE)) {
3082 pring->flag &= ~LPFC_CALL_RING_AVAILABLE;
3083 pring->stats.iocb_cmd_empty++;
3084
3085
3086 pring->sli.sli3.local_getidx = le32_to_cpu(pgp->cmdGetInx);
3087 lpfc_sli_resume_iocb(phba, pring);
3088
3089 if ((pring->lpfc_sli_cmd_available))
3090 (pring->lpfc_sli_cmd_available) (phba, pring);
3091
3092 }
3093
3094 phba->fcp_ring_in_use = 0;
3095 spin_unlock_irqrestore(&phba->hbalock, iflag);
3096 return rc;
3097}
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117static struct lpfc_iocbq *
3118lpfc_sli_sp_handle_rspiocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
3119 struct lpfc_iocbq *rspiocbp)
3120{
3121 struct lpfc_iocbq *saveq;
3122 struct lpfc_iocbq *cmdiocbp;
3123 struct lpfc_iocbq *next_iocb;
3124 IOCB_t *irsp = NULL;
3125 uint32_t free_saveq;
3126 uint8_t iocb_cmd_type;
3127 lpfc_iocb_type type;
3128 unsigned long iflag;
3129 int rc;
3130
3131 spin_lock_irqsave(&phba->hbalock, iflag);
3132
3133 list_add_tail(&rspiocbp->list, &(pring->iocb_continueq));
3134 pring->iocb_continueq_cnt++;
3135
3136
3137 irsp = &rspiocbp->iocb;
3138 if (irsp->ulpLe) {
3139
3140
3141
3142
3143 free_saveq = 1;
3144 saveq = list_get_first(&pring->iocb_continueq,
3145 struct lpfc_iocbq, list);
3146 irsp = &(saveq->iocb);
3147 list_del_init(&pring->iocb_continueq);
3148 pring->iocb_continueq_cnt = 0;
3149
3150 pring->stats.iocb_rsp++;
3151
3152
3153
3154
3155
3156 if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
3157 ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
3158 IOERR_NO_RESOURCES)) {
3159 spin_unlock_irqrestore(&phba->hbalock, iflag);
3160 phba->lpfc_rampdown_queue_depth(phba);
3161 spin_lock_irqsave(&phba->hbalock, iflag);
3162 }
3163
3164 if (irsp->ulpStatus) {
3165
3166 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
3167 "0328 Rsp Ring %d error: "
3168 "IOCB Data: "
3169 "x%x x%x x%x x%x "
3170 "x%x x%x x%x x%x "
3171 "x%x x%x x%x x%x "
3172 "x%x x%x x%x x%x\n",
3173 pring->ringno,
3174 irsp->un.ulpWord[0],
3175 irsp->un.ulpWord[1],
3176 irsp->un.ulpWord[2],
3177 irsp->un.ulpWord[3],
3178 irsp->un.ulpWord[4],
3179 irsp->un.ulpWord[5],
3180 *(((uint32_t *) irsp) + 6),
3181 *(((uint32_t *) irsp) + 7),
3182 *(((uint32_t *) irsp) + 8),
3183 *(((uint32_t *) irsp) + 9),
3184 *(((uint32_t *) irsp) + 10),
3185 *(((uint32_t *) irsp) + 11),
3186 *(((uint32_t *) irsp) + 12),
3187 *(((uint32_t *) irsp) + 13),
3188 *(((uint32_t *) irsp) + 14),
3189 *(((uint32_t *) irsp) + 15));
3190 }
3191
3192
3193
3194
3195
3196
3197
3198 iocb_cmd_type = irsp->ulpCommand & CMD_IOCB_MASK;
3199 type = lpfc_sli_iocb_cmd_type(iocb_cmd_type);
3200 switch (type) {
3201 case LPFC_SOL_IOCB:
3202 spin_unlock_irqrestore(&phba->hbalock, iflag);
3203 rc = lpfc_sli_process_sol_iocb(phba, pring, saveq);
3204 spin_lock_irqsave(&phba->hbalock, iflag);
3205 break;
3206
3207 case LPFC_UNSOL_IOCB:
3208 spin_unlock_irqrestore(&phba->hbalock, iflag);
3209 rc = lpfc_sli_process_unsol_iocb(phba, pring, saveq);
3210 spin_lock_irqsave(&phba->hbalock, iflag);
3211 if (!rc)
3212 free_saveq = 0;
3213 break;
3214
3215 case LPFC_ABORT_IOCB:
3216 cmdiocbp = NULL;
3217 if (irsp->ulpCommand != CMD_XRI_ABORTED_CX)
3218 cmdiocbp = lpfc_sli_iocbq_lookup(phba, pring,
3219 saveq);
3220 if (cmdiocbp) {
3221
3222 if (cmdiocbp->iocb_cmpl) {
3223 spin_unlock_irqrestore(&phba->hbalock,
3224 iflag);
3225 (cmdiocbp->iocb_cmpl)(phba, cmdiocbp,
3226 saveq);
3227 spin_lock_irqsave(&phba->hbalock,
3228 iflag);
3229 } else
3230 __lpfc_sli_release_iocbq(phba,
3231 cmdiocbp);
3232 }
3233 break;
3234
3235 case LPFC_UNKNOWN_IOCB:
3236 if (irsp->ulpCommand == CMD_ADAPTER_MSG) {
3237 char adaptermsg[LPFC_MAX_ADPTMSG];
3238 memset(adaptermsg, 0, LPFC_MAX_ADPTMSG);
3239 memcpy(&adaptermsg[0], (uint8_t *)irsp,
3240 MAX_MSG_DATA);
3241 dev_warn(&((phba->pcidev)->dev),
3242 "lpfc%d: %s\n",
3243 phba->brd_no, adaptermsg);
3244 } else {
3245
3246 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
3247 "0335 Unknown IOCB "
3248 "command Data: x%x "
3249 "x%x x%x x%x\n",
3250 irsp->ulpCommand,
3251 irsp->ulpStatus,
3252 irsp->ulpIoTag,
3253 irsp->ulpContext);
3254 }
3255 break;
3256 }
3257
3258 if (free_saveq) {
3259 list_for_each_entry_safe(rspiocbp, next_iocb,
3260 &saveq->list, list) {
3261 list_del(&rspiocbp->list);
3262 __lpfc_sli_release_iocbq(phba, rspiocbp);
3263 }
3264 __lpfc_sli_release_iocbq(phba, saveq);
3265 }
3266 rspiocbp = NULL;
3267 }
3268 spin_unlock_irqrestore(&phba->hbalock, iflag);
3269 return rspiocbp;
3270}
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281void
3282lpfc_sli_handle_slow_ring_event(struct lpfc_hba *phba,
3283 struct lpfc_sli_ring *pring, uint32_t mask)
3284{
3285 phba->lpfc_sli_handle_slow_ring_event(phba, pring, mask);
3286}
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299static void
3300lpfc_sli_handle_slow_ring_event_s3(struct lpfc_hba *phba,
3301 struct lpfc_sli_ring *pring, uint32_t mask)
3302{
3303 struct lpfc_pgp *pgp;
3304 IOCB_t *entry;
3305 IOCB_t *irsp = NULL;
3306 struct lpfc_iocbq *rspiocbp = NULL;
3307 uint32_t portRspPut, portRspMax;
3308 unsigned long iflag;
3309 uint32_t status;
3310
3311 pgp = &phba->port_gp[pring->ringno];
3312 spin_lock_irqsave(&phba->hbalock, iflag);
3313 pring->stats.iocb_event++;
3314
3315
3316
3317
3318
3319 portRspMax = pring->sli.sli3.numRiocb;
3320 portRspPut = le32_to_cpu(pgp->rspPutInx);
3321 if (portRspPut >= portRspMax) {
3322
3323
3324
3325
3326 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
3327 "0303 Ring %d handler: portRspPut %d "
3328 "is bigger than rsp ring %d\n",
3329 pring->ringno, portRspPut, portRspMax);
3330
3331 phba->link_state = LPFC_HBA_ERROR;
3332 spin_unlock_irqrestore(&phba->hbalock, iflag);
3333
3334 phba->work_hs = HS_FFER3;
3335 lpfc_handle_eratt(phba);
3336
3337 return;
3338 }
3339
3340 rmb();
3341 while (pring->sli.sli3.rspidx != portRspPut) {
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355 entry = lpfc_resp_iocb(phba, pring);
3356
3357 phba->last_completion_time = jiffies;
3358 rspiocbp = __lpfc_sli_get_iocbq(phba);
3359 if (rspiocbp == NULL) {
3360 printk(KERN_ERR "%s: out of buffers! Failing "
3361 "completion.\n", __func__);
3362 break;
3363 }
3364
3365 lpfc_sli_pcimem_bcopy(entry, &rspiocbp->iocb,
3366 phba->iocb_rsp_size);
3367 irsp = &rspiocbp->iocb;
3368
3369 if (++pring->sli.sli3.rspidx >= portRspMax)
3370 pring->sli.sli3.rspidx = 0;
3371
3372 if (pring->ringno == LPFC_ELS_RING) {
3373 lpfc_debugfs_slow_ring_trc(phba,
3374 "IOCB rsp ring: wd4:x%08x wd6:x%08x wd7:x%08x",
3375 *(((uint32_t *) irsp) + 4),
3376 *(((uint32_t *) irsp) + 6),
3377 *(((uint32_t *) irsp) + 7));
3378 }
3379
3380 writel(pring->sli.sli3.rspidx,
3381 &phba->host_gp[pring->ringno].rspGetInx);
3382
3383 spin_unlock_irqrestore(&phba->hbalock, iflag);
3384
3385 rspiocbp = lpfc_sli_sp_handle_rspiocb(phba, pring, rspiocbp);
3386 spin_lock_irqsave(&phba->hbalock, iflag);
3387
3388
3389
3390
3391
3392
3393 if (pring->sli.sli3.rspidx == portRspPut) {
3394 portRspPut = le32_to_cpu(pgp->rspPutInx);
3395 }
3396 }
3397
3398 if ((rspiocbp != NULL) && (mask & HA_R0RE_REQ)) {
3399
3400 pring->stats.iocb_rsp_full++;
3401
3402 status = ((CA_R0ATT | CA_R0RE_RSP) << (pring->ringno * 4));
3403 writel(status, phba->CAregaddr);
3404 readl(phba->CAregaddr);
3405 }
3406 if ((mask & HA_R0CE_RSP) && (pring->flag & LPFC_CALL_RING_AVAILABLE)) {
3407 pring->flag &= ~LPFC_CALL_RING_AVAILABLE;
3408 pring->stats.iocb_cmd_empty++;
3409
3410
3411 pring->sli.sli3.local_getidx = le32_to_cpu(pgp->cmdGetInx);
3412 lpfc_sli_resume_iocb(phba, pring);
3413
3414 if ((pring->lpfc_sli_cmd_available))
3415 (pring->lpfc_sli_cmd_available) (phba, pring);
3416
3417 }
3418
3419 spin_unlock_irqrestore(&phba->hbalock, iflag);
3420 return;
3421}
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435static void
3436lpfc_sli_handle_slow_ring_event_s4(struct lpfc_hba *phba,
3437 struct lpfc_sli_ring *pring, uint32_t mask)
3438{
3439 struct lpfc_iocbq *irspiocbq;
3440 struct hbq_dmabuf *dmabuf;
3441 struct lpfc_cq_event *cq_event;
3442 unsigned long iflag;
3443
3444 spin_lock_irqsave(&phba->hbalock, iflag);
3445 phba->hba_flag &= ~HBA_SP_QUEUE_EVT;
3446 spin_unlock_irqrestore(&phba->hbalock, iflag);
3447 while (!list_empty(&phba->sli4_hba.sp_queue_event)) {
3448
3449 spin_lock_irqsave(&phba->hbalock, iflag);
3450 list_remove_head(&phba->sli4_hba.sp_queue_event,
3451 cq_event, struct lpfc_cq_event, list);
3452 spin_unlock_irqrestore(&phba->hbalock, iflag);
3453
3454 switch (bf_get(lpfc_wcqe_c_code, &cq_event->cqe.wcqe_cmpl)) {
3455 case CQE_CODE_COMPL_WQE:
3456 irspiocbq = container_of(cq_event, struct lpfc_iocbq,
3457 cq_event);
3458
3459 irspiocbq = lpfc_sli4_els_wcqe_to_rspiocbq(phba,
3460 irspiocbq);
3461 if (irspiocbq)
3462 lpfc_sli_sp_handle_rspiocb(phba, pring,
3463 irspiocbq);
3464 break;
3465 case CQE_CODE_RECEIVE:
3466 case CQE_CODE_RECEIVE_V1:
3467 dmabuf = container_of(cq_event, struct hbq_dmabuf,
3468 cq_event);
3469 lpfc_sli4_handle_received_buffer(phba, dmabuf);
3470 break;
3471 default:
3472 break;
3473 }
3474 }
3475}
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487void
3488lpfc_sli_abort_iocb_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
3489{
3490 LIST_HEAD(completions);
3491 struct lpfc_iocbq *iocb, *next_iocb;
3492
3493 if (pring->ringno == LPFC_ELS_RING) {
3494 lpfc_fabric_abort_hba(phba);
3495 }
3496
3497
3498
3499
3500 spin_lock_irq(&phba->hbalock);
3501 list_splice_init(&pring->txq, &completions);
3502 pring->txq_cnt = 0;
3503
3504
3505 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list)
3506 lpfc_sli_issue_abort_iotag(phba, pring, iocb);
3507
3508 spin_unlock_irq(&phba->hbalock);
3509
3510
3511 lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
3512 IOERR_SLI_ABORTED);
3513}
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525void
3526lpfc_sli_flush_fcp_rings(struct lpfc_hba *phba)
3527{
3528 LIST_HEAD(txq);
3529 LIST_HEAD(txcmplq);
3530 struct lpfc_sli *psli = &phba->sli;
3531 struct lpfc_sli_ring *pring;
3532
3533
3534 pring = &psli->ring[psli->fcp_ring];
3535
3536 spin_lock_irq(&phba->hbalock);
3537
3538 list_splice_init(&pring->txq, &txq);
3539 pring->txq_cnt = 0;
3540
3541
3542 list_splice_init(&pring->txcmplq, &txcmplq);
3543 pring->txcmplq_cnt = 0;
3544
3545
3546 phba->hba_flag |= HBA_FCP_IOQ_FLUSH;
3547 spin_unlock_irq(&phba->hbalock);
3548
3549
3550 lpfc_sli_cancel_iocbs(phba, &txq, IOSTAT_LOCAL_REJECT,
3551 IOERR_SLI_DOWN);
3552
3553
3554 lpfc_sli_cancel_iocbs(phba, &txcmplq, IOSTAT_LOCAL_REJECT,
3555 IOERR_SLI_DOWN);
3556}
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571static int
3572lpfc_sli_brdready_s3(struct lpfc_hba *phba, uint32_t mask)
3573{
3574 uint32_t status;
3575 int i = 0;
3576 int retval = 0;
3577
3578
3579 if (lpfc_readl(phba->HSregaddr, &status))
3580 return 1;
3581
3582
3583
3584
3585
3586
3587
3588 while (((status & mask) != mask) &&
3589 !(status & HS_FFERM) &&
3590 i++ < 20) {
3591
3592 if (i <= 5)
3593 msleep(10);
3594 else if (i <= 10)
3595 msleep(500);
3596 else
3597 msleep(2500);
3598
3599 if (i == 15) {
3600
3601 phba->pport->port_state = LPFC_VPORT_UNKNOWN;
3602 lpfc_sli_brdrestart(phba);
3603 }
3604
3605 if (lpfc_readl(phba->HSregaddr, &status)) {
3606 retval = 1;
3607 break;
3608 }
3609 }
3610
3611
3612 if ((status & HS_FFERM) || (i >= 20)) {
3613 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3614 "2751 Adapter failed to restart, "
3615 "status reg x%x, FW Data: A8 x%x AC x%x\n",
3616 status,
3617 readl(phba->MBslimaddr + 0xa8),
3618 readl(phba->MBslimaddr + 0xac));
3619 phba->link_state = LPFC_HBA_ERROR;
3620 retval = 1;
3621 }
3622
3623 return retval;
3624}
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637static int
3638lpfc_sli_brdready_s4(struct lpfc_hba *phba, uint32_t mask)
3639{
3640 uint32_t status;
3641 int retval = 0;
3642
3643
3644 status = lpfc_sli4_post_status_check(phba);
3645
3646 if (status) {
3647 phba->pport->port_state = LPFC_VPORT_UNKNOWN;
3648 lpfc_sli_brdrestart(phba);
3649 status = lpfc_sli4_post_status_check(phba);
3650 }
3651
3652
3653 if (status) {
3654 phba->link_state = LPFC_HBA_ERROR;
3655 retval = 1;
3656 } else
3657 phba->sli4_hba.intr_enable = 0;
3658
3659 return retval;
3660}
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670int
3671lpfc_sli_brdready(struct lpfc_hba *phba, uint32_t mask)
3672{
3673 return phba->lpfc_sli_brdready(phba, mask);
3674}
3675
3676#define BARRIER_TEST_PATTERN (0xdeadbeef)
3677
3678
3679
3680
3681
3682
3683
3684
3685void lpfc_reset_barrier(struct lpfc_hba *phba)
3686{
3687 uint32_t __iomem *resp_buf;
3688 uint32_t __iomem *mbox_buf;
3689 volatile uint32_t mbox;
3690 uint32_t hc_copy, ha_copy, resp_data;
3691 int i;
3692 uint8_t hdrtype;
3693
3694 pci_read_config_byte(phba->pcidev, PCI_HEADER_TYPE, &hdrtype);
3695 if (hdrtype != 0x80 ||
3696 (FC_JEDEC_ID(phba->vpd.rev.biuRev) != HELIOS_JEDEC_ID &&
3697 FC_JEDEC_ID(phba->vpd.rev.biuRev) != THOR_JEDEC_ID))
3698 return;
3699
3700
3701
3702
3703
3704 resp_buf = phba->MBslimaddr;
3705
3706
3707 if (lpfc_readl(phba->HCregaddr, &hc_copy))
3708 return;
3709 writel((hc_copy & ~HC_ERINT_ENA), phba->HCregaddr);
3710 readl(phba->HCregaddr);
3711 phba->link_flag |= LS_IGNORE_ERATT;
3712
3713 if (lpfc_readl(phba->HAregaddr, &ha_copy))
3714 return;
3715 if (ha_copy & HA_ERATT) {
3716
3717 writel(HA_ERATT, phba->HAregaddr);
3718 phba->pport->stopped = 1;
3719 }
3720
3721 mbox = 0;
3722 ((MAILBOX_t *)&mbox)->mbxCommand = MBX_KILL_BOARD;
3723 ((MAILBOX_t *)&mbox)->mbxOwner = OWN_CHIP;
3724
3725 writel(BARRIER_TEST_PATTERN, (resp_buf + 1));
3726 mbox_buf = phba->MBslimaddr;
3727 writel(mbox, mbox_buf);
3728
3729 for (i = 0; i < 50; i++) {
3730 if (lpfc_readl((resp_buf + 1), &resp_data))
3731 return;
3732 if (resp_data != ~(BARRIER_TEST_PATTERN))
3733 mdelay(1);
3734 else
3735 break;
3736 }
3737 resp_data = 0;
3738 if (lpfc_readl((resp_buf + 1), &resp_data))
3739 return;
3740 if (resp_data != ~(BARRIER_TEST_PATTERN)) {
3741 if (phba->sli.sli_flag & LPFC_SLI_ACTIVE ||
3742 phba->pport->stopped)
3743 goto restore_hc;
3744 else
3745 goto clear_errat;
3746 }
3747
3748 ((MAILBOX_t *)&mbox)->mbxOwner = OWN_HOST;
3749 resp_data = 0;
3750 for (i = 0; i < 500; i++) {
3751 if (lpfc_readl(resp_buf, &resp_data))
3752 return;
3753 if (resp_data != mbox)
3754 mdelay(1);
3755 else
3756 break;
3757 }
3758
3759clear_errat:
3760
3761 while (++i < 500) {
3762 if (lpfc_readl(phba->HAregaddr, &ha_copy))
3763 return;
3764 if (!(ha_copy & HA_ERATT))
3765 mdelay(1);
3766 else
3767 break;
3768 }
3769
3770 if (readl(phba->HAregaddr) & HA_ERATT) {
3771 writel(HA_ERATT, phba->HAregaddr);
3772 phba->pport->stopped = 1;
3773 }
3774
3775restore_hc:
3776 phba->link_flag &= ~LS_IGNORE_ERATT;
3777 writel(hc_copy, phba->HCregaddr);
3778 readl(phba->HCregaddr);
3779}
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792int
3793lpfc_sli_brdkill(struct lpfc_hba *phba)
3794{
3795 struct lpfc_sli *psli;
3796 LPFC_MBOXQ_t *pmb;
3797 uint32_t status;
3798 uint32_t ha_copy;
3799 int retval;
3800 int i = 0;
3801
3802 psli = &phba->sli;
3803
3804
3805 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
3806 "0329 Kill HBA Data: x%x x%x\n",
3807 phba->pport->port_state, psli->sli_flag);
3808
3809 pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
3810 if (!pmb)
3811 return 1;
3812
3813
3814 spin_lock_irq(&phba->hbalock);
3815 if (lpfc_readl(phba->HCregaddr, &status)) {
3816 spin_unlock_irq(&phba->hbalock);
3817 mempool_free(pmb, phba->mbox_mem_pool);
3818 return 1;
3819 }
3820 status &= ~HC_ERINT_ENA;
3821 writel(status, phba->HCregaddr);
3822 readl(phba->HCregaddr);
3823 phba->link_flag |= LS_IGNORE_ERATT;
3824 spin_unlock_irq(&phba->hbalock);
3825
3826 lpfc_kill_board(phba, pmb);
3827 pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
3828 retval = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
3829
3830 if (retval != MBX_SUCCESS) {
3831 if (retval != MBX_BUSY)
3832 mempool_free(pmb, phba->mbox_mem_pool);
3833 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
3834 "2752 KILL_BOARD command failed retval %d\n",
3835 retval);
3836 spin_lock_irq(&phba->hbalock);
3837 phba->link_flag &= ~LS_IGNORE_ERATT;
3838 spin_unlock_irq(&phba->hbalock);
3839 return 1;
3840 }
3841
3842 spin_lock_irq(&phba->hbalock);
3843 psli->sli_flag &= ~LPFC_SLI_ACTIVE;
3844 spin_unlock_irq(&phba->hbalock);
3845
3846 mempool_free(pmb, phba->mbox_mem_pool);
3847
3848
3849
3850
3851
3852
3853 if (lpfc_readl(phba->HAregaddr, &ha_copy))
3854 return 1;
3855 while ((i++ < 30) && !(ha_copy & HA_ERATT)) {
3856 mdelay(100);
3857 if (lpfc_readl(phba->HAregaddr, &ha_copy))
3858 return 1;
3859 }
3860
3861 del_timer_sync(&psli->mbox_tmo);
3862 if (ha_copy & HA_ERATT) {
3863 writel(HA_ERATT, phba->HAregaddr);
3864 phba->pport->stopped = 1;
3865 }
3866 spin_lock_irq(&phba->hbalock);
3867 psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
3868 psli->mbox_active = NULL;
3869 phba->link_flag &= ~LS_IGNORE_ERATT;
3870 spin_unlock_irq(&phba->hbalock);
3871
3872 lpfc_hba_down_post(phba);
3873 phba->link_state = LPFC_HBA_ERROR;
3874
3875 return ha_copy & HA_ERATT ? 0 : 1;
3876}
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889int
3890lpfc_sli_brdreset(struct lpfc_hba *phba)
3891{
3892 struct lpfc_sli *psli;
3893 struct lpfc_sli_ring *pring;
3894 uint16_t cfg_value;
3895 int i;
3896
3897 psli = &phba->sli;
3898
3899
3900 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
3901 "0325 Reset HBA Data: x%x x%x\n",
3902 phba->pport->port_state, psli->sli_flag);
3903
3904
3905 phba->fc_eventTag = 0;
3906 phba->link_events = 0;
3907 phba->pport->fc_myDID = 0;
3908 phba->pport->fc_prevDID = 0;
3909
3910
3911 pci_read_config_word(phba->pcidev, PCI_COMMAND, &cfg_value);
3912 pci_write_config_word(phba->pcidev, PCI_COMMAND,
3913 (cfg_value &
3914 ~(PCI_COMMAND_PARITY | PCI_COMMAND_SERR)));
3915
3916 psli->sli_flag &= ~(LPFC_SLI_ACTIVE | LPFC_PROCESS_LA);
3917
3918
3919 writel(HC_INITFF, phba->HCregaddr);
3920 mdelay(1);
3921 readl(phba->HCregaddr);
3922 writel(0, phba->HCregaddr);
3923 readl(phba->HCregaddr);
3924
3925
3926 pci_write_config_word(phba->pcidev, PCI_COMMAND, cfg_value);
3927
3928
3929 for (i = 0; i < psli->num_rings; i++) {
3930 pring = &psli->ring[i];
3931 pring->flag = 0;
3932 pring->sli.sli3.rspidx = 0;
3933 pring->sli.sli3.next_cmdidx = 0;
3934 pring->sli.sli3.local_getidx = 0;
3935 pring->sli.sli3.cmdidx = 0;
3936 pring->missbufcnt = 0;
3937 }
3938
3939 phba->link_state = LPFC_WARM_START;
3940 return 0;
3941}
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953int
3954lpfc_sli4_brdreset(struct lpfc_hba *phba)
3955{
3956 struct lpfc_sli *psli = &phba->sli;
3957 uint16_t cfg_value;
3958 int rc;
3959
3960
3961 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
3962 "0295 Reset HBA Data: x%x x%x\n",
3963 phba->pport->port_state, psli->sli_flag);
3964
3965
3966 phba->fc_eventTag = 0;
3967 phba->link_events = 0;
3968 phba->pport->fc_myDID = 0;
3969 phba->pport->fc_prevDID = 0;
3970
3971 spin_lock_irq(&phba->hbalock);
3972 psli->sli_flag &= ~(LPFC_PROCESS_LA);
3973 phba->fcf.fcf_flag = 0;
3974 spin_unlock_irq(&phba->hbalock);
3975
3976
3977 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
3978 "0389 Performing PCI function reset!\n");
3979
3980
3981 pci_read_config_word(phba->pcidev, PCI_COMMAND, &cfg_value);
3982 pci_write_config_word(phba->pcidev, PCI_COMMAND, (cfg_value &
3983 ~(PCI_COMMAND_PARITY | PCI_COMMAND_SERR)));
3984
3985
3986 rc = lpfc_pci_function_reset(phba);
3987 lpfc_sli4_queue_destroy(phba);
3988
3989
3990 pci_write_config_word(phba->pcidev, PCI_COMMAND, cfg_value);
3991
3992 return rc;
3993}
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008static int
4009lpfc_sli_brdrestart_s3(struct lpfc_hba *phba)
4010{
4011 MAILBOX_t *mb;
4012 struct lpfc_sli *psli;
4013 volatile uint32_t word0;
4014 void __iomem *to_slim;
4015 uint32_t hba_aer_enabled;
4016
4017 spin_lock_irq(&phba->hbalock);
4018
4019
4020 hba_aer_enabled = phba->hba_flag & HBA_AER_ENABLED;
4021
4022 psli = &phba->sli;
4023
4024
4025 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
4026 "0337 Restart HBA Data: x%x x%x\n",
4027 phba->pport->port_state, psli->sli_flag);
4028
4029 word0 = 0;
4030 mb = (MAILBOX_t *) &word0;
4031 mb->mbxCommand = MBX_RESTART;
4032 mb->mbxHc = 1;
4033
4034 lpfc_reset_barrier(phba);
4035
4036 to_slim = phba->MBslimaddr;
4037 writel(*(uint32_t *) mb, to_slim);
4038 readl(to_slim);
4039
4040
4041 if (phba->pport->port_state)
4042 word0 = 1;
4043 else
4044 word0 = 0;
4045 to_slim = phba->MBslimaddr + sizeof (uint32_t);
4046 writel(*(uint32_t *) mb, to_slim);
4047 readl(to_slim);
4048
4049 lpfc_sli_brdreset(phba);
4050 phba->pport->stopped = 0;
4051 phba->link_state = LPFC_INIT_START;
4052 phba->hba_flag = 0;
4053 spin_unlock_irq(&phba->hbalock);
4054
4055 memset(&psli->lnk_stat_offsets, 0, sizeof(psli->lnk_stat_offsets));
4056 psli->stats_start = get_seconds();
4057
4058
4059 mdelay(100);
4060
4061
4062 if (hba_aer_enabled)
4063 pci_disable_pcie_error_reporting(phba->pcidev);
4064
4065 lpfc_hba_down_post(phba);
4066
4067 return 0;
4068}
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079static int
4080lpfc_sli_brdrestart_s4(struct lpfc_hba *phba)
4081{
4082 struct lpfc_sli *psli = &phba->sli;
4083 uint32_t hba_aer_enabled;
4084 int rc;
4085
4086
4087 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
4088 "0296 Restart HBA Data: x%x x%x\n",
4089 phba->pport->port_state, psli->sli_flag);
4090
4091
4092 hba_aer_enabled = phba->hba_flag & HBA_AER_ENABLED;
4093
4094 rc = lpfc_sli4_brdreset(phba);
4095
4096 spin_lock_irq(&phba->hbalock);
4097 phba->pport->stopped = 0;
4098 phba->link_state = LPFC_INIT_START;
4099 phba->hba_flag = 0;
4100 spin_unlock_irq(&phba->hbalock);
4101
4102 memset(&psli->lnk_stat_offsets, 0, sizeof(psli->lnk_stat_offsets));
4103 psli->stats_start = get_seconds();
4104
4105
4106 if (hba_aer_enabled)
4107 pci_disable_pcie_error_reporting(phba->pcidev);
4108
4109 lpfc_hba_down_post(phba);
4110
4111 return rc;
4112}
4113
4114
4115
4116
4117
4118
4119
4120
4121int
4122lpfc_sli_brdrestart(struct lpfc_hba *phba)
4123{
4124 return phba->lpfc_sli_brdrestart(phba);
4125}
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137static int
4138lpfc_sli_chipset_init(struct lpfc_hba *phba)
4139{
4140 uint32_t status, i = 0;
4141
4142
4143 if (lpfc_readl(phba->HSregaddr, &status))
4144 return -EIO;
4145
4146
4147 i = 0;
4148 while ((status & (HS_FFRDY | HS_MBRDY)) != (HS_FFRDY | HS_MBRDY)) {
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158 if (i++ >= 200) {
4159
4160
4161 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4162 "0436 Adapter failed to init, "
4163 "timeout, status reg x%x, "
4164 "FW Data: A8 x%x AC x%x\n", status,
4165 readl(phba->MBslimaddr + 0xa8),
4166 readl(phba->MBslimaddr + 0xac));
4167 phba->link_state = LPFC_HBA_ERROR;
4168 return -ETIMEDOUT;
4169 }
4170
4171
4172 if (status & HS_FFERM) {
4173
4174
4175
4176 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4177 "0437 Adapter failed to init, "
4178 "chipset, status reg x%x, "
4179 "FW Data: A8 x%x AC x%x\n", status,
4180 readl(phba->MBslimaddr + 0xa8),
4181 readl(phba->MBslimaddr + 0xac));
4182 phba->link_state = LPFC_HBA_ERROR;
4183 return -EIO;
4184 }
4185
4186 if (i <= 10)
4187 msleep(10);
4188 else if (i <= 100)
4189 msleep(100);
4190 else
4191 msleep(1000);
4192
4193 if (i == 150) {
4194
4195 phba->pport->port_state = LPFC_VPORT_UNKNOWN;
4196 lpfc_sli_brdrestart(phba);
4197 }
4198
4199 if (lpfc_readl(phba->HSregaddr, &status))
4200 return -EIO;
4201 }
4202
4203
4204 if (status & HS_FFERM) {
4205
4206
4207 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4208 "0438 Adapter failed to init, chipset, "
4209 "status reg x%x, "
4210 "FW Data: A8 x%x AC x%x\n", status,
4211 readl(phba->MBslimaddr + 0xa8),
4212 readl(phba->MBslimaddr + 0xac));
4213 phba->link_state = LPFC_HBA_ERROR;
4214 return -EIO;
4215 }
4216
4217
4218 writel(0, phba->HCregaddr);
4219 readl(phba->HCregaddr);
4220
4221
4222 writel(0xffffffff, phba->HAregaddr);
4223 readl(phba->HAregaddr);
4224 return 0;
4225}
4226
4227
4228
4229
4230
4231
4232
4233int
4234lpfc_sli_hbq_count(void)
4235{
4236 return ARRAY_SIZE(lpfc_hbq_defs);
4237}
4238
4239
4240
4241
4242
4243
4244
4245
4246static int
4247lpfc_sli_hbq_entry_count(void)
4248{
4249 int hbq_count = lpfc_sli_hbq_count();
4250 int count = 0;
4251 int i;
4252
4253 for (i = 0; i < hbq_count; ++i)
4254 count += lpfc_hbq_defs[i]->entry_count;
4255 return count;
4256}
4257
4258
4259
4260
4261
4262
4263
4264int
4265lpfc_sli_hbq_size(void)
4266{
4267 return lpfc_sli_hbq_entry_count() * sizeof(struct lpfc_hbq_entry);
4268}
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279static int
4280lpfc_sli_hbq_setup(struct lpfc_hba *phba)
4281{
4282 int hbq_count = lpfc_sli_hbq_count();
4283 LPFC_MBOXQ_t *pmb;
4284 MAILBOX_t *pmbox;
4285 uint32_t hbqno;
4286 uint32_t hbq_entry_index;
4287
4288
4289
4290
4291 pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4292
4293 if (!pmb)
4294 return -ENOMEM;
4295
4296 pmbox = &pmb->u.mb;
4297
4298
4299 phba->link_state = LPFC_INIT_MBX_CMDS;
4300 phba->hbq_in_use = 1;
4301
4302 hbq_entry_index = 0;
4303 for (hbqno = 0; hbqno < hbq_count; ++hbqno) {
4304 phba->hbqs[hbqno].next_hbqPutIdx = 0;
4305 phba->hbqs[hbqno].hbqPutIdx = 0;
4306 phba->hbqs[hbqno].local_hbqGetIdx = 0;
4307 phba->hbqs[hbqno].entry_count =
4308 lpfc_hbq_defs[hbqno]->entry_count;
4309 lpfc_config_hbq(phba, hbqno, lpfc_hbq_defs[hbqno],
4310 hbq_entry_index, pmb);
4311 hbq_entry_index += phba->hbqs[hbqno].entry_count;
4312
4313 if (lpfc_sli_issue_mbox(phba, pmb, MBX_POLL) != MBX_SUCCESS) {
4314
4315
4316
4317 lpfc_printf_log(phba, KERN_ERR,
4318 LOG_SLI | LOG_VPORT,
4319 "1805 Adapter failed to init. "
4320 "Data: x%x x%x x%x\n",
4321 pmbox->mbxCommand,
4322 pmbox->mbxStatus, hbqno);
4323
4324 phba->link_state = LPFC_HBA_ERROR;
4325 mempool_free(pmb, phba->mbox_mem_pool);
4326 return -ENXIO;
4327 }
4328 }
4329 phba->hbq_count = hbq_count;
4330
4331 mempool_free(pmb, phba->mbox_mem_pool);
4332
4333
4334 for (hbqno = 0; hbqno < hbq_count; ++hbqno)
4335 lpfc_sli_hbqbuf_init_hbqs(phba, hbqno);
4336 return 0;
4337}
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348static int
4349lpfc_sli4_rb_setup(struct lpfc_hba *phba)
4350{
4351 phba->hbq_in_use = 1;
4352 phba->hbqs[0].entry_count = lpfc_hbq_defs[0]->entry_count;
4353 phba->hbq_count = 1;
4354
4355 lpfc_sli_hbqbuf_init_hbqs(phba, 0);
4356 return 0;
4357}
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372int
4373lpfc_sli_config_port(struct lpfc_hba *phba, int sli_mode)
4374{
4375 LPFC_MBOXQ_t *pmb;
4376 uint32_t resetcount = 0, rc = 0, done = 0;
4377
4378 pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4379 if (!pmb) {
4380 phba->link_state = LPFC_HBA_ERROR;
4381 return -ENOMEM;
4382 }
4383
4384 phba->sli_rev = sli_mode;
4385 while (resetcount < 2 && !done) {
4386 spin_lock_irq(&phba->hbalock);
4387 phba->sli.sli_flag |= LPFC_SLI_MBOX_ACTIVE;
4388 spin_unlock_irq(&phba->hbalock);
4389 phba->pport->port_state = LPFC_VPORT_UNKNOWN;
4390 lpfc_sli_brdrestart(phba);
4391 rc = lpfc_sli_chipset_init(phba);
4392 if (rc)
4393 break;
4394
4395 spin_lock_irq(&phba->hbalock);
4396 phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
4397 spin_unlock_irq(&phba->hbalock);
4398 resetcount++;
4399
4400
4401
4402
4403
4404
4405 rc = lpfc_config_port_prep(phba);
4406 if (rc == -ERESTART) {
4407 phba->link_state = LPFC_LINK_UNKNOWN;
4408 continue;
4409 } else if (rc)
4410 break;
4411
4412 phba->link_state = LPFC_INIT_MBX_CMDS;
4413 lpfc_config_port(phba, pmb);
4414 rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL);
4415 phba->sli3_options &= ~(LPFC_SLI3_NPIV_ENABLED |
4416 LPFC_SLI3_HBQ_ENABLED |
4417 LPFC_SLI3_CRP_ENABLED |
4418 LPFC_SLI3_BG_ENABLED |
4419 LPFC_SLI3_DSS_ENABLED);
4420 if (rc != MBX_SUCCESS) {
4421 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4422 "0442 Adapter failed to init, mbxCmd x%x "
4423 "CONFIG_PORT, mbxStatus x%x Data: x%x\n",
4424 pmb->u.mb.mbxCommand, pmb->u.mb.mbxStatus, 0);
4425 spin_lock_irq(&phba->hbalock);
4426 phba->sli.sli_flag &= ~LPFC_SLI_ACTIVE;
4427 spin_unlock_irq(&phba->hbalock);
4428 rc = -ENXIO;
4429 } else {
4430
4431 spin_lock_irq(&phba->hbalock);
4432 phba->sli.sli_flag &= ~LPFC_SLI_ASYNC_MBX_BLK;
4433 spin_unlock_irq(&phba->hbalock);
4434 done = 1;
4435
4436 if ((pmb->u.mb.un.varCfgPort.casabt == 1) &&
4437 (pmb->u.mb.un.varCfgPort.gasabt == 0))
4438 lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
4439 "3110 Port did not grant ASABT\n");
4440 }
4441 }
4442 if (!done) {
4443 rc = -EINVAL;
4444 goto do_prep_failed;
4445 }
4446 if (pmb->u.mb.un.varCfgPort.sli_mode == 3) {
4447 if (!pmb->u.mb.un.varCfgPort.cMA) {
4448 rc = -ENXIO;
4449 goto do_prep_failed;
4450 }
4451 if (phba->max_vpi && pmb->u.mb.un.varCfgPort.gmv) {
4452 phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED;
4453 phba->max_vpi = pmb->u.mb.un.varCfgPort.max_vpi;
4454 phba->max_vports = (phba->max_vpi > phba->max_vports) ?
4455 phba->max_vpi : phba->max_vports;
4456
4457 } else
4458 phba->max_vpi = 0;
4459 phba->fips_level = 0;
4460 phba->fips_spec_rev = 0;
4461 if (pmb->u.mb.un.varCfgPort.gdss) {
4462 phba->sli3_options |= LPFC_SLI3_DSS_ENABLED;
4463 phba->fips_level = pmb->u.mb.un.varCfgPort.fips_level;
4464 phba->fips_spec_rev = pmb->u.mb.un.varCfgPort.fips_rev;
4465 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
4466 "2850 Security Crypto Active. FIPS x%d "
4467 "(Spec Rev: x%d)",
4468 phba->fips_level, phba->fips_spec_rev);
4469 }
4470 if (pmb->u.mb.un.varCfgPort.sec_err) {
4471 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4472 "2856 Config Port Security Crypto "
4473 "Error: x%x ",
4474 pmb->u.mb.un.varCfgPort.sec_err);
4475 }
4476 if (pmb->u.mb.un.varCfgPort.gerbm)
4477 phba->sli3_options |= LPFC_SLI3_HBQ_ENABLED;
4478 if (pmb->u.mb.un.varCfgPort.gcrp)
4479 phba->sli3_options |= LPFC_SLI3_CRP_ENABLED;
4480
4481 phba->hbq_get = phba->mbox->us.s3_pgp.hbq_get;
4482 phba->port_gp = phba->mbox->us.s3_pgp.port;
4483
4484 if (phba->cfg_enable_bg) {
4485 if (pmb->u.mb.un.varCfgPort.gbg)
4486 phba->sli3_options |= LPFC_SLI3_BG_ENABLED;
4487 else
4488 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4489 "0443 Adapter did not grant "
4490 "BlockGuard\n");
4491 }
4492 } else {
4493 phba->hbq_get = NULL;
4494 phba->port_gp = phba->mbox->us.s2.port;
4495 phba->max_vpi = 0;
4496 }
4497do_prep_failed:
4498 mempool_free(pmb, phba->mbox_mem_pool);
4499 return rc;
4500}
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516int
4517lpfc_sli_hba_setup(struct lpfc_hba *phba)
4518{
4519 uint32_t rc;
4520 int mode = 3, i;
4521 int longs;
4522
4523 switch (lpfc_sli_mode) {
4524 case 2:
4525 if (phba->cfg_enable_npiv) {
4526 lpfc_printf_log(phba, KERN_ERR, LOG_INIT | LOG_VPORT,
4527 "1824 NPIV enabled: Override lpfc_sli_mode "
4528 "parameter (%d) to auto (0).\n",
4529 lpfc_sli_mode);
4530 break;
4531 }
4532 mode = 2;
4533 break;
4534 case 0:
4535 case 3:
4536 break;
4537 default:
4538 lpfc_printf_log(phba, KERN_ERR, LOG_INIT | LOG_VPORT,
4539 "1819 Unrecognized lpfc_sli_mode "
4540 "parameter: %d.\n", lpfc_sli_mode);
4541
4542 break;
4543 }
4544
4545 rc = lpfc_sli_config_port(phba, mode);
4546
4547 if (rc && lpfc_sli_mode == 3)
4548 lpfc_printf_log(phba, KERN_ERR, LOG_INIT | LOG_VPORT,
4549 "1820 Unable to select SLI-3. "
4550 "Not supported by adapter.\n");
4551 if (rc && mode != 2)
4552 rc = lpfc_sli_config_port(phba, 2);
4553 if (rc)
4554 goto lpfc_sli_hba_setup_error;
4555
4556
4557 if (phba->cfg_aer_support == 1 && !(phba->hba_flag & HBA_AER_ENABLED)) {
4558 rc = pci_enable_pcie_error_reporting(phba->pcidev);
4559 if (!rc) {
4560 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
4561 "2709 This device supports "
4562 "Advanced Error Reporting (AER)\n");
4563 spin_lock_irq(&phba->hbalock);
4564 phba->hba_flag |= HBA_AER_ENABLED;
4565 spin_unlock_irq(&phba->hbalock);
4566 } else {
4567 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
4568 "2708 This device does not support "
4569 "Advanced Error Reporting (AER)\n");
4570 phba->cfg_aer_support = 0;
4571 }
4572 }
4573
4574 if (phba->sli_rev == 3) {
4575 phba->iocb_cmd_size = SLI3_IOCB_CMD_SIZE;
4576 phba->iocb_rsp_size = SLI3_IOCB_RSP_SIZE;
4577 } else {
4578 phba->iocb_cmd_size = SLI2_IOCB_CMD_SIZE;
4579 phba->iocb_rsp_size = SLI2_IOCB_RSP_SIZE;
4580 phba->sli3_options = 0;
4581 }
4582
4583 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
4584 "0444 Firmware in SLI %x mode. Max_vpi %d\n",
4585 phba->sli_rev, phba->max_vpi);
4586 rc = lpfc_sli_ring_map(phba);
4587
4588 if (rc)
4589 goto lpfc_sli_hba_setup_error;
4590
4591
4592 if (phba->sli_rev == LPFC_SLI_REV3) {
4593
4594
4595
4596
4597
4598 if ((phba->vpi_bmask == NULL) && (phba->vpi_ids == NULL)) {
4599 longs = (phba->max_vpi + BITS_PER_LONG) / BITS_PER_LONG;
4600 phba->vpi_bmask = kzalloc(longs * sizeof(unsigned long),
4601 GFP_KERNEL);
4602 if (!phba->vpi_bmask) {
4603 rc = -ENOMEM;
4604 goto lpfc_sli_hba_setup_error;
4605 }
4606
4607 phba->vpi_ids = kzalloc(
4608 (phba->max_vpi+1) * sizeof(uint16_t),
4609 GFP_KERNEL);
4610 if (!phba->vpi_ids) {
4611 kfree(phba->vpi_bmask);
4612 rc = -ENOMEM;
4613 goto lpfc_sli_hba_setup_error;
4614 }
4615 for (i = 0; i < phba->max_vpi; i++)
4616 phba->vpi_ids[i] = i;
4617 }
4618 }
4619
4620
4621 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
4622 rc = lpfc_sli_hbq_setup(phba);
4623 if (rc)
4624 goto lpfc_sli_hba_setup_error;
4625 }
4626 spin_lock_irq(&phba->hbalock);
4627 phba->sli.sli_flag |= LPFC_PROCESS_LA;
4628 spin_unlock_irq(&phba->hbalock);
4629
4630 rc = lpfc_config_port_post(phba);
4631 if (rc)
4632 goto lpfc_sli_hba_setup_error;
4633
4634 return rc;
4635
4636lpfc_sli_hba_setup_error:
4637 phba->link_state = LPFC_HBA_ERROR;
4638 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4639 "0445 Firmware initialization failed\n");
4640 return rc;
4641}
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651static int
4652lpfc_sli4_read_fcoe_params(struct lpfc_hba *phba)
4653{
4654 LPFC_MBOXQ_t *mboxq;
4655 struct lpfc_dmabuf *mp;
4656 struct lpfc_mqe *mqe;
4657 uint32_t data_length;
4658 int rc;
4659
4660
4661 phba->valid_vlan = 0;
4662 phba->fc_map[0] = LPFC_FCOE_FCF_MAP0;
4663 phba->fc_map[1] = LPFC_FCOE_FCF_MAP1;
4664 phba->fc_map[2] = LPFC_FCOE_FCF_MAP2;
4665
4666 mboxq = (LPFC_MBOXQ_t *)mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4667 if (!mboxq)
4668 return -ENOMEM;
4669
4670 mqe = &mboxq->u.mqe;
4671 if (lpfc_sli4_dump_cfg_rg23(phba, mboxq)) {
4672 rc = -ENOMEM;
4673 goto out_free_mboxq;
4674 }
4675
4676 mp = (struct lpfc_dmabuf *) mboxq->context1;
4677 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
4678
4679 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
4680 "(%d):2571 Mailbox cmd x%x Status x%x "
4681 "Data: x%x x%x x%x x%x x%x x%x x%x x%x x%x "
4682 "x%x x%x x%x x%x x%x x%x x%x x%x x%x "
4683 "CQ: x%x x%x x%x x%x\n",
4684 mboxq->vport ? mboxq->vport->vpi : 0,
4685 bf_get(lpfc_mqe_command, mqe),
4686 bf_get(lpfc_mqe_status, mqe),
4687 mqe->un.mb_words[0], mqe->un.mb_words[1],
4688 mqe->un.mb_words[2], mqe->un.mb_words[3],
4689 mqe->un.mb_words[4], mqe->un.mb_words[5],
4690 mqe->un.mb_words[6], mqe->un.mb_words[7],
4691 mqe->un.mb_words[8], mqe->un.mb_words[9],
4692 mqe->un.mb_words[10], mqe->un.mb_words[11],
4693 mqe->un.mb_words[12], mqe->un.mb_words[13],
4694 mqe->un.mb_words[14], mqe->un.mb_words[15],
4695 mqe->un.mb_words[16], mqe->un.mb_words[50],
4696 mboxq->mcqe.word0,
4697 mboxq->mcqe.mcqe_tag0, mboxq->mcqe.mcqe_tag1,
4698 mboxq->mcqe.trailer);
4699
4700 if (rc) {
4701 lpfc_mbuf_free(phba, mp->virt, mp->phys);
4702 kfree(mp);
4703 rc = -EIO;
4704 goto out_free_mboxq;
4705 }
4706 data_length = mqe->un.mb_words[5];
4707 if (data_length > DMP_RGN23_SIZE) {
4708 lpfc_mbuf_free(phba, mp->virt, mp->phys);
4709 kfree(mp);
4710 rc = -EIO;
4711 goto out_free_mboxq;
4712 }
4713
4714 lpfc_parse_fcoe_conf(phba, mp->virt, data_length);
4715 lpfc_mbuf_free(phba, mp->virt, mp->phys);
4716 kfree(mp);
4717 rc = 0;
4718
4719out_free_mboxq:
4720 mempool_free(mboxq, phba->mbox_mem_pool);
4721 return rc;
4722}
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739static int
4740lpfc_sli4_read_rev(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
4741 uint8_t *vpd, uint32_t *vpd_size)
4742{
4743 int rc = 0;
4744 uint32_t dma_size;
4745 struct lpfc_dmabuf *dmabuf;
4746 struct lpfc_mqe *mqe;
4747
4748 dmabuf = kzalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
4749 if (!dmabuf)
4750 return -ENOMEM;
4751
4752
4753
4754
4755
4756 dma_size = *vpd_size;
4757 dmabuf->virt = dma_alloc_coherent(&phba->pcidev->dev,
4758 dma_size,
4759 &dmabuf->phys,
4760 GFP_KERNEL);
4761 if (!dmabuf->virt) {
4762 kfree(dmabuf);
4763 return -ENOMEM;
4764 }
4765 memset(dmabuf->virt, 0, dma_size);
4766
4767
4768
4769
4770
4771
4772 lpfc_read_rev(phba, mboxq);
4773 mqe = &mboxq->u.mqe;
4774 mqe->un.read_rev.vpd_paddr_high = putPaddrHigh(dmabuf->phys);
4775 mqe->un.read_rev.vpd_paddr_low = putPaddrLow(dmabuf->phys);
4776 mqe->un.read_rev.word1 &= 0x0000FFFF;
4777 bf_set(lpfc_mbx_rd_rev_vpd, &mqe->un.read_rev, 1);
4778 bf_set(lpfc_mbx_rd_rev_avail_len, &mqe->un.read_rev, dma_size);
4779
4780 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
4781 if (rc) {
4782 dma_free_coherent(&phba->pcidev->dev, dma_size,
4783 dmabuf->virt, dmabuf->phys);
4784 kfree(dmabuf);
4785 return -EIO;
4786 }
4787
4788
4789
4790
4791
4792
4793 if (mqe->un.read_rev.avail_vpd_len < *vpd_size)
4794 *vpd_size = mqe->un.read_rev.avail_vpd_len;
4795
4796 memcpy(vpd, dmabuf->virt, *vpd_size);
4797
4798 dma_free_coherent(&phba->pcidev->dev, dma_size,
4799 dmabuf->virt, dmabuf->phys);
4800 kfree(dmabuf);
4801 return 0;
4802}
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815static int
4816lpfc_sli4_retrieve_pport_name(struct lpfc_hba *phba)
4817{
4818 LPFC_MBOXQ_t *mboxq;
4819 struct lpfc_mbx_get_cntl_attributes *mbx_cntl_attr;
4820 struct lpfc_controller_attribute *cntl_attr;
4821 struct lpfc_mbx_get_port_name *get_port_name;
4822 void *virtaddr = NULL;
4823 uint32_t alloclen, reqlen;
4824 uint32_t shdr_status, shdr_add_status;
4825 union lpfc_sli4_cfg_shdr *shdr;
4826 char cport_name = 0;
4827 int rc;
4828
4829
4830 phba->sli4_hba.lnk_info.lnk_dv = LPFC_LNK_DAT_INVAL;
4831 phba->sli4_hba.pport_name_sta = LPFC_SLI4_PPNAME_NON;
4832
4833 mboxq = (LPFC_MBOXQ_t *)mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4834 if (!mboxq)
4835 return -ENOMEM;
4836
4837 phba->sli4_hba.lnk_info.lnk_dv = LPFC_LNK_DAT_INVAL;
4838 lpfc_sli4_read_config(phba);
4839 if (phba->sli4_hba.lnk_info.lnk_dv == LPFC_LNK_DAT_VAL)
4840 goto retrieve_ppname;
4841
4842
4843 reqlen = sizeof(struct lpfc_mbx_get_cntl_attributes);
4844 alloclen = lpfc_sli4_config(phba, mboxq, LPFC_MBOX_SUBSYSTEM_COMMON,
4845 LPFC_MBOX_OPCODE_GET_CNTL_ATTRIBUTES, reqlen,
4846 LPFC_SLI4_MBX_NEMBED);
4847 if (alloclen < reqlen) {
4848 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
4849 "3084 Allocated DMA memory size (%d) is "
4850 "less than the requested DMA memory size "
4851 "(%d)\n", alloclen, reqlen);
4852 rc = -ENOMEM;
4853 goto out_free_mboxq;
4854 }
4855 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
4856 virtaddr = mboxq->sge_array->addr[0];
4857 mbx_cntl_attr = (struct lpfc_mbx_get_cntl_attributes *)virtaddr;
4858 shdr = &mbx_cntl_attr->cfg_shdr;
4859 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
4860 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
4861 if (shdr_status || shdr_add_status || rc) {
4862 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
4863 "3085 Mailbox x%x (x%x/x%x) failed, "
4864 "rc:x%x, status:x%x, add_status:x%x\n",
4865 bf_get(lpfc_mqe_command, &mboxq->u.mqe),
4866 lpfc_sli_config_mbox_subsys_get(phba, mboxq),
4867 lpfc_sli_config_mbox_opcode_get(phba, mboxq),
4868 rc, shdr_status, shdr_add_status);
4869 rc = -ENXIO;
4870 goto out_free_mboxq;
4871 }
4872 cntl_attr = &mbx_cntl_attr->cntl_attr;
4873 phba->sli4_hba.lnk_info.lnk_dv = LPFC_LNK_DAT_VAL;
4874 phba->sli4_hba.lnk_info.lnk_tp =
4875 bf_get(lpfc_cntl_attr_lnk_type, cntl_attr);
4876 phba->sli4_hba.lnk_info.lnk_no =
4877 bf_get(lpfc_cntl_attr_lnk_numb, cntl_attr);
4878 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
4879 "3086 lnk_type:%d, lnk_numb:%d\n",
4880 phba->sli4_hba.lnk_info.lnk_tp,
4881 phba->sli4_hba.lnk_info.lnk_no);
4882
4883retrieve_ppname:
4884 lpfc_sli4_config(phba, mboxq, LPFC_MBOX_SUBSYSTEM_COMMON,
4885 LPFC_MBOX_OPCODE_GET_PORT_NAME,
4886 sizeof(struct lpfc_mbx_get_port_name) -
4887 sizeof(struct lpfc_sli4_cfg_mhdr),
4888 LPFC_SLI4_MBX_EMBED);
4889 get_port_name = &mboxq->u.mqe.un.get_port_name;
4890 shdr = (union lpfc_sli4_cfg_shdr *)&get_port_name->header.cfg_shdr;
4891 bf_set(lpfc_mbox_hdr_version, &shdr->request, LPFC_OPCODE_VERSION_1);
4892 bf_set(lpfc_mbx_get_port_name_lnk_type, &get_port_name->u.request,
4893 phba->sli4_hba.lnk_info.lnk_tp);
4894 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
4895 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
4896 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
4897 if (shdr_status || shdr_add_status || rc) {
4898 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
4899 "3087 Mailbox x%x (x%x/x%x) failed: "
4900 "rc:x%x, status:x%x, add_status:x%x\n",
4901 bf_get(lpfc_mqe_command, &mboxq->u.mqe),
4902 lpfc_sli_config_mbox_subsys_get(phba, mboxq),
4903 lpfc_sli_config_mbox_opcode_get(phba, mboxq),
4904 rc, shdr_status, shdr_add_status);
4905 rc = -ENXIO;
4906 goto out_free_mboxq;
4907 }
4908 switch (phba->sli4_hba.lnk_info.lnk_no) {
4909 case LPFC_LINK_NUMBER_0:
4910 cport_name = bf_get(lpfc_mbx_get_port_name_name0,
4911 &get_port_name->u.response);
4912 phba->sli4_hba.pport_name_sta = LPFC_SLI4_PPNAME_GET;
4913 break;
4914 case LPFC_LINK_NUMBER_1:
4915 cport_name = bf_get(lpfc_mbx_get_port_name_name1,
4916 &get_port_name->u.response);
4917 phba->sli4_hba.pport_name_sta = LPFC_SLI4_PPNAME_GET;
4918 break;
4919 case LPFC_LINK_NUMBER_2:
4920 cport_name = bf_get(lpfc_mbx_get_port_name_name2,
4921 &get_port_name->u.response);
4922 phba->sli4_hba.pport_name_sta = LPFC_SLI4_PPNAME_GET;
4923 break;
4924 case LPFC_LINK_NUMBER_3:
4925 cport_name = bf_get(lpfc_mbx_get_port_name_name3,
4926 &get_port_name->u.response);
4927 phba->sli4_hba.pport_name_sta = LPFC_SLI4_PPNAME_GET;
4928 break;
4929 default:
4930 break;
4931 }
4932
4933 if (phba->sli4_hba.pport_name_sta == LPFC_SLI4_PPNAME_GET) {
4934 phba->Port[0] = cport_name;
4935 phba->Port[1] = '\0';
4936 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
4937 "3091 SLI get port name: %s\n", phba->Port);
4938 }
4939
4940out_free_mboxq:
4941 if (rc != MBX_TIMEOUT) {
4942 if (bf_get(lpfc_mqe_command, &mboxq->u.mqe) == MBX_SLI4_CONFIG)
4943 lpfc_sli4_mbox_cmd_free(phba, mboxq);
4944 else
4945 mempool_free(mboxq, phba->mbox_mem_pool);
4946 }
4947 return rc;
4948}
4949
4950
4951
4952
4953
4954
4955
4956
4957static void
4958lpfc_sli4_arm_cqeq_intr(struct lpfc_hba *phba)
4959{
4960 int fcp_eqidx;
4961
4962 lpfc_sli4_cq_release(phba->sli4_hba.mbx_cq, LPFC_QUEUE_REARM);
4963 lpfc_sli4_cq_release(phba->sli4_hba.els_cq, LPFC_QUEUE_REARM);
4964 fcp_eqidx = 0;
4965 if (phba->sli4_hba.fcp_cq) {
4966 do {
4967 lpfc_sli4_cq_release(phba->sli4_hba.fcp_cq[fcp_eqidx],
4968 LPFC_QUEUE_REARM);
4969 } while (++fcp_eqidx < phba->cfg_fcp_io_channel);
4970 }
4971 if (phba->sli4_hba.hba_eq) {
4972 for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_io_channel;
4973 fcp_eqidx++)
4974 lpfc_sli4_eq_release(phba->sli4_hba.hba_eq[fcp_eqidx],
4975 LPFC_QUEUE_REARM);
4976 }
4977}
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991int
4992lpfc_sli4_get_avail_extnt_rsrc(struct lpfc_hba *phba, uint16_t type,
4993 uint16_t *extnt_count, uint16_t *extnt_size)
4994{
4995 int rc = 0;
4996 uint32_t length;
4997 uint32_t mbox_tmo;
4998 struct lpfc_mbx_get_rsrc_extent_info *rsrc_info;
4999 LPFC_MBOXQ_t *mbox;
5000
5001 mbox = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
5002 if (!mbox)
5003 return -ENOMEM;
5004
5005
5006 length = (sizeof(struct lpfc_mbx_get_rsrc_extent_info) -
5007 sizeof(struct lpfc_sli4_cfg_mhdr));
5008 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
5009 LPFC_MBOX_OPCODE_GET_RSRC_EXTENT_INFO,
5010 length, LPFC_SLI4_MBX_EMBED);
5011
5012
5013 rc = lpfc_sli4_mbox_rsrc_extent(phba, mbox, 0, type,
5014 LPFC_SLI4_MBX_EMBED);
5015 if (unlikely(rc)) {
5016 rc = -EIO;
5017 goto err_exit;
5018 }
5019
5020 if (!phba->sli4_hba.intr_enable)
5021 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
5022 else {
5023 mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
5024 rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
5025 }
5026 if (unlikely(rc)) {
5027 rc = -EIO;
5028 goto err_exit;
5029 }
5030
5031 rsrc_info = &mbox->u.mqe.un.rsrc_extent_info;
5032 if (bf_get(lpfc_mbox_hdr_status,
5033 &rsrc_info->header.cfg_shdr.response)) {
5034 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_INIT,
5035 "2930 Failed to get resource extents "
5036 "Status 0x%x Add'l Status 0x%x\n",
5037 bf_get(lpfc_mbox_hdr_status,
5038 &rsrc_info->header.cfg_shdr.response),
5039 bf_get(lpfc_mbox_hdr_add_status,
5040 &rsrc_info->header.cfg_shdr.response));
5041 rc = -EIO;
5042 goto err_exit;
5043 }
5044
5045 *extnt_count = bf_get(lpfc_mbx_get_rsrc_extent_info_cnt,
5046 &rsrc_info->u.rsp);
5047 *extnt_size = bf_get(lpfc_mbx_get_rsrc_extent_info_size,
5048 &rsrc_info->u.rsp);
5049
5050 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
5051 "3162 Retrieved extents type-%d from port: count:%d, "
5052 "size:%d\n", type, *extnt_count, *extnt_size);
5053
5054err_exit:
5055 mempool_free(mbox, phba->mbox_mem_pool);
5056 return rc;
5057}
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074static int
5075lpfc_sli4_chk_avail_extnt_rsrc(struct lpfc_hba *phba, uint16_t type)
5076{
5077 uint16_t curr_ext_cnt, rsrc_ext_cnt;
5078 uint16_t size_diff, rsrc_ext_size;
5079 int rc = 0;
5080 struct lpfc_rsrc_blks *rsrc_entry;
5081 struct list_head *rsrc_blk_list = NULL;
5082
5083 size_diff = 0;
5084 curr_ext_cnt = 0;
5085 rc = lpfc_sli4_get_avail_extnt_rsrc(phba, type,
5086 &rsrc_ext_cnt,
5087 &rsrc_ext_size);
5088 if (unlikely(rc))
5089 return -EIO;
5090
5091 switch (type) {
5092 case LPFC_RSC_TYPE_FCOE_RPI:
5093 rsrc_blk_list = &phba->sli4_hba.lpfc_rpi_blk_list;
5094 break;
5095 case LPFC_RSC_TYPE_FCOE_VPI:
5096 rsrc_blk_list = &phba->lpfc_vpi_blk_list;
5097 break;
5098 case LPFC_RSC_TYPE_FCOE_XRI:
5099 rsrc_blk_list = &phba->sli4_hba.lpfc_xri_blk_list;
5100 break;
5101 case LPFC_RSC_TYPE_FCOE_VFI:
5102 rsrc_blk_list = &phba->sli4_hba.lpfc_vfi_blk_list;
5103 break;
5104 default:
5105 break;
5106 }
5107
5108 list_for_each_entry(rsrc_entry, rsrc_blk_list, list) {
5109 curr_ext_cnt++;
5110 if (rsrc_entry->rsrc_size != rsrc_ext_size)
5111 size_diff++;
5112 }
5113
5114 if (curr_ext_cnt != rsrc_ext_cnt || size_diff != 0)
5115 rc = 1;
5116
5117 return rc;
5118}
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137static int
5138lpfc_sli4_cfg_post_extnts(struct lpfc_hba *phba, uint16_t extnt_cnt,
5139 uint16_t type, bool *emb, LPFC_MBOXQ_t *mbox)
5140{
5141 int rc = 0;
5142 uint32_t req_len;
5143 uint32_t emb_len;
5144 uint32_t alloc_len, mbox_tmo;
5145
5146
5147 req_len = extnt_cnt * sizeof(uint16_t);
5148
5149
5150
5151
5152
5153 emb_len = sizeof(MAILBOX_t) - sizeof(struct mbox_header) -
5154 sizeof(uint32_t);
5155
5156
5157
5158
5159
5160 *emb = LPFC_SLI4_MBX_EMBED;
5161 if (req_len > emb_len) {
5162 req_len = extnt_cnt * sizeof(uint16_t) +
5163 sizeof(union lpfc_sli4_cfg_shdr) +
5164 sizeof(uint32_t);
5165 *emb = LPFC_SLI4_MBX_NEMBED;
5166 }
5167
5168 alloc_len = lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
5169 LPFC_MBOX_OPCODE_ALLOC_RSRC_EXTENT,
5170 req_len, *emb);
5171 if (alloc_len < req_len) {
5172 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
5173 "2982 Allocated DMA memory size (x%x) is "
5174 "less than the requested DMA memory "
5175 "size (x%x)\n", alloc_len, req_len);
5176 return -ENOMEM;
5177 }
5178 rc = lpfc_sli4_mbox_rsrc_extent(phba, mbox, extnt_cnt, type, *emb);
5179 if (unlikely(rc))
5180 return -EIO;
5181
5182 if (!phba->sli4_hba.intr_enable)
5183 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
5184 else {
5185 mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
5186 rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
5187 }
5188
5189 if (unlikely(rc))
5190 rc = -EIO;
5191 return rc;
5192}
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202static int
5203lpfc_sli4_alloc_extent(struct lpfc_hba *phba, uint16_t type)
5204{
5205 bool emb = false;
5206 uint16_t rsrc_id_cnt, rsrc_cnt, rsrc_size;
5207 uint16_t rsrc_id, rsrc_start, j, k;
5208 uint16_t *ids;
5209 int i, rc;
5210 unsigned long longs;
5211 unsigned long *bmask;
5212 struct lpfc_rsrc_blks *rsrc_blks;
5213 LPFC_MBOXQ_t *mbox;
5214 uint32_t length;
5215 struct lpfc_id_range *id_array = NULL;
5216 void *virtaddr = NULL;
5217 struct lpfc_mbx_nembed_rsrc_extent *n_rsrc;
5218 struct lpfc_mbx_alloc_rsrc_extents *rsrc_ext;
5219 struct list_head *ext_blk_list;
5220
5221 rc = lpfc_sli4_get_avail_extnt_rsrc(phba, type,
5222 &rsrc_cnt,
5223 &rsrc_size);
5224 if (unlikely(rc))
5225 return -EIO;
5226
5227 if ((rsrc_cnt == 0) || (rsrc_size == 0)) {
5228 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_INIT,
5229 "3009 No available Resource Extents "
5230 "for resource type 0x%x: Count: 0x%x, "
5231 "Size 0x%x\n", type, rsrc_cnt,
5232 rsrc_size);
5233 return -ENOMEM;
5234 }
5235
5236 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_INIT | LOG_SLI,
5237 "2903 Post resource extents type-0x%x: "
5238 "count:%d, size %d\n", type, rsrc_cnt, rsrc_size);
5239
5240 mbox = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
5241 if (!mbox)
5242 return -ENOMEM;
5243
5244 rc = lpfc_sli4_cfg_post_extnts(phba, rsrc_cnt, type, &emb, mbox);
5245 if (unlikely(rc)) {
5246 rc = -EIO;
5247 goto err_exit;
5248 }
5249
5250
5251
5252
5253
5254
5255
5256 if (emb == LPFC_SLI4_MBX_EMBED) {
5257 rsrc_ext = &mbox->u.mqe.un.alloc_rsrc_extents;
5258 id_array = &rsrc_ext->u.rsp.id[0];
5259 rsrc_cnt = bf_get(lpfc_mbx_rsrc_cnt, &rsrc_ext->u.rsp);
5260 } else {
5261 virtaddr = mbox->sge_array->addr[0];
5262 n_rsrc = (struct lpfc_mbx_nembed_rsrc_extent *) virtaddr;
5263 rsrc_cnt = bf_get(lpfc_mbx_rsrc_cnt, n_rsrc);
5264 id_array = &n_rsrc->id;
5265 }
5266
5267 longs = ((rsrc_cnt * rsrc_size) + BITS_PER_LONG - 1) / BITS_PER_LONG;
5268 rsrc_id_cnt = rsrc_cnt * rsrc_size;
5269
5270
5271
5272
5273
5274 length = sizeof(struct lpfc_rsrc_blks);
5275 switch (type) {
5276 case LPFC_RSC_TYPE_FCOE_RPI:
5277 phba->sli4_hba.rpi_bmask = kzalloc(longs *
5278 sizeof(unsigned long),
5279 GFP_KERNEL);
5280 if (unlikely(!phba->sli4_hba.rpi_bmask)) {
5281 rc = -ENOMEM;
5282 goto err_exit;
5283 }
5284 phba->sli4_hba.rpi_ids = kzalloc(rsrc_id_cnt *
5285 sizeof(uint16_t),
5286 GFP_KERNEL);
5287 if (unlikely(!phba->sli4_hba.rpi_ids)) {
5288 kfree(phba->sli4_hba.rpi_bmask);
5289 rc = -ENOMEM;
5290 goto err_exit;
5291 }
5292
5293
5294
5295
5296
5297
5298 phba->sli4_hba.next_rpi = rsrc_id_cnt;
5299
5300
5301 bmask = phba->sli4_hba.rpi_bmask;
5302 ids = phba->sli4_hba.rpi_ids;
5303 ext_blk_list = &phba->sli4_hba.lpfc_rpi_blk_list;
5304 break;
5305 case LPFC_RSC_TYPE_FCOE_VPI:
5306 phba->vpi_bmask = kzalloc(longs *
5307 sizeof(unsigned long),
5308 GFP_KERNEL);
5309 if (unlikely(!phba->vpi_bmask)) {
5310 rc = -ENOMEM;
5311 goto err_exit;
5312 }
5313 phba->vpi_ids = kzalloc(rsrc_id_cnt *
5314 sizeof(uint16_t),
5315 GFP_KERNEL);
5316 if (unlikely(!phba->vpi_ids)) {
5317 kfree(phba->vpi_bmask);
5318 rc = -ENOMEM;
5319 goto err_exit;
5320 }
5321
5322
5323 bmask = phba->vpi_bmask;
5324 ids = phba->vpi_ids;
5325 ext_blk_list = &phba->lpfc_vpi_blk_list;
5326 break;
5327 case LPFC_RSC_TYPE_FCOE_XRI:
5328 phba->sli4_hba.xri_bmask = kzalloc(longs *
5329 sizeof(unsigned long),
5330 GFP_KERNEL);
5331 if (unlikely(!phba->sli4_hba.xri_bmask)) {
5332 rc = -ENOMEM;
5333 goto err_exit;
5334 }
5335 phba->sli4_hba.max_cfg_param.xri_used = 0;
5336 phba->sli4_hba.xri_ids = kzalloc(rsrc_id_cnt *
5337 sizeof(uint16_t),
5338 GFP_KERNEL);
5339 if (unlikely(!phba->sli4_hba.xri_ids)) {
5340 kfree(phba->sli4_hba.xri_bmask);
5341 rc = -ENOMEM;
5342 goto err_exit;
5343 }
5344
5345
5346 bmask = phba->sli4_hba.xri_bmask;
5347 ids = phba->sli4_hba.xri_ids;
5348 ext_blk_list = &phba->sli4_hba.lpfc_xri_blk_list;
5349 break;
5350 case LPFC_RSC_TYPE_FCOE_VFI:
5351 phba->sli4_hba.vfi_bmask = kzalloc(longs *
5352 sizeof(unsigned long),
5353 GFP_KERNEL);
5354 if (unlikely(!phba->sli4_hba.vfi_bmask)) {
5355 rc = -ENOMEM;
5356 goto err_exit;
5357 }
5358 phba->sli4_hba.vfi_ids = kzalloc(rsrc_id_cnt *
5359 sizeof(uint16_t),
5360 GFP_KERNEL);
5361 if (unlikely(!phba->sli4_hba.vfi_ids)) {
5362 kfree(phba->sli4_hba.vfi_bmask);
5363 rc = -ENOMEM;
5364 goto err_exit;
5365 }
5366
5367
5368 bmask = phba->sli4_hba.vfi_bmask;
5369 ids = phba->sli4_hba.vfi_ids;
5370 ext_blk_list = &phba->sli4_hba.lpfc_vfi_blk_list;
5371 break;
5372 default:
5373
5374 id_array = NULL;
5375 bmask = NULL;
5376 ids = NULL;
5377 ext_blk_list = NULL;
5378 goto err_exit;
5379 }
5380
5381
5382
5383
5384
5385
5386
5387 for (i = 0, j = 0, k = 0; i < rsrc_cnt; i++) {
5388 if ((i % 2) == 0)
5389 rsrc_id = bf_get(lpfc_mbx_rsrc_id_word4_0,
5390 &id_array[k]);
5391 else
5392 rsrc_id = bf_get(lpfc_mbx_rsrc_id_word4_1,
5393 &id_array[k]);
5394
5395 rsrc_blks = kzalloc(length, GFP_KERNEL);
5396 if (unlikely(!rsrc_blks)) {
5397 rc = -ENOMEM;
5398 kfree(bmask);
5399 kfree(ids);
5400 goto err_exit;
5401 }
5402 rsrc_blks->rsrc_start = rsrc_id;
5403 rsrc_blks->rsrc_size = rsrc_size;
5404 list_add_tail(&rsrc_blks->list, ext_blk_list);
5405 rsrc_start = rsrc_id;
5406 if ((type == LPFC_RSC_TYPE_FCOE_XRI) && (j == 0))
5407 phba->sli4_hba.scsi_xri_start = rsrc_start +
5408 lpfc_sli4_get_els_iocb_cnt(phba);
5409
5410 while (rsrc_id < (rsrc_start + rsrc_size)) {
5411 ids[j] = rsrc_id;
5412 rsrc_id++;
5413 j++;
5414 }
5415
5416 if ((i % 2) == 1)
5417 k++;
5418 }
5419 err_exit:
5420 lpfc_sli4_mbox_cmd_free(phba, mbox);
5421 return rc;
5422}
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433static int
5434lpfc_sli4_dealloc_extent(struct lpfc_hba *phba, uint16_t type)
5435{
5436 int rc;
5437 uint32_t length, mbox_tmo = 0;
5438 LPFC_MBOXQ_t *mbox;
5439 struct lpfc_mbx_dealloc_rsrc_extents *dealloc_rsrc;
5440 struct lpfc_rsrc_blks *rsrc_blk, *rsrc_blk_next;
5441
5442 mbox = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
5443 if (!mbox)
5444 return -ENOMEM;
5445
5446
5447
5448
5449
5450
5451 length = (sizeof(struct lpfc_mbx_dealloc_rsrc_extents) -
5452 sizeof(struct lpfc_sli4_cfg_mhdr));
5453 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
5454 LPFC_MBOX_OPCODE_DEALLOC_RSRC_EXTENT,
5455 length, LPFC_SLI4_MBX_EMBED);
5456
5457
5458 rc = lpfc_sli4_mbox_rsrc_extent(phba, mbox, 0, type,
5459 LPFC_SLI4_MBX_EMBED);
5460 if (unlikely(rc)) {
5461 rc = -EIO;
5462 goto out_free_mbox;
5463 }
5464 if (!phba->sli4_hba.intr_enable)
5465 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
5466 else {
5467 mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
5468 rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
5469 }
5470 if (unlikely(rc)) {
5471 rc = -EIO;
5472 goto out_free_mbox;
5473 }
5474
5475 dealloc_rsrc = &mbox->u.mqe.un.dealloc_rsrc_extents;
5476 if (bf_get(lpfc_mbox_hdr_status,
5477 &dealloc_rsrc->header.cfg_shdr.response)) {
5478 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_INIT,
5479 "2919 Failed to release resource extents "
5480 "for type %d - Status 0x%x Add'l Status 0x%x. "
5481 "Resource memory not released.\n",
5482 type,
5483 bf_get(lpfc_mbox_hdr_status,
5484 &dealloc_rsrc->header.cfg_shdr.response),
5485 bf_get(lpfc_mbox_hdr_add_status,
5486 &dealloc_rsrc->header.cfg_shdr.response));
5487 rc = -EIO;
5488 goto out_free_mbox;
5489 }
5490
5491
5492 switch (type) {
5493 case LPFC_RSC_TYPE_FCOE_VPI:
5494 kfree(phba->vpi_bmask);
5495 kfree(phba->vpi_ids);
5496 bf_set(lpfc_vpi_rsrc_rdy, &phba->sli4_hba.sli4_flags, 0);
5497 list_for_each_entry_safe(rsrc_blk, rsrc_blk_next,
5498 &phba->lpfc_vpi_blk_list, list) {
5499 list_del_init(&rsrc_blk->list);
5500 kfree(rsrc_blk);
5501 }
5502 break;
5503 case LPFC_RSC_TYPE_FCOE_XRI:
5504 kfree(phba->sli4_hba.xri_bmask);
5505 kfree(phba->sli4_hba.xri_ids);
5506 list_for_each_entry_safe(rsrc_blk, rsrc_blk_next,
5507 &phba->sli4_hba.lpfc_xri_blk_list, list) {
5508 list_del_init(&rsrc_blk->list);
5509 kfree(rsrc_blk);
5510 }
5511 break;
5512 case LPFC_RSC_TYPE_FCOE_VFI:
5513 kfree(phba->sli4_hba.vfi_bmask);
5514 kfree(phba->sli4_hba.vfi_ids);
5515 bf_set(lpfc_vfi_rsrc_rdy, &phba->sli4_hba.sli4_flags, 0);
5516 list_for_each_entry_safe(rsrc_blk, rsrc_blk_next,
5517 &phba->sli4_hba.lpfc_vfi_blk_list, list) {
5518 list_del_init(&rsrc_blk->list);
5519 kfree(rsrc_blk);
5520 }
5521 break;
5522 case LPFC_RSC_TYPE_FCOE_RPI:
5523
5524 list_for_each_entry_safe(rsrc_blk, rsrc_blk_next,
5525 &phba->sli4_hba.lpfc_rpi_blk_list, list) {
5526 list_del_init(&rsrc_blk->list);
5527 kfree(rsrc_blk);
5528 }
5529 break;
5530 default:
5531 break;
5532 }
5533
5534 bf_set(lpfc_idx_rsrc_rdy, &phba->sli4_hba.sli4_flags, 0);
5535
5536 out_free_mbox:
5537 mempool_free(mbox, phba->mbox_mem_pool);
5538 return rc;
5539}
5540
5541
5542
5543
5544
5545
5546
5547int
5548lpfc_sli4_alloc_resource_identifiers(struct lpfc_hba *phba)
5549{
5550 int i, rc, error = 0;
5551 uint16_t count, base;
5552 unsigned long longs;
5553
5554 if (!phba->sli4_hba.rpi_hdrs_in_use)
5555 phba->sli4_hba.next_rpi = phba->sli4_hba.max_cfg_param.max_rpi;
5556 if (phba->sli4_hba.extents_in_use) {
5557
5558
5559
5560
5561
5562 if (bf_get(lpfc_idx_rsrc_rdy, &phba->sli4_hba.sli4_flags) ==
5563 LPFC_IDX_RSRC_RDY) {
5564
5565
5566
5567
5568
5569 rc = lpfc_sli4_chk_avail_extnt_rsrc(phba,
5570 LPFC_RSC_TYPE_FCOE_VFI);
5571 if (rc != 0)
5572 error++;
5573 rc = lpfc_sli4_chk_avail_extnt_rsrc(phba,
5574 LPFC_RSC_TYPE_FCOE_VPI);
5575 if (rc != 0)
5576 error++;
5577 rc = lpfc_sli4_chk_avail_extnt_rsrc(phba,
5578 LPFC_RSC_TYPE_FCOE_XRI);
5579 if (rc != 0)
5580 error++;
5581 rc = lpfc_sli4_chk_avail_extnt_rsrc(phba,
5582 LPFC_RSC_TYPE_FCOE_RPI);
5583 if (rc != 0)
5584 error++;
5585
5586
5587
5588
5589
5590
5591
5592 if (error) {
5593 lpfc_printf_log(phba, KERN_INFO,
5594 LOG_MBOX | LOG_INIT,
5595 "2931 Detected extent resource "
5596 "change. Reallocating all "
5597 "extents.\n");
5598 rc = lpfc_sli4_dealloc_extent(phba,
5599 LPFC_RSC_TYPE_FCOE_VFI);
5600 rc = lpfc_sli4_dealloc_extent(phba,
5601 LPFC_RSC_TYPE_FCOE_VPI);
5602 rc = lpfc_sli4_dealloc_extent(phba,
5603 LPFC_RSC_TYPE_FCOE_XRI);
5604 rc = lpfc_sli4_dealloc_extent(phba,
5605 LPFC_RSC_TYPE_FCOE_RPI);
5606 } else
5607 return 0;
5608 }
5609
5610 rc = lpfc_sli4_alloc_extent(phba, LPFC_RSC_TYPE_FCOE_VFI);
5611 if (unlikely(rc))
5612 goto err_exit;
5613
5614 rc = lpfc_sli4_alloc_extent(phba, LPFC_RSC_TYPE_FCOE_VPI);
5615 if (unlikely(rc))
5616 goto err_exit;
5617
5618 rc = lpfc_sli4_alloc_extent(phba, LPFC_RSC_TYPE_FCOE_RPI);
5619 if (unlikely(rc))
5620 goto err_exit;
5621
5622 rc = lpfc_sli4_alloc_extent(phba, LPFC_RSC_TYPE_FCOE_XRI);
5623 if (unlikely(rc))
5624 goto err_exit;
5625 bf_set(lpfc_idx_rsrc_rdy, &phba->sli4_hba.sli4_flags,
5626 LPFC_IDX_RSRC_RDY);
5627 return rc;
5628 } else {
5629
5630
5631
5632
5633
5634
5635
5636 if (bf_get(lpfc_idx_rsrc_rdy, &phba->sli4_hba.sli4_flags) ==
5637 LPFC_IDX_RSRC_RDY) {
5638 lpfc_sli4_dealloc_resource_identifiers(phba);
5639 lpfc_sli4_remove_rpis(phba);
5640 }
5641
5642 count = phba->sli4_hba.max_cfg_param.max_rpi;
5643 if (count <= 0) {
5644 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
5645 "3279 Invalid provisioning of "
5646 "rpi:%d\n", count);
5647 rc = -EINVAL;
5648 goto err_exit;
5649 }
5650 base = phba->sli4_hba.max_cfg_param.rpi_base;
5651 longs = (count + BITS_PER_LONG - 1) / BITS_PER_LONG;
5652 phba->sli4_hba.rpi_bmask = kzalloc(longs *
5653 sizeof(unsigned long),
5654 GFP_KERNEL);
5655 if (unlikely(!phba->sli4_hba.rpi_bmask)) {
5656 rc = -ENOMEM;
5657 goto err_exit;
5658 }
5659 phba->sli4_hba.rpi_ids = kzalloc(count *
5660 sizeof(uint16_t),
5661 GFP_KERNEL);
5662 if (unlikely(!phba->sli4_hba.rpi_ids)) {
5663 rc = -ENOMEM;
5664 goto free_rpi_bmask;
5665 }
5666
5667 for (i = 0; i < count; i++)
5668 phba->sli4_hba.rpi_ids[i] = base + i;
5669
5670
5671 count = phba->sli4_hba.max_cfg_param.max_vpi;
5672 if (count <= 0) {
5673 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
5674 "3280 Invalid provisioning of "
5675 "vpi:%d\n", count);
5676 rc = -EINVAL;
5677 goto free_rpi_ids;
5678 }
5679 base = phba->sli4_hba.max_cfg_param.vpi_base;
5680 longs = (count + BITS_PER_LONG - 1) / BITS_PER_LONG;
5681 phba->vpi_bmask = kzalloc(longs *
5682 sizeof(unsigned long),
5683 GFP_KERNEL);
5684 if (unlikely(!phba->vpi_bmask)) {
5685 rc = -ENOMEM;
5686 goto free_rpi_ids;
5687 }
5688 phba->vpi_ids = kzalloc(count *
5689 sizeof(uint16_t),
5690 GFP_KERNEL);
5691 if (unlikely(!phba->vpi_ids)) {
5692 rc = -ENOMEM;
5693 goto free_vpi_bmask;
5694 }
5695
5696 for (i = 0; i < count; i++)
5697 phba->vpi_ids[i] = base + i;
5698
5699
5700 count = phba->sli4_hba.max_cfg_param.max_xri;
5701 if (count <= 0) {
5702 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
5703 "3281 Invalid provisioning of "
5704 "xri:%d\n", count);
5705 rc = -EINVAL;
5706 goto free_vpi_ids;
5707 }
5708 base = phba->sli4_hba.max_cfg_param.xri_base;
5709 longs = (count + BITS_PER_LONG - 1) / BITS_PER_LONG;
5710 phba->sli4_hba.xri_bmask = kzalloc(longs *
5711 sizeof(unsigned long),
5712 GFP_KERNEL);
5713 if (unlikely(!phba->sli4_hba.xri_bmask)) {
5714 rc = -ENOMEM;
5715 goto free_vpi_ids;
5716 }
5717 phba->sli4_hba.max_cfg_param.xri_used = 0;
5718 phba->sli4_hba.xri_ids = kzalloc(count *
5719 sizeof(uint16_t),
5720 GFP_KERNEL);
5721 if (unlikely(!phba->sli4_hba.xri_ids)) {
5722 rc = -ENOMEM;
5723 goto free_xri_bmask;
5724 }
5725
5726 for (i = 0; i < count; i++)
5727 phba->sli4_hba.xri_ids[i] = base + i;
5728
5729
5730 count = phba->sli4_hba.max_cfg_param.max_vfi;
5731 if (count <= 0) {
5732 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
5733 "3282 Invalid provisioning of "
5734 "vfi:%d\n", count);
5735 rc = -EINVAL;
5736 goto free_xri_ids;
5737 }
5738 base = phba->sli4_hba.max_cfg_param.vfi_base;
5739 longs = (count + BITS_PER_LONG - 1) / BITS_PER_LONG;
5740 phba->sli4_hba.vfi_bmask = kzalloc(longs *
5741 sizeof(unsigned long),
5742 GFP_KERNEL);
5743 if (unlikely(!phba->sli4_hba.vfi_bmask)) {
5744 rc = -ENOMEM;
5745 goto free_xri_ids;
5746 }
5747 phba->sli4_hba.vfi_ids = kzalloc(count *
5748 sizeof(uint16_t),
5749 GFP_KERNEL);
5750 if (unlikely(!phba->sli4_hba.vfi_ids)) {
5751 rc = -ENOMEM;
5752 goto free_vfi_bmask;
5753 }
5754
5755 for (i = 0; i < count; i++)
5756 phba->sli4_hba.vfi_ids[i] = base + i;
5757
5758
5759
5760
5761
5762 bf_set(lpfc_idx_rsrc_rdy, &phba->sli4_hba.sli4_flags,
5763 LPFC_IDX_RSRC_RDY);
5764 return 0;
5765 }
5766
5767 free_vfi_bmask:
5768 kfree(phba->sli4_hba.vfi_bmask);
5769 free_xri_ids:
5770 kfree(phba->sli4_hba.xri_ids);
5771 free_xri_bmask:
5772 kfree(phba->sli4_hba.xri_bmask);
5773 free_vpi_ids:
5774 kfree(phba->vpi_ids);
5775 free_vpi_bmask:
5776 kfree(phba->vpi_bmask);
5777 free_rpi_ids:
5778 kfree(phba->sli4_hba.rpi_ids);
5779 free_rpi_bmask:
5780 kfree(phba->sli4_hba.rpi_bmask);
5781 err_exit:
5782 return rc;
5783}
5784
5785
5786
5787
5788
5789
5790
5791
5792int
5793lpfc_sli4_dealloc_resource_identifiers(struct lpfc_hba *phba)
5794{
5795 if (phba->sli4_hba.extents_in_use) {
5796 lpfc_sli4_dealloc_extent(phba, LPFC_RSC_TYPE_FCOE_VPI);
5797 lpfc_sli4_dealloc_extent(phba, LPFC_RSC_TYPE_FCOE_RPI);
5798 lpfc_sli4_dealloc_extent(phba, LPFC_RSC_TYPE_FCOE_XRI);
5799 lpfc_sli4_dealloc_extent(phba, LPFC_RSC_TYPE_FCOE_VFI);
5800 } else {
5801 kfree(phba->vpi_bmask);
5802 kfree(phba->vpi_ids);
5803 bf_set(lpfc_vpi_rsrc_rdy, &phba->sli4_hba.sli4_flags, 0);
5804 kfree(phba->sli4_hba.xri_bmask);
5805 kfree(phba->sli4_hba.xri_ids);
5806 kfree(phba->sli4_hba.vfi_bmask);
5807 kfree(phba->sli4_hba.vfi_ids);
5808 bf_set(lpfc_vfi_rsrc_rdy, &phba->sli4_hba.sli4_flags, 0);
5809 bf_set(lpfc_idx_rsrc_rdy, &phba->sli4_hba.sli4_flags, 0);
5810 }
5811
5812 return 0;
5813}
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825int
5826lpfc_sli4_get_allocated_extnts(struct lpfc_hba *phba, uint16_t type,
5827 uint16_t *extnt_cnt, uint16_t *extnt_size)
5828{
5829 bool emb;
5830 int rc = 0;
5831 uint16_t curr_blks = 0;
5832 uint32_t req_len, emb_len;
5833 uint32_t alloc_len, mbox_tmo;
5834 struct list_head *blk_list_head;
5835 struct lpfc_rsrc_blks *rsrc_blk;
5836 LPFC_MBOXQ_t *mbox;
5837 void *virtaddr = NULL;
5838 struct lpfc_mbx_nembed_rsrc_extent *n_rsrc;
5839 struct lpfc_mbx_alloc_rsrc_extents *rsrc_ext;
5840 union lpfc_sli4_cfg_shdr *shdr;
5841
5842 switch (type) {
5843 case LPFC_RSC_TYPE_FCOE_VPI:
5844 blk_list_head = &phba->lpfc_vpi_blk_list;
5845 break;
5846 case LPFC_RSC_TYPE_FCOE_XRI:
5847 blk_list_head = &phba->sli4_hba.lpfc_xri_blk_list;
5848 break;
5849 case LPFC_RSC_TYPE_FCOE_VFI:
5850 blk_list_head = &phba->sli4_hba.lpfc_vfi_blk_list;
5851 break;
5852 case LPFC_RSC_TYPE_FCOE_RPI:
5853 blk_list_head = &phba->sli4_hba.lpfc_rpi_blk_list;
5854 break;
5855 default:
5856 return -EIO;
5857 }
5858
5859
5860 list_for_each_entry(rsrc_blk, blk_list_head, list) {
5861 if (curr_blks == 0) {
5862
5863
5864
5865
5866
5867
5868
5869 *extnt_size = rsrc_blk->rsrc_size;
5870 }
5871 curr_blks++;
5872 }
5873
5874
5875 req_len = curr_blks * sizeof(uint16_t);
5876
5877
5878
5879
5880
5881 emb_len = sizeof(MAILBOX_t) - sizeof(struct mbox_header) -
5882 sizeof(uint32_t);
5883
5884
5885
5886
5887
5888 emb = LPFC_SLI4_MBX_EMBED;
5889 req_len = emb_len;
5890 if (req_len > emb_len) {
5891 req_len = curr_blks * sizeof(uint16_t) +
5892 sizeof(union lpfc_sli4_cfg_shdr) +
5893 sizeof(uint32_t);
5894 emb = LPFC_SLI4_MBX_NEMBED;
5895 }
5896
5897 mbox = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
5898 if (!mbox)
5899 return -ENOMEM;
5900 memset(mbox, 0, sizeof(LPFC_MBOXQ_t));
5901
5902 alloc_len = lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
5903 LPFC_MBOX_OPCODE_GET_ALLOC_RSRC_EXTENT,
5904 req_len, emb);
5905 if (alloc_len < req_len) {
5906 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
5907 "2983 Allocated DMA memory size (x%x) is "
5908 "less than the requested DMA memory "
5909 "size (x%x)\n", alloc_len, req_len);
5910 rc = -ENOMEM;
5911 goto err_exit;
5912 }
5913 rc = lpfc_sli4_mbox_rsrc_extent(phba, mbox, curr_blks, type, emb);
5914 if (unlikely(rc)) {
5915 rc = -EIO;
5916 goto err_exit;
5917 }
5918
5919 if (!phba->sli4_hba.intr_enable)
5920 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
5921 else {
5922 mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
5923 rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
5924 }
5925
5926 if (unlikely(rc)) {
5927 rc = -EIO;
5928 goto err_exit;
5929 }
5930
5931
5932
5933
5934
5935
5936
5937 if (emb == LPFC_SLI4_MBX_EMBED) {
5938 rsrc_ext = &mbox->u.mqe.un.alloc_rsrc_extents;
5939 shdr = &rsrc_ext->header.cfg_shdr;
5940 *extnt_cnt = bf_get(lpfc_mbx_rsrc_cnt, &rsrc_ext->u.rsp);
5941 } else {
5942 virtaddr = mbox->sge_array->addr[0];
5943 n_rsrc = (struct lpfc_mbx_nembed_rsrc_extent *) virtaddr;
5944 shdr = &n_rsrc->cfg_shdr;
5945 *extnt_cnt = bf_get(lpfc_mbx_rsrc_cnt, n_rsrc);
5946 }
5947
5948 if (bf_get(lpfc_mbox_hdr_status, &shdr->response)) {
5949 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_INIT,
5950 "2984 Failed to read allocated resources "
5951 "for type %d - Status 0x%x Add'l Status 0x%x.\n",
5952 type,
5953 bf_get(lpfc_mbox_hdr_status, &shdr->response),
5954 bf_get(lpfc_mbox_hdr_add_status, &shdr->response));
5955 rc = -EIO;
5956 goto err_exit;
5957 }
5958 err_exit:
5959 lpfc_sli4_mbox_cmd_free(phba, mbox);
5960 return rc;
5961}
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977static int
5978lpfc_sli4_repost_els_sgl_list(struct lpfc_hba *phba)
5979{
5980 struct lpfc_sglq *sglq_entry = NULL;
5981 struct lpfc_sglq *sglq_entry_next = NULL;
5982 struct lpfc_sglq *sglq_entry_first = NULL;
5983 int status, post_cnt = 0, num_posted = 0, block_cnt = 0;
5984 int last_xritag = NO_XRI;
5985 LIST_HEAD(prep_sgl_list);
5986 LIST_HEAD(blck_sgl_list);
5987 LIST_HEAD(allc_sgl_list);
5988 LIST_HEAD(post_sgl_list);
5989 LIST_HEAD(free_sgl_list);
5990
5991 spin_lock(&phba->hbalock);
5992 list_splice_init(&phba->sli4_hba.lpfc_sgl_list, &allc_sgl_list);
5993 spin_unlock(&phba->hbalock);
5994
5995 list_for_each_entry_safe(sglq_entry, sglq_entry_next,
5996 &allc_sgl_list, list) {
5997 list_del_init(&sglq_entry->list);
5998 block_cnt++;
5999 if ((last_xritag != NO_XRI) &&
6000 (sglq_entry->sli4_xritag != last_xritag + 1)) {
6001
6002 list_splice_init(&prep_sgl_list, &blck_sgl_list);
6003 post_cnt = block_cnt - 1;
6004
6005 list_add_tail(&sglq_entry->list, &prep_sgl_list);
6006 block_cnt = 1;
6007 } else {
6008
6009 list_add_tail(&sglq_entry->list, &prep_sgl_list);
6010
6011 if (block_cnt == LPFC_NEMBED_MBOX_SGL_CNT) {
6012 list_splice_init(&prep_sgl_list,
6013 &blck_sgl_list);
6014 post_cnt = block_cnt;
6015 block_cnt = 0;
6016 }
6017 }
6018 num_posted++;
6019
6020
6021 last_xritag = sglq_entry->sli4_xritag;
6022
6023
6024 if (num_posted == phba->sli4_hba.els_xri_cnt) {
6025 if (post_cnt == 0) {
6026 list_splice_init(&prep_sgl_list,
6027 &blck_sgl_list);
6028 post_cnt = block_cnt;
6029 } else if (block_cnt == 1) {
6030 status = lpfc_sli4_post_sgl(phba,
6031 sglq_entry->phys, 0,
6032 sglq_entry->sli4_xritag);
6033 if (!status) {
6034
6035 list_add_tail(&sglq_entry->list,
6036 &post_sgl_list);
6037 } else {
6038
6039 lpfc_printf_log(phba, KERN_WARNING,
6040 LOG_SLI,
6041 "3159 Failed to post els "
6042 "sgl, xritag:x%x\n",
6043 sglq_entry->sli4_xritag);
6044 list_add_tail(&sglq_entry->list,
6045 &free_sgl_list);
6046 spin_lock_irq(&phba->hbalock);
6047 phba->sli4_hba.els_xri_cnt--;
6048 spin_unlock_irq(&phba->hbalock);
6049 }
6050 }
6051 }
6052
6053
6054 if (post_cnt == 0)
6055 continue;
6056
6057
6058 status = lpfc_sli4_post_els_sgl_list(phba, &blck_sgl_list,
6059 post_cnt);
6060
6061 if (!status) {
6062
6063 list_splice_init(&blck_sgl_list, &post_sgl_list);
6064 } else {
6065
6066 sglq_entry_first = list_first_entry(&blck_sgl_list,
6067 struct lpfc_sglq,
6068 list);
6069 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
6070 "3160 Failed to post els sgl-list, "
6071 "xritag:x%x-x%x\n",
6072 sglq_entry_first->sli4_xritag,
6073 (sglq_entry_first->sli4_xritag +
6074 post_cnt - 1));
6075 list_splice_init(&blck_sgl_list, &free_sgl_list);
6076 spin_lock_irq(&phba->hbalock);
6077 phba->sli4_hba.els_xri_cnt -= post_cnt;
6078 spin_unlock_irq(&phba->hbalock);
6079 }
6080
6081
6082 if (block_cnt == 0)
6083 last_xritag = NO_XRI;
6084
6085
6086 post_cnt = 0;
6087 }
6088
6089
6090 lpfc_free_sgl_list(phba, &free_sgl_list);
6091
6092
6093 if (!list_empty(&post_sgl_list)) {
6094 spin_lock(&phba->hbalock);
6095 list_splice_init(&post_sgl_list,
6096 &phba->sli4_hba.lpfc_sgl_list);
6097 spin_unlock(&phba->hbalock);
6098 } else {
6099 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
6100 "3161 Failure to post els sgl to port.\n");
6101 return -EIO;
6102 }
6103 return 0;
6104}
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115int
6116lpfc_sli4_hba_setup(struct lpfc_hba *phba)
6117{
6118 int rc;
6119 LPFC_MBOXQ_t *mboxq;
6120 struct lpfc_mqe *mqe;
6121 uint8_t *vpd;
6122 uint32_t vpd_size;
6123 uint32_t ftr_rsp = 0;
6124 struct Scsi_Host *shost = lpfc_shost_from_vport(phba->pport);
6125 struct lpfc_vport *vport = phba->pport;
6126 struct lpfc_dmabuf *mp;
6127
6128
6129 rc = lpfc_pci_function_reset(phba);
6130 if (unlikely(rc))
6131 return -ENODEV;
6132
6133
6134 rc = lpfc_sli4_post_status_check(phba);
6135 if (unlikely(rc))
6136 return -ENODEV;
6137 else {
6138 spin_lock_irq(&phba->hbalock);
6139 phba->sli.sli_flag |= LPFC_SLI_ACTIVE;
6140 spin_unlock_irq(&phba->hbalock);
6141 }
6142
6143
6144
6145
6146
6147 mboxq = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
6148 if (!mboxq)
6149 return -ENOMEM;
6150
6151
6152 vpd_size = SLI4_PAGE_SIZE;
6153 vpd = kzalloc(vpd_size, GFP_KERNEL);
6154 if (!vpd) {
6155 rc = -ENOMEM;
6156 goto out_free_mbox;
6157 }
6158
6159 rc = lpfc_sli4_read_rev(phba, mboxq, vpd, &vpd_size);
6160 if (unlikely(rc)) {
6161 kfree(vpd);
6162 goto out_free_mbox;
6163 }
6164 mqe = &mboxq->u.mqe;
6165 phba->sli_rev = bf_get(lpfc_mbx_rd_rev_sli_lvl, &mqe->un.read_rev);
6166 if (bf_get(lpfc_mbx_rd_rev_fcoe, &mqe->un.read_rev))
6167 phba->hba_flag |= HBA_FCOE_MODE;
6168 else
6169 phba->hba_flag &= ~HBA_FCOE_MODE;
6170
6171 if (bf_get(lpfc_mbx_rd_rev_cee_ver, &mqe->un.read_rev) ==
6172 LPFC_DCBX_CEE_MODE)
6173 phba->hba_flag |= HBA_FIP_SUPPORT;
6174 else
6175 phba->hba_flag &= ~HBA_FIP_SUPPORT;
6176
6177 phba->hba_flag &= ~HBA_FCP_IOQ_FLUSH;
6178
6179 if (phba->sli_rev != LPFC_SLI_REV4) {
6180 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6181 "0376 READ_REV Error. SLI Level %d "
6182 "FCoE enabled %d\n",
6183 phba->sli_rev, phba->hba_flag & HBA_FCOE_MODE);
6184 rc = -EIO;
6185 kfree(vpd);
6186 goto out_free_mbox;
6187 }
6188
6189
6190
6191
6192
6193
6194 if (phba->hba_flag & HBA_FCOE_MODE &&
6195 lpfc_sli4_read_fcoe_params(phba))
6196 lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_INIT,
6197 "2570 Failed to read FCoE parameters\n");
6198
6199
6200
6201
6202
6203 rc = lpfc_sli4_retrieve_pport_name(phba);
6204 if (!rc)
6205 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
6206 "3080 Successful retrieving SLI4 device "
6207 "physical port name: %s.\n", phba->Port);
6208
6209
6210
6211
6212
6213
6214 rc = lpfc_parse_vpd(phba, vpd, vpd_size);
6215 if (unlikely(!rc)) {
6216 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6217 "0377 Error %d parsing vpd. "
6218 "Using defaults.\n", rc);
6219 rc = 0;
6220 }
6221 kfree(vpd);
6222
6223
6224 phba->vpd.rev.biuRev = mqe->un.read_rev.first_hw_rev;
6225 phba->vpd.rev.smRev = mqe->un.read_rev.second_hw_rev;
6226 phba->vpd.rev.endecRev = mqe->un.read_rev.third_hw_rev;
6227 phba->vpd.rev.fcphHigh = bf_get(lpfc_mbx_rd_rev_fcph_high,
6228 &mqe->un.read_rev);
6229 phba->vpd.rev.fcphLow = bf_get(lpfc_mbx_rd_rev_fcph_low,
6230 &mqe->un.read_rev);
6231 phba->vpd.rev.feaLevelHigh = bf_get(lpfc_mbx_rd_rev_ftr_lvl_high,
6232 &mqe->un.read_rev);
6233 phba->vpd.rev.feaLevelLow = bf_get(lpfc_mbx_rd_rev_ftr_lvl_low,
6234 &mqe->un.read_rev);
6235 phba->vpd.rev.sli1FwRev = mqe->un.read_rev.fw_id_rev;
6236 memcpy(phba->vpd.rev.sli1FwName, mqe->un.read_rev.fw_name, 16);
6237 phba->vpd.rev.sli2FwRev = mqe->un.read_rev.ulp_fw_id_rev;
6238 memcpy(phba->vpd.rev.sli2FwName, mqe->un.read_rev.ulp_fw_name, 16);
6239 phba->vpd.rev.opFwRev = mqe->un.read_rev.fw_id_rev;
6240 memcpy(phba->vpd.rev.opFwName, mqe->un.read_rev.fw_name, 16);
6241 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
6242 "(%d):0380 READ_REV Status x%x "
6243 "fw_rev:%s fcphHi:%x fcphLo:%x flHi:%x flLo:%x\n",
6244 mboxq->vport ? mboxq->vport->vpi : 0,
6245 bf_get(lpfc_mqe_status, mqe),
6246 phba->vpd.rev.opFwName,
6247 phba->vpd.rev.fcphHigh, phba->vpd.rev.fcphLow,
6248 phba->vpd.rev.feaLevelHigh, phba->vpd.rev.feaLevelLow);
6249
6250
6251
6252
6253
6254 lpfc_request_features(phba, mboxq);
6255 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
6256 if (unlikely(rc)) {
6257 rc = -EIO;
6258 goto out_free_mbox;
6259 }
6260
6261
6262
6263
6264
6265 if (!(bf_get(lpfc_mbx_rq_ftr_rsp_fcpi, &mqe->un.req_ftrs))) {
6266 lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_SLI,
6267 "0378 No support for fcpi mode.\n");
6268 ftr_rsp++;
6269 }
6270 if (bf_get(lpfc_mbx_rq_ftr_rsp_perfh, &mqe->un.req_ftrs))
6271 phba->sli3_options |= LPFC_SLI4_PERFH_ENABLED;
6272 else
6273 phba->sli3_options &= ~LPFC_SLI4_PERFH_ENABLED;
6274
6275
6276
6277
6278
6279 phba->sli3_options &= ~LPFC_SLI3_BG_ENABLED;
6280 if (phba->cfg_enable_bg) {
6281 if (bf_get(lpfc_mbx_rq_ftr_rsp_dif, &mqe->un.req_ftrs))
6282 phba->sli3_options |= LPFC_SLI3_BG_ENABLED;
6283 else
6284 ftr_rsp++;
6285 }
6286
6287 if (phba->max_vpi && phba->cfg_enable_npiv &&
6288 !(bf_get(lpfc_mbx_rq_ftr_rsp_npiv, &mqe->un.req_ftrs)))
6289 ftr_rsp++;
6290
6291 if (ftr_rsp) {
6292 lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_SLI,
6293 "0379 Feature Mismatch Data: x%08x %08x "
6294 "x%x x%x x%x\n", mqe->un.req_ftrs.word2,
6295 mqe->un.req_ftrs.word3, phba->cfg_enable_bg,
6296 phba->cfg_enable_npiv, phba->max_vpi);
6297 if (!(bf_get(lpfc_mbx_rq_ftr_rsp_dif, &mqe->un.req_ftrs)))
6298 phba->cfg_enable_bg = 0;
6299 if (!(bf_get(lpfc_mbx_rq_ftr_rsp_npiv, &mqe->un.req_ftrs)))
6300 phba->cfg_enable_npiv = 0;
6301 }
6302
6303
6304 spin_lock_irq(&phba->hbalock);
6305 phba->sli3_options |= (LPFC_SLI3_NPIV_ENABLED | LPFC_SLI3_HBQ_ENABLED);
6306 spin_unlock_irq(&phba->hbalock);
6307
6308
6309
6310
6311
6312 rc = lpfc_sli4_alloc_resource_identifiers(phba);
6313 if (rc) {
6314 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6315 "2920 Failed to alloc Resource IDs "
6316 "rc = x%x\n", rc);
6317 goto out_free_mbox;
6318 }
6319
6320
6321 rc = lpfc_read_sparam(phba, mboxq, vport->vpi);
6322 if (rc) {
6323 phba->link_state = LPFC_HBA_ERROR;
6324 rc = -ENOMEM;
6325 goto out_free_mbox;
6326 }
6327
6328 mboxq->vport = vport;
6329 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
6330 mp = (struct lpfc_dmabuf *) mboxq->context1;
6331 if (rc == MBX_SUCCESS) {
6332 memcpy(&vport->fc_sparam, mp->virt, sizeof(struct serv_parm));
6333 rc = 0;
6334 }
6335
6336
6337
6338
6339
6340 lpfc_mbuf_free(phba, mp->virt, mp->phys);
6341 kfree(mp);
6342 mboxq->context1 = NULL;
6343 if (unlikely(rc)) {
6344 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6345 "0382 READ_SPARAM command failed "
6346 "status %d, mbxStatus x%x\n",
6347 rc, bf_get(lpfc_mqe_status, mqe));
6348 phba->link_state = LPFC_HBA_ERROR;
6349 rc = -EIO;
6350 goto out_free_mbox;
6351 }
6352
6353 lpfc_update_vport_wwn(vport);
6354
6355
6356 fc_host_node_name(shost) = wwn_to_u64(vport->fc_nodename.u.wwn);
6357 fc_host_port_name(shost) = wwn_to_u64(vport->fc_portname.u.wwn);
6358
6359
6360 rc = lpfc_sli4_xri_sgl_update(phba);
6361 if (unlikely(rc)) {
6362 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6363 "1400 Failed to update xri-sgl size and "
6364 "mapping: %d\n", rc);
6365 goto out_free_mbox;
6366 }
6367
6368
6369 rc = lpfc_sli4_repost_els_sgl_list(phba);
6370 if (unlikely(rc)) {
6371 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6372 "0582 Error %d during els sgl post "
6373 "operation\n", rc);
6374 rc = -ENODEV;
6375 goto out_free_mbox;
6376 }
6377
6378
6379 rc = lpfc_sli4_repost_scsi_sgl_list(phba);
6380 if (unlikely(rc)) {
6381 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6382 "0383 Error %d during scsi sgl post "
6383 "operation\n", rc);
6384
6385
6386 rc = -ENODEV;
6387 goto out_free_mbox;
6388 }
6389
6390
6391 rc = lpfc_sli4_post_all_rpi_hdrs(phba);
6392 if (unlikely(rc)) {
6393 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6394 "0393 Error %d during rpi post operation\n",
6395 rc);
6396 rc = -ENODEV;
6397 goto out_free_mbox;
6398 }
6399 lpfc_sli4_node_prep(phba);
6400
6401
6402 rc = lpfc_sli4_queue_create(phba);
6403 if (rc) {
6404 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
6405 "3089 Failed to allocate queues\n");
6406 rc = -ENODEV;
6407 goto out_stop_timers;
6408 }
6409
6410 rc = lpfc_sli4_queue_setup(phba);
6411 if (unlikely(rc)) {
6412 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6413 "0381 Error %d during queue setup.\n ", rc);
6414 goto out_destroy_queue;
6415 }
6416
6417
6418 lpfc_sli4_arm_cqeq_intr(phba);
6419
6420
6421 phba->sli4_hba.intr_enable = 1;
6422
6423
6424 spin_lock_irq(&phba->hbalock);
6425 phba->sli.sli_flag &= ~LPFC_SLI_ASYNC_MBX_BLK;
6426 spin_unlock_irq(&phba->hbalock);
6427
6428
6429 lpfc_sli4_rb_setup(phba);
6430
6431
6432 phba->fcf.fcf_flag = 0;
6433 phba->fcf.current_rec.flag = 0;
6434
6435
6436 mod_timer(&vport->els_tmofunc,
6437 jiffies + HZ * (phba->fc_ratov * 2));
6438
6439
6440 mod_timer(&phba->hb_tmofunc,
6441 jiffies + HZ * LPFC_HB_MBOX_INTERVAL);
6442 phba->hb_outstanding = 0;
6443 phba->last_completion_time = jiffies;
6444
6445
6446 mod_timer(&phba->eratt_poll, jiffies + HZ * LPFC_ERATT_POLL_INTERVAL);
6447
6448
6449 if (phba->cfg_aer_support == 1 && !(phba->hba_flag & HBA_AER_ENABLED)) {
6450 rc = pci_enable_pcie_error_reporting(phba->pcidev);
6451 if (!rc) {
6452 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
6453 "2829 This device supports "
6454 "Advanced Error Reporting (AER)\n");
6455 spin_lock_irq(&phba->hbalock);
6456 phba->hba_flag |= HBA_AER_ENABLED;
6457 spin_unlock_irq(&phba->hbalock);
6458 } else {
6459 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
6460 "2830 This device does not support "
6461 "Advanced Error Reporting (AER)\n");
6462 phba->cfg_aer_support = 0;
6463 }
6464 rc = 0;
6465 }
6466
6467 if (!(phba->hba_flag & HBA_FCOE_MODE)) {
6468
6469
6470
6471 lpfc_reg_fcfi(phba, mboxq);
6472 mboxq->vport = phba->pport;
6473 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
6474 if (rc != MBX_SUCCESS)
6475 goto out_unset_queue;
6476 rc = 0;
6477 phba->fcf.fcfi = bf_get(lpfc_reg_fcfi_fcfi,
6478 &mboxq->u.mqe.un.reg_fcfi);
6479
6480
6481 lpfc_sli_read_link_ste(phba);
6482 }
6483
6484
6485
6486
6487
6488 spin_lock_irq(&phba->hbalock);
6489 phba->link_state = LPFC_LINK_DOWN;
6490 spin_unlock_irq(&phba->hbalock);
6491 if (!(phba->hba_flag & HBA_FCOE_MODE) &&
6492 (phba->hba_flag & LINK_DISABLED)) {
6493 lpfc_printf_log(phba, KERN_ERR, LOG_INIT | LOG_SLI,
6494 "3103 Adapter Link is disabled.\n");
6495 lpfc_down_link(phba, mboxq);
6496 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
6497 if (rc != MBX_SUCCESS) {
6498 lpfc_printf_log(phba, KERN_ERR, LOG_INIT | LOG_SLI,
6499 "3104 Adapter failed to issue "
6500 "DOWN_LINK mbox cmd, rc:x%x\n", rc);
6501 goto out_unset_queue;
6502 }
6503 } else if (phba->cfg_suppress_link_up == LPFC_INITIALIZE_LINK) {
6504
6505 if (!(phba->link_flag & LS_LOOPBACK_MODE)) {
6506 rc = phba->lpfc_hba_init_link(phba, MBX_NOWAIT);
6507 if (rc)
6508 goto out_unset_queue;
6509 }
6510 }
6511 mempool_free(mboxq, phba->mbox_mem_pool);
6512 return rc;
6513out_unset_queue:
6514
6515 lpfc_sli4_queue_unset(phba);
6516out_destroy_queue:
6517 lpfc_sli4_queue_destroy(phba);
6518out_stop_timers:
6519 lpfc_stop_hba_timers(phba);
6520out_free_mbox:
6521 mempool_free(mboxq, phba->mbox_mem_pool);
6522 return rc;
6523}
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537void
6538lpfc_mbox_timeout(unsigned long ptr)
6539{
6540 struct lpfc_hba *phba = (struct lpfc_hba *) ptr;
6541 unsigned long iflag;
6542 uint32_t tmo_posted;
6543
6544 spin_lock_irqsave(&phba->pport->work_port_lock, iflag);
6545 tmo_posted = phba->pport->work_port_events & WORKER_MBOX_TMO;
6546 if (!tmo_posted)
6547 phba->pport->work_port_events |= WORKER_MBOX_TMO;
6548 spin_unlock_irqrestore(&phba->pport->work_port_lock, iflag);
6549
6550 if (!tmo_posted)
6551 lpfc_worker_wake_up(phba);
6552 return;
6553}
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564void
6565lpfc_mbox_timeout_handler(struct lpfc_hba *phba)
6566{
6567 LPFC_MBOXQ_t *pmbox = phba->sli.mbox_active;
6568 MAILBOX_t *mb = &pmbox->u.mb;
6569 struct lpfc_sli *psli = &phba->sli;
6570 struct lpfc_sli_ring *pring;
6571
6572
6573
6574
6575
6576
6577 spin_lock_irq(&phba->hbalock);
6578 if (pmbox == NULL) {
6579 lpfc_printf_log(phba, KERN_WARNING,
6580 LOG_MBOX | LOG_SLI,
6581 "0353 Active Mailbox cleared - mailbox timeout "
6582 "exiting\n");
6583 spin_unlock_irq(&phba->hbalock);
6584 return;
6585 }
6586
6587
6588 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6589 "0310 Mailbox command x%x timeout Data: x%x x%x x%p\n",
6590 mb->mbxCommand,
6591 phba->pport->port_state,
6592 phba->sli.sli_flag,
6593 phba->sli.mbox_active);
6594 spin_unlock_irq(&phba->hbalock);
6595
6596
6597
6598
6599
6600 spin_lock_irq(&phba->pport->work_port_lock);
6601 phba->pport->work_port_events &= ~WORKER_MBOX_TMO;
6602 spin_unlock_irq(&phba->pport->work_port_lock);
6603 spin_lock_irq(&phba->hbalock);
6604 phba->link_state = LPFC_LINK_UNKNOWN;
6605 psli->sli_flag &= ~LPFC_SLI_ACTIVE;
6606 spin_unlock_irq(&phba->hbalock);
6607
6608 pring = &psli->ring[psli->fcp_ring];
6609 lpfc_sli_abort_iocb_ring(phba, pring);
6610
6611 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6612 "0345 Resetting board due to mailbox timeout\n");
6613
6614
6615 lpfc_reset_hba(phba);
6616}
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644static int
6645lpfc_sli_issue_mbox_s3(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox,
6646 uint32_t flag)
6647{
6648 MAILBOX_t *mbx;
6649 struct lpfc_sli *psli = &phba->sli;
6650 uint32_t status, evtctr;
6651 uint32_t ha_copy, hc_copy;
6652 int i;
6653 unsigned long timeout;
6654 unsigned long drvr_flag = 0;
6655 uint32_t word0, ldata;
6656 void __iomem *to_slim;
6657 int processing_queue = 0;
6658
6659 spin_lock_irqsave(&phba->hbalock, drvr_flag);
6660 if (!pmbox) {
6661 phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
6662
6663 if (unlikely(psli->sli_flag & LPFC_SLI_ASYNC_MBX_BLK)) {
6664 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6665 return MBX_SUCCESS;
6666 }
6667 processing_queue = 1;
6668 pmbox = lpfc_mbox_get(phba);
6669 if (!pmbox) {
6670 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6671 return MBX_SUCCESS;
6672 }
6673 }
6674
6675 if (pmbox->mbox_cmpl && pmbox->mbox_cmpl != lpfc_sli_def_mbox_cmpl &&
6676 pmbox->mbox_cmpl != lpfc_sli_wake_mbox_wait) {
6677 if(!pmbox->vport) {
6678 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6679 lpfc_printf_log(phba, KERN_ERR,
6680 LOG_MBOX | LOG_VPORT,
6681 "1806 Mbox x%x failed. No vport\n",
6682 pmbox->u.mb.mbxCommand);
6683 dump_stack();
6684 goto out_not_finished;
6685 }
6686 }
6687
6688
6689 if (unlikely(pci_channel_offline(phba->pcidev))) {
6690 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6691 goto out_not_finished;
6692 }
6693
6694
6695 if (unlikely(phba->hba_flag & DEFER_ERATT)) {
6696 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6697 goto out_not_finished;
6698 }
6699
6700 psli = &phba->sli;
6701
6702 mbx = &pmbox->u.mb;
6703 status = MBX_SUCCESS;
6704
6705 if (phba->link_state == LPFC_HBA_ERROR) {
6706 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6707
6708
6709 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6710 "(%d):0311 Mailbox command x%x cannot "
6711 "issue Data: x%x x%x\n",
6712 pmbox->vport ? pmbox->vport->vpi : 0,
6713 pmbox->u.mb.mbxCommand, psli->sli_flag, flag);
6714 goto out_not_finished;
6715 }
6716
6717 if (mbx->mbxCommand != MBX_KILL_BOARD && flag & MBX_NOWAIT) {
6718 if (lpfc_readl(phba->HCregaddr, &hc_copy) ||
6719 !(hc_copy & HC_MBINT_ENA)) {
6720 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6721 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6722 "(%d):2528 Mailbox command x%x cannot "
6723 "issue Data: x%x x%x\n",
6724 pmbox->vport ? pmbox->vport->vpi : 0,
6725 pmbox->u.mb.mbxCommand, psli->sli_flag, flag);
6726 goto out_not_finished;
6727 }
6728 }
6729
6730 if (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE) {
6731
6732
6733
6734
6735
6736 if (flag & MBX_POLL) {
6737 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6738
6739
6740 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6741 "(%d):2529 Mailbox command x%x "
6742 "cannot issue Data: x%x x%x\n",
6743 pmbox->vport ? pmbox->vport->vpi : 0,
6744 pmbox->u.mb.mbxCommand,
6745 psli->sli_flag, flag);
6746 goto out_not_finished;
6747 }
6748
6749 if (!(psli->sli_flag & LPFC_SLI_ACTIVE)) {
6750 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6751
6752 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6753 "(%d):2530 Mailbox command x%x "
6754 "cannot issue Data: x%x x%x\n",
6755 pmbox->vport ? pmbox->vport->vpi : 0,
6756 pmbox->u.mb.mbxCommand,
6757 psli->sli_flag, flag);
6758 goto out_not_finished;
6759 }
6760
6761
6762
6763
6764 lpfc_mbox_put(phba, pmbox);
6765
6766
6767 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
6768 "(%d):0308 Mbox cmd issue - BUSY Data: "
6769 "x%x x%x x%x x%x\n",
6770 pmbox->vport ? pmbox->vport->vpi : 0xffffff,
6771 mbx->mbxCommand, phba->pport->port_state,
6772 psli->sli_flag, flag);
6773
6774 psli->slistat.mbox_busy++;
6775 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6776
6777 if (pmbox->vport) {
6778 lpfc_debugfs_disc_trc(pmbox->vport,
6779 LPFC_DISC_TRC_MBOX_VPORT,
6780 "MBOX Bsy vport: cmd:x%x mb:x%x x%x",
6781 (uint32_t)mbx->mbxCommand,
6782 mbx->un.varWords[0], mbx->un.varWords[1]);
6783 }
6784 else {
6785 lpfc_debugfs_disc_trc(phba->pport,
6786 LPFC_DISC_TRC_MBOX,
6787 "MBOX Bsy: cmd:x%x mb:x%x x%x",
6788 (uint32_t)mbx->mbxCommand,
6789 mbx->un.varWords[0], mbx->un.varWords[1]);
6790 }
6791
6792 return MBX_BUSY;
6793 }
6794
6795 psli->sli_flag |= LPFC_SLI_MBOX_ACTIVE;
6796
6797
6798 if (flag != MBX_POLL) {
6799 if (!(psli->sli_flag & LPFC_SLI_ACTIVE) &&
6800 (mbx->mbxCommand != MBX_KILL_BOARD)) {
6801 psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
6802 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6803
6804 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
6805 "(%d):2531 Mailbox command x%x "
6806 "cannot issue Data: x%x x%x\n",
6807 pmbox->vport ? pmbox->vport->vpi : 0,
6808 pmbox->u.mb.mbxCommand,
6809 psli->sli_flag, flag);
6810 goto out_not_finished;
6811 }
6812
6813 mod_timer(&psli->mbox_tmo, (jiffies +
6814 (HZ * lpfc_mbox_tmo_val(phba, pmbox))));
6815 }
6816
6817
6818 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
6819 "(%d):0309 Mailbox cmd x%x issue Data: x%x x%x "
6820 "x%x\n",
6821 pmbox->vport ? pmbox->vport->vpi : 0,
6822 mbx->mbxCommand, phba->pport->port_state,
6823 psli->sli_flag, flag);
6824
6825 if (mbx->mbxCommand != MBX_HEARTBEAT) {
6826 if (pmbox->vport) {
6827 lpfc_debugfs_disc_trc(pmbox->vport,
6828 LPFC_DISC_TRC_MBOX_VPORT,
6829 "MBOX Send vport: cmd:x%x mb:x%x x%x",
6830 (uint32_t)mbx->mbxCommand,
6831 mbx->un.varWords[0], mbx->un.varWords[1]);
6832 }
6833 else {
6834 lpfc_debugfs_disc_trc(phba->pport,
6835 LPFC_DISC_TRC_MBOX,
6836 "MBOX Send: cmd:x%x mb:x%x x%x",
6837 (uint32_t)mbx->mbxCommand,
6838 mbx->un.varWords[0], mbx->un.varWords[1]);
6839 }
6840 }
6841
6842 psli->slistat.mbox_cmd++;
6843 evtctr = psli->slistat.mbox_event;
6844
6845
6846 mbx->mbxOwner = OWN_CHIP;
6847
6848 if (psli->sli_flag & LPFC_SLI_ACTIVE) {
6849
6850 if (pmbox->in_ext_byte_len || pmbox->out_ext_byte_len) {
6851 *(((uint32_t *)mbx) + pmbox->mbox_offset_word)
6852 = (uint8_t *)phba->mbox_ext
6853 - (uint8_t *)phba->mbox;
6854 }
6855
6856
6857 if (pmbox->in_ext_byte_len && pmbox->context2) {
6858 lpfc_sli_pcimem_bcopy(pmbox->context2,
6859 (uint8_t *)phba->mbox_ext,
6860 pmbox->in_ext_byte_len);
6861 }
6862
6863 lpfc_sli_pcimem_bcopy(mbx, phba->mbox, MAILBOX_CMD_SIZE);
6864 } else {
6865
6866 if (pmbox->in_ext_byte_len || pmbox->out_ext_byte_len)
6867 *(((uint32_t *)mbx) + pmbox->mbox_offset_word)
6868 = MAILBOX_HBA_EXT_OFFSET;
6869
6870
6871 if (pmbox->in_ext_byte_len && pmbox->context2) {
6872 lpfc_memcpy_to_slim(phba->MBslimaddr +
6873 MAILBOX_HBA_EXT_OFFSET,
6874 pmbox->context2, pmbox->in_ext_byte_len);
6875
6876 }
6877 if (mbx->mbxCommand == MBX_CONFIG_PORT) {
6878
6879 lpfc_sli_pcimem_bcopy(mbx, phba->mbox, MAILBOX_CMD_SIZE);
6880 }
6881
6882
6883
6884 to_slim = phba->MBslimaddr + sizeof (uint32_t);
6885 lpfc_memcpy_to_slim(to_slim, &mbx->un.varWords[0],
6886 MAILBOX_CMD_SIZE - sizeof (uint32_t));
6887
6888
6889 ldata = *((uint32_t *)mbx);
6890 to_slim = phba->MBslimaddr;
6891 writel(ldata, to_slim);
6892 readl(to_slim);
6893
6894 if (mbx->mbxCommand == MBX_CONFIG_PORT) {
6895
6896 psli->sli_flag |= LPFC_SLI_ACTIVE;
6897 }
6898 }
6899
6900 wmb();
6901
6902 switch (flag) {
6903 case MBX_NOWAIT:
6904
6905 psli->mbox_active = pmbox;
6906
6907 writel(CA_MBATT, phba->CAregaddr);
6908 readl(phba->CAregaddr);
6909
6910 break;
6911
6912 case MBX_POLL:
6913
6914 psli->mbox_active = NULL;
6915
6916 writel(CA_MBATT, phba->CAregaddr);
6917 readl(phba->CAregaddr);
6918
6919 if (psli->sli_flag & LPFC_SLI_ACTIVE) {
6920
6921 word0 = *((uint32_t *)phba->mbox);
6922 word0 = le32_to_cpu(word0);
6923 } else {
6924
6925 if (lpfc_readl(phba->MBslimaddr, &word0)) {
6926 spin_unlock_irqrestore(&phba->hbalock,
6927 drvr_flag);
6928 goto out_not_finished;
6929 }
6930 }
6931
6932
6933 if (lpfc_readl(phba->HAregaddr, &ha_copy)) {
6934 spin_unlock_irqrestore(&phba->hbalock,
6935 drvr_flag);
6936 goto out_not_finished;
6937 }
6938 timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, pmbox) *
6939 1000) + jiffies;
6940 i = 0;
6941
6942 while (((word0 & OWN_CHIP) == OWN_CHIP) ||
6943 (!(ha_copy & HA_MBATT) &&
6944 (phba->link_state > LPFC_WARM_START))) {
6945 if (time_after(jiffies, timeout)) {
6946 psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
6947 spin_unlock_irqrestore(&phba->hbalock,
6948 drvr_flag);
6949 goto out_not_finished;
6950 }
6951
6952
6953
6954 if (((word0 & OWN_CHIP) != OWN_CHIP)
6955 && (evtctr != psli->slistat.mbox_event))
6956 break;
6957
6958 if (i++ > 10) {
6959 spin_unlock_irqrestore(&phba->hbalock,
6960 drvr_flag);
6961 msleep(1);
6962 spin_lock_irqsave(&phba->hbalock, drvr_flag);
6963 }
6964
6965 if (psli->sli_flag & LPFC_SLI_ACTIVE) {
6966
6967 word0 = *((uint32_t *)phba->mbox);
6968 word0 = le32_to_cpu(word0);
6969 if (mbx->mbxCommand == MBX_CONFIG_PORT) {
6970 MAILBOX_t *slimmb;
6971 uint32_t slimword0;
6972
6973 slimword0 = readl(phba->MBslimaddr);
6974 slimmb = (MAILBOX_t *) & slimword0;
6975 if (((slimword0 & OWN_CHIP) != OWN_CHIP)
6976 && slimmb->mbxStatus) {
6977 psli->sli_flag &=
6978 ~LPFC_SLI_ACTIVE;
6979 word0 = slimword0;
6980 }
6981 }
6982 } else {
6983
6984 word0 = readl(phba->MBslimaddr);
6985 }
6986
6987 if (lpfc_readl(phba->HAregaddr, &ha_copy)) {
6988 spin_unlock_irqrestore(&phba->hbalock,
6989 drvr_flag);
6990 goto out_not_finished;
6991 }
6992 }
6993
6994 if (psli->sli_flag & LPFC_SLI_ACTIVE) {
6995
6996 lpfc_sli_pcimem_bcopy(phba->mbox, mbx, MAILBOX_CMD_SIZE);
6997
6998 if (pmbox->out_ext_byte_len && pmbox->context2) {
6999 lpfc_sli_pcimem_bcopy(phba->mbox_ext,
7000 pmbox->context2,
7001 pmbox->out_ext_byte_len);
7002 }
7003 } else {
7004
7005 lpfc_memcpy_from_slim(mbx, phba->MBslimaddr,
7006 MAILBOX_CMD_SIZE);
7007
7008 if (pmbox->out_ext_byte_len && pmbox->context2) {
7009 lpfc_memcpy_from_slim(pmbox->context2,
7010 phba->MBslimaddr +
7011 MAILBOX_HBA_EXT_OFFSET,
7012 pmbox->out_ext_byte_len);
7013 }
7014 }
7015
7016 writel(HA_MBATT, phba->HAregaddr);
7017 readl(phba->HAregaddr);
7018
7019 psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
7020 status = mbx->mbxStatus;
7021 }
7022
7023 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
7024 return status;
7025
7026out_not_finished:
7027 if (processing_queue) {
7028 pmbox->u.mb.mbxStatus = MBX_NOT_FINISHED;
7029 lpfc_mbox_cmpl_put(phba, pmbox);
7030 }
7031 return MBX_NOT_FINISHED;
7032}
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046static int
7047lpfc_sli4_async_mbox_block(struct lpfc_hba *phba)
7048{
7049 struct lpfc_sli *psli = &phba->sli;
7050 int rc = 0;
7051 unsigned long timeout = 0;
7052
7053
7054 spin_lock_irq(&phba->hbalock);
7055 psli->sli_flag |= LPFC_SLI_ASYNC_MBX_BLK;
7056
7057
7058
7059 if (phba->sli.mbox_active)
7060 timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba,
7061 phba->sli.mbox_active) *
7062 1000) + jiffies;
7063 spin_unlock_irq(&phba->hbalock);
7064
7065
7066 while (phba->sli.mbox_active) {
7067
7068 msleep(2);
7069 if (time_after(jiffies, timeout)) {
7070
7071 rc = 1;
7072 break;
7073 }
7074 }
7075
7076
7077 if (rc) {
7078 spin_lock_irq(&phba->hbalock);
7079 psli->sli_flag &= ~LPFC_SLI_ASYNC_MBX_BLK;
7080 spin_unlock_irq(&phba->hbalock);
7081 }
7082 return rc;
7083}
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096static void
7097lpfc_sli4_async_mbox_unblock(struct lpfc_hba *phba)
7098{
7099 struct lpfc_sli *psli = &phba->sli;
7100
7101 spin_lock_irq(&phba->hbalock);
7102 if (!(psli->sli_flag & LPFC_SLI_ASYNC_MBX_BLK)) {
7103
7104 spin_unlock_irq(&phba->hbalock);
7105 return;
7106 }
7107
7108
7109
7110
7111
7112
7113 psli->sli_flag &= ~LPFC_SLI_ASYNC_MBX_BLK;
7114 spin_unlock_irq(&phba->hbalock);
7115
7116
7117 lpfc_worker_wake_up(phba);
7118}
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131static int
7132lpfc_sli4_wait_bmbx_ready(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
7133{
7134 uint32_t db_ready;
7135 unsigned long timeout;
7136 struct lpfc_register bmbx_reg;
7137
7138 timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, mboxq)
7139 * 1000) + jiffies;
7140
7141 do {
7142 bmbx_reg.word0 = readl(phba->sli4_hba.BMBXregaddr);
7143 db_ready = bf_get(lpfc_bmbx_rdy, &bmbx_reg);
7144 if (!db_ready)
7145 msleep(2);
7146
7147 if (time_after(jiffies, timeout))
7148 return MBXERR_ERROR;
7149 } while (!db_ready);
7150
7151 return 0;
7152}
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170static int
7171lpfc_sli4_post_sync_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
7172{
7173 int rc = MBX_SUCCESS;
7174 unsigned long iflag;
7175 uint32_t mcqe_status;
7176 uint32_t mbx_cmnd;
7177 struct lpfc_sli *psli = &phba->sli;
7178 struct lpfc_mqe *mb = &mboxq->u.mqe;
7179 struct lpfc_bmbx_create *mbox_rgn;
7180 struct dma_address *dma_address;
7181
7182
7183
7184
7185
7186 spin_lock_irqsave(&phba->hbalock, iflag);
7187 if (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE) {
7188 spin_unlock_irqrestore(&phba->hbalock, iflag);
7189 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
7190 "(%d):2532 Mailbox command x%x (x%x/x%x) "
7191 "cannot issue Data: x%x x%x\n",
7192 mboxq->vport ? mboxq->vport->vpi : 0,
7193 mboxq->u.mb.mbxCommand,
7194 lpfc_sli_config_mbox_subsys_get(phba, mboxq),
7195 lpfc_sli_config_mbox_opcode_get(phba, mboxq),
7196 psli->sli_flag, MBX_POLL);
7197 return MBXERR_ERROR;
7198 }
7199
7200 psli->sli_flag |= LPFC_SLI_MBOX_ACTIVE;
7201 phba->sli.mbox_active = mboxq;
7202 spin_unlock_irqrestore(&phba->hbalock, iflag);
7203
7204
7205 rc = lpfc_sli4_wait_bmbx_ready(phba, mboxq);
7206 if (rc)
7207 goto exit;
7208
7209
7210
7211
7212
7213
7214 mbx_cmnd = bf_get(lpfc_mqe_command, mb);
7215 memset(phba->sli4_hba.bmbx.avirt, 0, sizeof(struct lpfc_bmbx_create));
7216 lpfc_sli_pcimem_bcopy(mb, phba->sli4_hba.bmbx.avirt,
7217 sizeof(struct lpfc_mqe));
7218
7219
7220 dma_address = &phba->sli4_hba.bmbx.dma_address;
7221 writel(dma_address->addr_hi, phba->sli4_hba.BMBXregaddr);
7222
7223
7224 rc = lpfc_sli4_wait_bmbx_ready(phba, mboxq);
7225 if (rc)
7226 goto exit;
7227
7228
7229 writel(dma_address->addr_lo, phba->sli4_hba.BMBXregaddr);
7230
7231
7232 rc = lpfc_sli4_wait_bmbx_ready(phba, mboxq);
7233 if (rc)
7234 goto exit;
7235
7236
7237
7238
7239
7240
7241 lpfc_sli_pcimem_bcopy(phba->sli4_hba.bmbx.avirt, mb,
7242 sizeof(struct lpfc_mqe));
7243 mbox_rgn = (struct lpfc_bmbx_create *) phba->sli4_hba.bmbx.avirt;
7244 lpfc_sli_pcimem_bcopy(&mbox_rgn->mcqe, &mboxq->mcqe,
7245 sizeof(struct lpfc_mcqe));
7246 mcqe_status = bf_get(lpfc_mcqe_status, &mbox_rgn->mcqe);
7247
7248
7249
7250
7251
7252 if (mcqe_status != MB_CQE_STATUS_SUCCESS) {
7253 if (bf_get(lpfc_mqe_status, mb) == MBX_SUCCESS)
7254 bf_set(lpfc_mqe_status, mb,
7255 (LPFC_MBX_ERROR_RANGE | mcqe_status));
7256 rc = MBXERR_ERROR;
7257 } else
7258 lpfc_sli4_swap_str(phba, mboxq);
7259
7260 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
7261 "(%d):0356 Mailbox cmd x%x (x%x/x%x) Status x%x "
7262 "Data: x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x"
7263 " x%x x%x CQ: x%x x%x x%x x%x\n",
7264 mboxq->vport ? mboxq->vport->vpi : 0, mbx_cmnd,
7265 lpfc_sli_config_mbox_subsys_get(phba, mboxq),
7266 lpfc_sli_config_mbox_opcode_get(phba, mboxq),
7267 bf_get(lpfc_mqe_status, mb),
7268 mb->un.mb_words[0], mb->un.mb_words[1],
7269 mb->un.mb_words[2], mb->un.mb_words[3],
7270 mb->un.mb_words[4], mb->un.mb_words[5],
7271 mb->un.mb_words[6], mb->un.mb_words[7],
7272 mb->un.mb_words[8], mb->un.mb_words[9],
7273 mb->un.mb_words[10], mb->un.mb_words[11],
7274 mb->un.mb_words[12], mboxq->mcqe.word0,
7275 mboxq->mcqe.mcqe_tag0, mboxq->mcqe.mcqe_tag1,
7276 mboxq->mcqe.trailer);
7277exit:
7278
7279 spin_lock_irqsave(&phba->hbalock, iflag);
7280 psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
7281 phba->sli.mbox_active = NULL;
7282 spin_unlock_irqrestore(&phba->hbalock, iflag);
7283 return rc;
7284}
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298static int
7299lpfc_sli_issue_mbox_s4(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
7300 uint32_t flag)
7301{
7302 struct lpfc_sli *psli = &phba->sli;
7303 unsigned long iflags;
7304 int rc;
7305
7306
7307 lpfc_idiag_mbxacc_dump_issue_mbox(phba, &mboxq->u.mb);
7308
7309 rc = lpfc_mbox_dev_check(phba);
7310 if (unlikely(rc)) {
7311 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
7312 "(%d):2544 Mailbox command x%x (x%x/x%x) "
7313 "cannot issue Data: x%x x%x\n",
7314 mboxq->vport ? mboxq->vport->vpi : 0,
7315 mboxq->u.mb.mbxCommand,
7316 lpfc_sli_config_mbox_subsys_get(phba, mboxq),
7317 lpfc_sli_config_mbox_opcode_get(phba, mboxq),
7318 psli->sli_flag, flag);
7319 goto out_not_finished;
7320 }
7321
7322
7323 if (!phba->sli4_hba.intr_enable) {
7324 if (flag == MBX_POLL)
7325 rc = lpfc_sli4_post_sync_mbox(phba, mboxq);
7326 else
7327 rc = -EIO;
7328 if (rc != MBX_SUCCESS)
7329 lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_SLI,
7330 "(%d):2541 Mailbox command x%x "
7331 "(x%x/x%x) failure: "
7332 "mqe_sta: x%x mcqe_sta: x%x/x%x "
7333 "Data: x%x x%x\n,",
7334 mboxq->vport ? mboxq->vport->vpi : 0,
7335 mboxq->u.mb.mbxCommand,
7336 lpfc_sli_config_mbox_subsys_get(phba,
7337 mboxq),
7338 lpfc_sli_config_mbox_opcode_get(phba,
7339 mboxq),
7340 bf_get(lpfc_mqe_status, &mboxq->u.mqe),
7341 bf_get(lpfc_mcqe_status, &mboxq->mcqe),
7342 bf_get(lpfc_mcqe_ext_status,
7343 &mboxq->mcqe),
7344 psli->sli_flag, flag);
7345 return rc;
7346 } else if (flag == MBX_POLL) {
7347 lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_SLI,
7348 "(%d):2542 Try to issue mailbox command "
7349 "x%x (x%x/x%x) synchronously ahead of async"
7350 "mailbox command queue: x%x x%x\n",
7351 mboxq->vport ? mboxq->vport->vpi : 0,
7352 mboxq->u.mb.mbxCommand,
7353 lpfc_sli_config_mbox_subsys_get(phba, mboxq),
7354 lpfc_sli_config_mbox_opcode_get(phba, mboxq),
7355 psli->sli_flag, flag);
7356
7357 rc = lpfc_sli4_async_mbox_block(phba);
7358 if (!rc) {
7359
7360 rc = lpfc_sli4_post_sync_mbox(phba, mboxq);
7361 if (rc != MBX_SUCCESS)
7362 lpfc_printf_log(phba, KERN_WARNING,
7363 LOG_MBOX | LOG_SLI,
7364 "(%d):2597 Sync Mailbox command "
7365 "x%x (x%x/x%x) failure: "
7366 "mqe_sta: x%x mcqe_sta: x%x/x%x "
7367 "Data: x%x x%x\n,",
7368 mboxq->vport ? mboxq->vport->vpi : 0,
7369 mboxq->u.mb.mbxCommand,
7370 lpfc_sli_config_mbox_subsys_get(phba,
7371 mboxq),
7372 lpfc_sli_config_mbox_opcode_get(phba,
7373 mboxq),
7374 bf_get(lpfc_mqe_status, &mboxq->u.mqe),
7375 bf_get(lpfc_mcqe_status, &mboxq->mcqe),
7376 bf_get(lpfc_mcqe_ext_status,
7377 &mboxq->mcqe),
7378 psli->sli_flag, flag);
7379
7380 lpfc_sli4_async_mbox_unblock(phba);
7381 }
7382 return rc;
7383 }
7384
7385
7386 rc = lpfc_mbox_cmd_check(phba, mboxq);
7387 if (rc) {
7388 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
7389 "(%d):2543 Mailbox command x%x (x%x/x%x) "
7390 "cannot issue Data: x%x x%x\n",
7391 mboxq->vport ? mboxq->vport->vpi : 0,
7392 mboxq->u.mb.mbxCommand,
7393 lpfc_sli_config_mbox_subsys_get(phba, mboxq),
7394 lpfc_sli_config_mbox_opcode_get(phba, mboxq),
7395 psli->sli_flag, flag);
7396 goto out_not_finished;
7397 }
7398
7399
7400 psli->slistat.mbox_busy++;
7401 spin_lock_irqsave(&phba->hbalock, iflags);
7402 lpfc_mbox_put(phba, mboxq);
7403 spin_unlock_irqrestore(&phba->hbalock, iflags);
7404 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
7405 "(%d):0354 Mbox cmd issue - Enqueue Data: "
7406 "x%x (x%x/x%x) x%x x%x x%x\n",
7407 mboxq->vport ? mboxq->vport->vpi : 0xffffff,
7408 bf_get(lpfc_mqe_command, &mboxq->u.mqe),
7409 lpfc_sli_config_mbox_subsys_get(phba, mboxq),
7410 lpfc_sli_config_mbox_opcode_get(phba, mboxq),
7411 phba->pport->port_state,
7412 psli->sli_flag, MBX_NOWAIT);
7413
7414 lpfc_worker_wake_up(phba);
7415
7416 return MBX_BUSY;
7417
7418out_not_finished:
7419 return MBX_NOT_FINISHED;
7420}
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430int
7431lpfc_sli4_post_async_mbox(struct lpfc_hba *phba)
7432{
7433 struct lpfc_sli *psli = &phba->sli;
7434 LPFC_MBOXQ_t *mboxq;
7435 int rc = MBX_SUCCESS;
7436 unsigned long iflags;
7437 struct lpfc_mqe *mqe;
7438 uint32_t mbx_cmnd;
7439
7440
7441 if (unlikely(!phba->sli4_hba.intr_enable))
7442 return MBX_NOT_FINISHED;
7443
7444
7445 spin_lock_irqsave(&phba->hbalock, iflags);
7446 if (unlikely(psli->sli_flag & LPFC_SLI_ASYNC_MBX_BLK)) {
7447 spin_unlock_irqrestore(&phba->hbalock, iflags);
7448 return MBX_NOT_FINISHED;
7449 }
7450 if (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE) {
7451 spin_unlock_irqrestore(&phba->hbalock, iflags);
7452 return MBX_NOT_FINISHED;
7453 }
7454 if (unlikely(phba->sli.mbox_active)) {
7455 spin_unlock_irqrestore(&phba->hbalock, iflags);
7456 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
7457 "0384 There is pending active mailbox cmd\n");
7458 return MBX_NOT_FINISHED;
7459 }
7460
7461 psli->sli_flag |= LPFC_SLI_MBOX_ACTIVE;
7462
7463
7464 mboxq = lpfc_mbox_get(phba);
7465
7466
7467 if (!mboxq) {
7468 psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
7469 spin_unlock_irqrestore(&phba->hbalock, iflags);
7470 return MBX_SUCCESS;
7471 }
7472 phba->sli.mbox_active = mboxq;
7473 spin_unlock_irqrestore(&phba->hbalock, iflags);
7474
7475
7476 rc = lpfc_mbox_dev_check(phba);
7477 if (unlikely(rc))
7478
7479 goto out_not_finished;
7480
7481
7482 mqe = &mboxq->u.mqe;
7483 mbx_cmnd = bf_get(lpfc_mqe_command, mqe);
7484
7485
7486 mod_timer(&psli->mbox_tmo, (jiffies +
7487 (HZ * lpfc_mbox_tmo_val(phba, mboxq))));
7488
7489 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
7490 "(%d):0355 Mailbox cmd x%x (x%x/x%x) issue Data: "
7491 "x%x x%x\n",
7492 mboxq->vport ? mboxq->vport->vpi : 0, mbx_cmnd,
7493 lpfc_sli_config_mbox_subsys_get(phba, mboxq),
7494 lpfc_sli_config_mbox_opcode_get(phba, mboxq),
7495 phba->pport->port_state, psli->sli_flag);
7496
7497 if (mbx_cmnd != MBX_HEARTBEAT) {
7498 if (mboxq->vport) {
7499 lpfc_debugfs_disc_trc(mboxq->vport,
7500 LPFC_DISC_TRC_MBOX_VPORT,
7501 "MBOX Send vport: cmd:x%x mb:x%x x%x",
7502 mbx_cmnd, mqe->un.mb_words[0],
7503 mqe->un.mb_words[1]);
7504 } else {
7505 lpfc_debugfs_disc_trc(phba->pport,
7506 LPFC_DISC_TRC_MBOX,
7507 "MBOX Send: cmd:x%x mb:x%x x%x",
7508 mbx_cmnd, mqe->un.mb_words[0],
7509 mqe->un.mb_words[1]);
7510 }
7511 }
7512 psli->slistat.mbox_cmd++;
7513
7514
7515 rc = lpfc_sli4_mq_put(phba->sli4_hba.mbx_wq, mqe);
7516 if (rc != MBX_SUCCESS) {
7517 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
7518 "(%d):2533 Mailbox command x%x (x%x/x%x) "
7519 "cannot issue Data: x%x x%x\n",
7520 mboxq->vport ? mboxq->vport->vpi : 0,
7521 mboxq->u.mb.mbxCommand,
7522 lpfc_sli_config_mbox_subsys_get(phba, mboxq),
7523 lpfc_sli_config_mbox_opcode_get(phba, mboxq),
7524 psli->sli_flag, MBX_NOWAIT);
7525 goto out_not_finished;
7526 }
7527
7528 return rc;
7529
7530out_not_finished:
7531 spin_lock_irqsave(&phba->hbalock, iflags);
7532 if (phba->sli.mbox_active) {
7533 mboxq->u.mb.mbxStatus = MBX_NOT_FINISHED;
7534 __lpfc_mbox_cmpl_put(phba, mboxq);
7535
7536 psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
7537 phba->sli.mbox_active = NULL;
7538 }
7539 spin_unlock_irqrestore(&phba->hbalock, iflags);
7540
7541 return MBX_NOT_FINISHED;
7542}
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556int
7557lpfc_sli_issue_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, uint32_t flag)
7558{
7559 return phba->lpfc_sli_issue_mbox(phba, pmbox, flag);
7560}
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571int
7572lpfc_mbox_api_table_setup(struct lpfc_hba *phba, uint8_t dev_grp)
7573{
7574
7575 switch (dev_grp) {
7576 case LPFC_PCI_DEV_LP:
7577 phba->lpfc_sli_issue_mbox = lpfc_sli_issue_mbox_s3;
7578 phba->lpfc_sli_handle_slow_ring_event =
7579 lpfc_sli_handle_slow_ring_event_s3;
7580 phba->lpfc_sli_hbq_to_firmware = lpfc_sli_hbq_to_firmware_s3;
7581 phba->lpfc_sli_brdrestart = lpfc_sli_brdrestart_s3;
7582 phba->lpfc_sli_brdready = lpfc_sli_brdready_s3;
7583 break;
7584 case LPFC_PCI_DEV_OC:
7585 phba->lpfc_sli_issue_mbox = lpfc_sli_issue_mbox_s4;
7586 phba->lpfc_sli_handle_slow_ring_event =
7587 lpfc_sli_handle_slow_ring_event_s4;
7588 phba->lpfc_sli_hbq_to_firmware = lpfc_sli_hbq_to_firmware_s4;
7589 phba->lpfc_sli_brdrestart = lpfc_sli_brdrestart_s4;
7590 phba->lpfc_sli_brdready = lpfc_sli_brdready_s4;
7591 break;
7592 default:
7593 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
7594 "1420 Invalid HBA PCI-device group: 0x%x\n",
7595 dev_grp);
7596 return -ENODEV;
7597 break;
7598 }
7599 return 0;
7600}
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612void
7613__lpfc_sli_ringtx_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
7614 struct lpfc_iocbq *piocb)
7615{
7616
7617 list_add_tail(&piocb->list, &pring->txq);
7618 pring->txq_cnt++;
7619}
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638static struct lpfc_iocbq *
7639lpfc_sli_next_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
7640 struct lpfc_iocbq **piocb)
7641{
7642 struct lpfc_iocbq * nextiocb;
7643
7644 nextiocb = lpfc_sli_ringtx_get(phba, pring);
7645 if (!nextiocb) {
7646 nextiocb = *piocb;
7647 *piocb = NULL;
7648 }
7649
7650 return nextiocb;
7651}
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675static int
7676__lpfc_sli_issue_iocb_s3(struct lpfc_hba *phba, uint32_t ring_number,
7677 struct lpfc_iocbq *piocb, uint32_t flag)
7678{
7679 struct lpfc_iocbq *nextiocb;
7680 IOCB_t *iocb;
7681 struct lpfc_sli_ring *pring = &phba->sli.ring[ring_number];
7682
7683 if (piocb->iocb_cmpl && (!piocb->vport) &&
7684 (piocb->iocb.ulpCommand != CMD_ABORT_XRI_CN) &&
7685 (piocb->iocb.ulpCommand != CMD_CLOSE_XRI_CN)) {
7686 lpfc_printf_log(phba, KERN_ERR,
7687 LOG_SLI | LOG_VPORT,
7688 "1807 IOCB x%x failed. No vport\n",
7689 piocb->iocb.ulpCommand);
7690 dump_stack();
7691 return IOCB_ERROR;
7692 }
7693
7694
7695
7696 if (unlikely(pci_channel_offline(phba->pcidev)))
7697 return IOCB_ERROR;
7698
7699
7700 if (unlikely(phba->hba_flag & DEFER_ERATT))
7701 return IOCB_ERROR;
7702
7703
7704
7705
7706 if (unlikely(phba->link_state < LPFC_LINK_DOWN))
7707 return IOCB_ERROR;
7708
7709
7710
7711
7712
7713 if (unlikely(pring->flag & LPFC_STOP_IOCB_EVENT))
7714 goto iocb_busy;
7715
7716 if (unlikely(phba->link_state == LPFC_LINK_DOWN)) {
7717
7718
7719
7720
7721 switch (piocb->iocb.ulpCommand) {
7722 case CMD_GEN_REQUEST64_CR:
7723 case CMD_GEN_REQUEST64_CX:
7724 if (!(phba->sli.sli_flag & LPFC_MENLO_MAINT) ||
7725 (piocb->iocb.un.genreq64.w5.hcsw.Rctl !=
7726 FC_RCTL_DD_UNSOL_CMD) ||
7727 (piocb->iocb.un.genreq64.w5.hcsw.Type !=
7728 MENLO_TRANSPORT_TYPE))
7729
7730 goto iocb_busy;
7731 break;
7732 case CMD_QUE_RING_BUF_CN:
7733 case CMD_QUE_RING_BUF64_CN:
7734
7735
7736
7737
7738 if (piocb->iocb_cmpl)
7739 piocb->iocb_cmpl = NULL;
7740
7741 case CMD_CREATE_XRI_CR:
7742 case CMD_CLOSE_XRI_CN:
7743 case CMD_CLOSE_XRI_CX:
7744 break;
7745 default:
7746 goto iocb_busy;
7747 }
7748
7749
7750
7751
7752
7753 } else if (unlikely(pring->ringno == phba->sli.fcp_ring &&
7754 !(phba->sli.sli_flag & LPFC_PROCESS_LA))) {
7755 goto iocb_busy;
7756 }
7757
7758 while ((iocb = lpfc_sli_next_iocb_slot(phba, pring)) &&
7759 (nextiocb = lpfc_sli_next_iocb(phba, pring, &piocb)))
7760 lpfc_sli_submit_iocb(phba, pring, iocb, nextiocb);
7761
7762 if (iocb)
7763 lpfc_sli_update_ring(phba, pring);
7764 else
7765 lpfc_sli_update_full_ring(phba, pring);
7766
7767 if (!piocb)
7768 return IOCB_SUCCESS;
7769
7770 goto out_busy;
7771
7772 iocb_busy:
7773 pring->stats.iocb_cmd_delay++;
7774
7775 out_busy:
7776
7777 if (!(flag & SLI_IOCB_RET_IOCB)) {
7778 __lpfc_sli_ringtx_put(phba, pring, piocb);
7779 return IOCB_SUCCESS;
7780 }
7781
7782 return IOCB_BUSY;
7783}
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802static uint16_t
7803lpfc_sli4_bpl2sgl(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
7804 struct lpfc_sglq *sglq)
7805{
7806 uint16_t xritag = NO_XRI;
7807 struct ulp_bde64 *bpl = NULL;
7808 struct ulp_bde64 bde;
7809 struct sli4_sge *sgl = NULL;
7810 struct lpfc_dmabuf *dmabuf;
7811 IOCB_t *icmd;
7812 int numBdes = 0;
7813 int i = 0;
7814 uint32_t offset = 0;
7815 int inbound = 0;
7816
7817 if (!piocbq || !sglq)
7818 return xritag;
7819
7820 sgl = (struct sli4_sge *)sglq->sgl;
7821 icmd = &piocbq->iocb;
7822 if (icmd->ulpCommand == CMD_XMIT_BLS_RSP64_CX)
7823 return sglq->sli4_xritag;
7824 if (icmd->un.genreq64.bdl.bdeFlags == BUFF_TYPE_BLP_64) {
7825 numBdes = icmd->un.genreq64.bdl.bdeSize /
7826 sizeof(struct ulp_bde64);
7827
7828
7829
7830
7831 if (piocbq->context3)
7832 dmabuf = (struct lpfc_dmabuf *)piocbq->context3;
7833 else
7834 return xritag;
7835
7836 bpl = (struct ulp_bde64 *)dmabuf->virt;
7837 if (!bpl)
7838 return xritag;
7839
7840 for (i = 0; i < numBdes; i++) {
7841
7842 sgl->addr_hi = bpl->addrHigh;
7843 sgl->addr_lo = bpl->addrLow;
7844
7845 sgl->word2 = le32_to_cpu(sgl->word2);
7846 if ((i+1) == numBdes)
7847 bf_set(lpfc_sli4_sge_last, sgl, 1);
7848 else
7849 bf_set(lpfc_sli4_sge_last, sgl, 0);
7850
7851
7852
7853 bde.tus.w = le32_to_cpu(bpl->tus.w);
7854 sgl->sge_len = cpu_to_le32(bde.tus.f.bdeSize);
7855
7856
7857
7858
7859 if (piocbq->iocb.ulpCommand == CMD_GEN_REQUEST64_CR) {
7860
7861 if (bpl->tus.f.bdeFlags == BUFF_TYPE_BDE_64I)
7862 inbound++;
7863
7864 if (inbound == 1)
7865 offset = 0;
7866 bf_set(lpfc_sli4_sge_offset, sgl, offset);
7867 bf_set(lpfc_sli4_sge_type, sgl,
7868 LPFC_SGE_TYPE_DATA);
7869 offset += bde.tus.f.bdeSize;
7870 }
7871 sgl->word2 = cpu_to_le32(sgl->word2);
7872 bpl++;
7873 sgl++;
7874 }
7875 } else if (icmd->un.genreq64.bdl.bdeFlags == BUFF_TYPE_BDE_64) {
7876
7877
7878
7879
7880 sgl->addr_hi =
7881 cpu_to_le32(icmd->un.genreq64.bdl.addrHigh);
7882 sgl->addr_lo =
7883 cpu_to_le32(icmd->un.genreq64.bdl.addrLow);
7884 sgl->word2 = le32_to_cpu(sgl->word2);
7885 bf_set(lpfc_sli4_sge_last, sgl, 1);
7886 sgl->word2 = cpu_to_le32(sgl->word2);
7887 sgl->sge_len =
7888 cpu_to_le32(icmd->un.genreq64.bdl.bdeSize);
7889 }
7890 return sglq->sli4_xritag;
7891}
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903static inline uint32_t
7904lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba)
7905{
7906 int i;
7907
7908 if (phba->cfg_fcp_io_sched == LPFC_FCP_SCHED_BY_CPU)
7909 i = smp_processor_id();
7910 else
7911 i = atomic_add_return(1, &phba->fcp_qidx);
7912
7913 i = (i % phba->cfg_fcp_io_channel);
7914 return i;
7915}
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931static int
7932lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
7933 union lpfc_wqe *wqe)
7934{
7935 uint32_t xmit_len = 0, total_len = 0;
7936 uint8_t ct = 0;
7937 uint32_t fip;
7938 uint32_t abort_tag;
7939 uint8_t command_type = ELS_COMMAND_NON_FIP;
7940 uint8_t cmnd;
7941 uint16_t xritag;
7942 uint16_t abrt_iotag;
7943 struct lpfc_iocbq *abrtiocbq;
7944 struct ulp_bde64 *bpl = NULL;
7945 uint32_t els_id = LPFC_ELS_ID_DEFAULT;
7946 int numBdes, i;
7947 struct ulp_bde64 bde;
7948 struct lpfc_nodelist *ndlp;
7949 uint32_t *pcmd;
7950 uint32_t if_type;
7951
7952 fip = phba->hba_flag & HBA_FIP_SUPPORT;
7953
7954 if (iocbq->iocb_flag & LPFC_IO_FCP)
7955 command_type = FCP_COMMAND;
7956 else if (fip && (iocbq->iocb_flag & LPFC_FIP_ELS_ID_MASK))
7957 command_type = ELS_COMMAND_FIP;
7958 else
7959 command_type = ELS_COMMAND_NON_FIP;
7960
7961
7962 memcpy(wqe, &iocbq->iocb, sizeof(union lpfc_wqe));
7963 abort_tag = (uint32_t) iocbq->iotag;
7964 xritag = iocbq->sli4_xritag;
7965 wqe->generic.wqe_com.word7 = 0;
7966
7967 if (iocbq->iocb.un.genreq64.bdl.bdeFlags == BUFF_TYPE_BLP_64) {
7968 numBdes = iocbq->iocb.un.genreq64.bdl.bdeSize /
7969 sizeof(struct ulp_bde64);
7970 bpl = (struct ulp_bde64 *)
7971 ((struct lpfc_dmabuf *)iocbq->context3)->virt;
7972 if (!bpl)
7973 return IOCB_ERROR;
7974
7975
7976 wqe->generic.bde.addrHigh = le32_to_cpu(bpl->addrHigh);
7977 wqe->generic.bde.addrLow = le32_to_cpu(bpl->addrLow);
7978
7979
7980
7981 wqe->generic.bde.tus.w = le32_to_cpu(bpl->tus.w);
7982 xmit_len = wqe->generic.bde.tus.f.bdeSize;
7983 total_len = 0;
7984 for (i = 0; i < numBdes; i++) {
7985 bde.tus.w = le32_to_cpu(bpl[i].tus.w);
7986 total_len += bde.tus.f.bdeSize;
7987 }
7988 } else
7989 xmit_len = iocbq->iocb.un.fcpi64.bdl.bdeSize;
7990
7991 iocbq->iocb.ulpIoTag = iocbq->iotag;
7992 cmnd = iocbq->iocb.ulpCommand;
7993
7994 switch (iocbq->iocb.ulpCommand) {
7995 case CMD_ELS_REQUEST64_CR:
7996 if (iocbq->iocb_flag & LPFC_IO_LIBDFC)
7997 ndlp = iocbq->context_un.ndlp;
7998 else
7999 ndlp = (struct lpfc_nodelist *)iocbq->context1;
8000 if (!iocbq->iocb.ulpLe) {
8001 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
8002 "2007 Only Limited Edition cmd Format"
8003 " supported 0x%x\n",
8004 iocbq->iocb.ulpCommand);
8005 return IOCB_ERROR;
8006 }
8007
8008 wqe->els_req.payload_len = xmit_len;
8009
8010 bf_set(wqe_tmo, &wqe->els_req.wqe_com,
8011 iocbq->iocb.ulpTimeout);
8012
8013 bf_set(els_req64_vf, &wqe->els_req, 0);
8014
8015 bf_set(els_req64_vfid, &wqe->els_req, 0);
8016 ct = ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l);
8017 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com,
8018 iocbq->iocb.ulpContext);
8019 bf_set(wqe_ct, &wqe->els_req.wqe_com, ct);
8020 bf_set(wqe_pu, &wqe->els_req.wqe_com, 0);
8021
8022 if (command_type == ELS_COMMAND_FIP)
8023 els_id = ((iocbq->iocb_flag & LPFC_FIP_ELS_ID_MASK)
8024 >> LPFC_FIP_ELS_ID_SHIFT);
8025 pcmd = (uint32_t *) (((struct lpfc_dmabuf *)
8026 iocbq->context2)->virt);
8027 if_type = bf_get(lpfc_sli_intf_if_type,
8028 &phba->sli4_hba.sli_intf);
8029 if (if_type == LPFC_SLI_INTF_IF_TYPE_2) {
8030 if (pcmd && (*pcmd == ELS_CMD_FLOGI ||
8031 *pcmd == ELS_CMD_SCR ||
8032 *pcmd == ELS_CMD_FDISC ||
8033 *pcmd == ELS_CMD_LOGO ||
8034 *pcmd == ELS_CMD_PLOGI)) {
8035 bf_set(els_req64_sp, &wqe->els_req, 1);
8036 bf_set(els_req64_sid, &wqe->els_req,
8037 iocbq->vport->fc_myDID);
8038 if ((*pcmd == ELS_CMD_FLOGI) &&
8039 !(phba->fc_topology ==
8040 LPFC_TOPOLOGY_LOOP))
8041 bf_set(els_req64_sid, &wqe->els_req, 0);
8042 bf_set(wqe_ct, &wqe->els_req.wqe_com, 1);
8043 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com,
8044 phba->vpi_ids[iocbq->vport->vpi]);
8045 } else if (pcmd && iocbq->context1) {
8046 bf_set(wqe_ct, &wqe->els_req.wqe_com, 0);
8047 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com,
8048 phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]);
8049 }
8050 }
8051 bf_set(wqe_temp_rpi, &wqe->els_req.wqe_com,
8052 phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]);
8053 bf_set(wqe_els_id, &wqe->els_req.wqe_com, els_id);
8054 bf_set(wqe_dbde, &wqe->els_req.wqe_com, 1);
8055 bf_set(wqe_iod, &wqe->els_req.wqe_com, LPFC_WQE_IOD_READ);
8056 bf_set(wqe_qosd, &wqe->els_req.wqe_com, 1);
8057 bf_set(wqe_lenloc, &wqe->els_req.wqe_com, LPFC_WQE_LENLOC_NONE);
8058 bf_set(wqe_ebde_cnt, &wqe->els_req.wqe_com, 0);
8059 break;
8060 case CMD_XMIT_SEQUENCE64_CX:
8061 bf_set(wqe_ctxt_tag, &wqe->xmit_sequence.wqe_com,
8062 iocbq->iocb.un.ulpWord[3]);
8063 bf_set(wqe_rcvoxid, &wqe->xmit_sequence.wqe_com,
8064 iocbq->iocb.unsli3.rcvsli3.ox_id);
8065
8066 xmit_len = total_len;
8067 cmnd = CMD_XMIT_SEQUENCE64_CR;
8068 if (phba->link_flag & LS_LOOPBACK_MODE)
8069 bf_set(wqe_xo, &wqe->xmit_sequence.wge_ctl, 1);
8070 case CMD_XMIT_SEQUENCE64_CR:
8071
8072 wqe->xmit_sequence.rsvd3 = 0;
8073
8074
8075 bf_set(wqe_pu, &wqe->xmit_sequence.wqe_com, 0);
8076 bf_set(wqe_dbde, &wqe->xmit_sequence.wqe_com, 1);
8077 bf_set(wqe_iod, &wqe->xmit_sequence.wqe_com,
8078 LPFC_WQE_IOD_WRITE);
8079 bf_set(wqe_lenloc, &wqe->xmit_sequence.wqe_com,
8080 LPFC_WQE_LENLOC_WORD12);
8081 bf_set(wqe_ebde_cnt, &wqe->xmit_sequence.wqe_com, 0);
8082 wqe->xmit_sequence.xmit_len = xmit_len;
8083 command_type = OTHER_COMMAND;
8084 break;
8085 case CMD_XMIT_BCAST64_CN:
8086
8087 wqe->xmit_bcast64.seq_payload_len = xmit_len;
8088
8089
8090
8091 bf_set(wqe_ct, &wqe->xmit_bcast64.wqe_com,
8092 ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l));
8093 bf_set(wqe_dbde, &wqe->xmit_bcast64.wqe_com, 1);
8094 bf_set(wqe_iod, &wqe->xmit_bcast64.wqe_com, LPFC_WQE_IOD_WRITE);
8095 bf_set(wqe_lenloc, &wqe->xmit_bcast64.wqe_com,
8096 LPFC_WQE_LENLOC_WORD3);
8097 bf_set(wqe_ebde_cnt, &wqe->xmit_bcast64.wqe_com, 0);
8098 break;
8099 case CMD_FCP_IWRITE64_CR:
8100 command_type = FCP_COMMAND_DATA_OUT;
8101
8102
8103 wqe->fcp_iwrite.payload_offset_len =
8104 xmit_len + sizeof(struct fcp_rsp);
8105
8106
8107 bf_set(wqe_erp, &wqe->fcp_iwrite.wqe_com,
8108 iocbq->iocb.ulpFCP2Rcvy);
8109 bf_set(wqe_lnk, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpXS);
8110
8111 bf_set(wqe_xc, &wqe->fcp_iwrite.wqe_com, 0);
8112 bf_set(wqe_iod, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_IOD_WRITE);
8113 bf_set(wqe_lenloc, &wqe->fcp_iwrite.wqe_com,
8114 LPFC_WQE_LENLOC_WORD4);
8115 bf_set(wqe_ebde_cnt, &wqe->fcp_iwrite.wqe_com, 0);
8116 bf_set(wqe_pu, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpPU);
8117 bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 1);
8118 break;
8119 case CMD_FCP_IREAD64_CR:
8120
8121
8122 wqe->fcp_iread.payload_offset_len =
8123 xmit_len + sizeof(struct fcp_rsp);
8124
8125
8126 bf_set(wqe_erp, &wqe->fcp_iread.wqe_com,
8127 iocbq->iocb.ulpFCP2Rcvy);
8128 bf_set(wqe_lnk, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpXS);
8129
8130 bf_set(wqe_xc, &wqe->fcp_iread.wqe_com, 0);
8131 bf_set(wqe_iod, &wqe->fcp_iread.wqe_com, LPFC_WQE_IOD_READ);
8132 bf_set(wqe_lenloc, &wqe->fcp_iread.wqe_com,
8133 LPFC_WQE_LENLOC_WORD4);
8134 bf_set(wqe_ebde_cnt, &wqe->fcp_iread.wqe_com, 0);
8135 bf_set(wqe_pu, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpPU);
8136 bf_set(wqe_dbde, &wqe->fcp_iread.wqe_com, 1);
8137 break;
8138 case CMD_FCP_ICMND64_CR:
8139
8140 wqe->fcp_icmd.rsrvd3 = 0;
8141 bf_set(wqe_pu, &wqe->fcp_icmd.wqe_com, 0);
8142
8143 bf_set(wqe_xc, &wqe->fcp_icmd.wqe_com, 0);
8144 bf_set(wqe_dbde, &wqe->fcp_icmd.wqe_com, 1);
8145 bf_set(wqe_iod, &wqe->fcp_icmd.wqe_com, LPFC_WQE_IOD_WRITE);
8146 bf_set(wqe_qosd, &wqe->fcp_icmd.wqe_com, 1);
8147 bf_set(wqe_lenloc, &wqe->fcp_icmd.wqe_com,
8148 LPFC_WQE_LENLOC_NONE);
8149 bf_set(wqe_ebde_cnt, &wqe->fcp_icmd.wqe_com, 0);
8150 bf_set(wqe_erp, &wqe->fcp_icmd.wqe_com,
8151 iocbq->iocb.ulpFCP2Rcvy);
8152 break;
8153 case CMD_GEN_REQUEST64_CR:
8154
8155
8156
8157 xmit_len = 0;
8158 numBdes = iocbq->iocb.un.genreq64.bdl.bdeSize /
8159 sizeof(struct ulp_bde64);
8160 for (i = 0; i < numBdes; i++) {
8161 bde.tus.w = le32_to_cpu(bpl[i].tus.w);
8162 if (bde.tus.f.bdeFlags != BUFF_TYPE_BDE_64)
8163 break;
8164 xmit_len += bde.tus.f.bdeSize;
8165 }
8166
8167 wqe->gen_req.request_payload_len = xmit_len;
8168
8169
8170
8171 if (iocbq->iocb.ulpCt_h || iocbq->iocb.ulpCt_l) {
8172 ct = ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l);
8173 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
8174 "2015 Invalid CT %x command 0x%x\n",
8175 ct, iocbq->iocb.ulpCommand);
8176 return IOCB_ERROR;
8177 }
8178 bf_set(wqe_ct, &wqe->gen_req.wqe_com, 0);
8179 bf_set(wqe_tmo, &wqe->gen_req.wqe_com, iocbq->iocb.ulpTimeout);
8180 bf_set(wqe_pu, &wqe->gen_req.wqe_com, iocbq->iocb.ulpPU);
8181 bf_set(wqe_dbde, &wqe->gen_req.wqe_com, 1);
8182 bf_set(wqe_iod, &wqe->gen_req.wqe_com, LPFC_WQE_IOD_READ);
8183 bf_set(wqe_qosd, &wqe->gen_req.wqe_com, 1);
8184 bf_set(wqe_lenloc, &wqe->gen_req.wqe_com, LPFC_WQE_LENLOC_NONE);
8185 bf_set(wqe_ebde_cnt, &wqe->gen_req.wqe_com, 0);
8186 command_type = OTHER_COMMAND;
8187 break;
8188 case CMD_XMIT_ELS_RSP64_CX:
8189 ndlp = (struct lpfc_nodelist *)iocbq->context1;
8190
8191
8192 wqe->xmit_els_rsp.response_payload_len = xmit_len;
8193
8194 wqe->xmit_els_rsp.word4 = 0;
8195
8196 bf_set(wqe_els_did, &wqe->xmit_els_rsp.wqe_dest,
8197 iocbq->iocb.un.xseq64.xmit_els_remoteID);
8198
8199 if_type = bf_get(lpfc_sli_intf_if_type,
8200 &phba->sli4_hba.sli_intf);
8201 if (if_type == LPFC_SLI_INTF_IF_TYPE_2) {
8202 if (iocbq->vport->fc_flag & FC_PT2PT) {
8203 bf_set(els_rsp64_sp, &wqe->xmit_els_rsp, 1);
8204 bf_set(els_rsp64_sid, &wqe->xmit_els_rsp,
8205 iocbq->vport->fc_myDID);
8206 if (iocbq->vport->fc_myDID == Fabric_DID) {
8207 bf_set(wqe_els_did,
8208 &wqe->xmit_els_rsp.wqe_dest, 0);
8209 }
8210 }
8211 }
8212 bf_set(wqe_ct, &wqe->xmit_els_rsp.wqe_com,
8213 ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l));
8214 bf_set(wqe_pu, &wqe->xmit_els_rsp.wqe_com, iocbq->iocb.ulpPU);
8215 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
8216 iocbq->iocb.unsli3.rcvsli3.ox_id);
8217 if (!iocbq->iocb.ulpCt_h && iocbq->iocb.ulpCt_l)
8218 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
8219 phba->vpi_ids[iocbq->vport->vpi]);
8220 bf_set(wqe_dbde, &wqe->xmit_els_rsp.wqe_com, 1);
8221 bf_set(wqe_iod, &wqe->xmit_els_rsp.wqe_com, LPFC_WQE_IOD_WRITE);
8222 bf_set(wqe_qosd, &wqe->xmit_els_rsp.wqe_com, 1);
8223 bf_set(wqe_lenloc, &wqe->xmit_els_rsp.wqe_com,
8224 LPFC_WQE_LENLOC_WORD3);
8225 bf_set(wqe_ebde_cnt, &wqe->xmit_els_rsp.wqe_com, 0);
8226 bf_set(wqe_rsp_temp_rpi, &wqe->xmit_els_rsp,
8227 phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]);
8228 pcmd = (uint32_t *) (((struct lpfc_dmabuf *)
8229 iocbq->context2)->virt);
8230 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
8231 bf_set(els_rsp64_sp, &wqe->xmit_els_rsp, 1);
8232 bf_set(els_rsp64_sid, &wqe->xmit_els_rsp,
8233 iocbq->vport->fc_myDID);
8234 bf_set(wqe_ct, &wqe->xmit_els_rsp.wqe_com, 1);
8235 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
8236 phba->vpi_ids[phba->pport->vpi]);
8237 }
8238 command_type = OTHER_COMMAND;
8239 break;
8240 case CMD_CLOSE_XRI_CN:
8241 case CMD_ABORT_XRI_CN:
8242 case CMD_ABORT_XRI_CX:
8243
8244
8245 abrt_iotag = iocbq->iocb.un.acxri.abortContextTag;
8246 if (abrt_iotag != 0 && abrt_iotag <= phba->sli.last_iotag) {
8247 abrtiocbq = phba->sli.iocbq_lookup[abrt_iotag];
8248 fip = abrtiocbq->iocb_flag & LPFC_FIP_ELS_ID_MASK;
8249 } else
8250 fip = 0;
8251
8252 if ((iocbq->iocb.ulpCommand == CMD_CLOSE_XRI_CN) || fip)
8253
8254
8255
8256
8257
8258 bf_set(abort_cmd_ia, &wqe->abort_cmd, 1);
8259 else
8260 bf_set(abort_cmd_ia, &wqe->abort_cmd, 0);
8261 bf_set(abort_cmd_criteria, &wqe->abort_cmd, T_XRI_TAG);
8262
8263 wqe->abort_cmd.rsrvd5 = 0;
8264 bf_set(wqe_ct, &wqe->abort_cmd.wqe_com,
8265 ((iocbq->iocb.ulpCt_h << 1) | iocbq->iocb.ulpCt_l));
8266 abort_tag = iocbq->iocb.un.acxri.abortIoTag;
8267
8268
8269
8270
8271 bf_set(wqe_cmnd, &wqe->abort_cmd.wqe_com, CMD_ABORT_XRI_CX);
8272 bf_set(wqe_qosd, &wqe->abort_cmd.wqe_com, 1);
8273 bf_set(wqe_lenloc, &wqe->abort_cmd.wqe_com,
8274 LPFC_WQE_LENLOC_NONE);
8275 cmnd = CMD_ABORT_XRI_CX;
8276 command_type = OTHER_COMMAND;
8277 xritag = 0;
8278 break;
8279 case CMD_XMIT_BLS_RSP64_CX:
8280 ndlp = (struct lpfc_nodelist *)iocbq->context1;
8281
8282
8283
8284
8285 memset(wqe, 0, sizeof(union lpfc_wqe));
8286
8287 bf_set(xmit_bls_rsp64_oxid, &wqe->xmit_bls_rsp,
8288 bf_get(lpfc_abts_oxid, &iocbq->iocb.un.bls_rsp));
8289 if (bf_get(lpfc_abts_orig, &iocbq->iocb.un.bls_rsp) ==
8290 LPFC_ABTS_UNSOL_INT) {
8291
8292
8293
8294
8295 bf_set(xmit_bls_rsp64_rxid, &wqe->xmit_bls_rsp,
8296 iocbq->sli4_xritag);
8297 } else {
8298
8299
8300
8301
8302 bf_set(xmit_bls_rsp64_rxid, &wqe->xmit_bls_rsp,
8303 bf_get(lpfc_abts_rxid, &iocbq->iocb.un.bls_rsp));
8304 }
8305 bf_set(xmit_bls_rsp64_seqcnthi, &wqe->xmit_bls_rsp, 0xffff);
8306 bf_set(wqe_xmit_bls_pt, &wqe->xmit_bls_rsp.wqe_dest, 0x1);
8307
8308
8309 bf_set(wqe_els_did, &wqe->xmit_bls_rsp.wqe_dest,
8310 ndlp->nlp_DID);
8311 bf_set(xmit_bls_rsp64_temprpi, &wqe->xmit_bls_rsp,
8312 iocbq->iocb.ulpContext);
8313 bf_set(wqe_ct, &wqe->xmit_bls_rsp.wqe_com, 1);
8314 bf_set(wqe_ctxt_tag, &wqe->xmit_bls_rsp.wqe_com,
8315 phba->vpi_ids[phba->pport->vpi]);
8316 bf_set(wqe_qosd, &wqe->xmit_bls_rsp.wqe_com, 1);
8317 bf_set(wqe_lenloc, &wqe->xmit_bls_rsp.wqe_com,
8318 LPFC_WQE_LENLOC_NONE);
8319
8320 command_type = OTHER_COMMAND;
8321 if (iocbq->iocb.un.xseq64.w5.hcsw.Rctl == FC_RCTL_BA_RJT) {
8322 bf_set(xmit_bls_rsp64_rjt_vspec, &wqe->xmit_bls_rsp,
8323 bf_get(lpfc_vndr_code, &iocbq->iocb.un.bls_rsp));
8324 bf_set(xmit_bls_rsp64_rjt_expc, &wqe->xmit_bls_rsp,
8325 bf_get(lpfc_rsn_expln, &iocbq->iocb.un.bls_rsp));
8326 bf_set(xmit_bls_rsp64_rjt_rsnc, &wqe->xmit_bls_rsp,
8327 bf_get(lpfc_rsn_code, &iocbq->iocb.un.bls_rsp));
8328 }
8329
8330 break;
8331 case CMD_XRI_ABORTED_CX:
8332 case CMD_CREATE_XRI_CR:
8333 case CMD_IOCB_FCP_IBIDIR64_CR:
8334 case CMD_FCP_TSEND64_CX:
8335 case CMD_FCP_TRSP64_CX:
8336 case CMD_FCP_AUTO_TRSP_CX:
8337 default:
8338 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
8339 "2014 Invalid command 0x%x\n",
8340 iocbq->iocb.ulpCommand);
8341 return IOCB_ERROR;
8342 break;
8343 }
8344
8345 if (iocbq->iocb_flag & LPFC_IO_DIF_PASS)
8346 bf_set(wqe_dif, &wqe->generic.wqe_com, LPFC_WQE_DIF_PASSTHRU);
8347 else if (iocbq->iocb_flag & LPFC_IO_DIF_STRIP)
8348 bf_set(wqe_dif, &wqe->generic.wqe_com, LPFC_WQE_DIF_STRIP);
8349 else if (iocbq->iocb_flag & LPFC_IO_DIF_INSERT)
8350 bf_set(wqe_dif, &wqe->generic.wqe_com, LPFC_WQE_DIF_INSERT);
8351 iocbq->iocb_flag &= ~(LPFC_IO_DIF_PASS | LPFC_IO_DIF_STRIP |
8352 LPFC_IO_DIF_INSERT);
8353 bf_set(wqe_xri_tag, &wqe->generic.wqe_com, xritag);
8354 bf_set(wqe_reqtag, &wqe->generic.wqe_com, iocbq->iotag);
8355 wqe->generic.wqe_com.abort_tag = abort_tag;
8356 bf_set(wqe_cmd_type, &wqe->generic.wqe_com, command_type);
8357 bf_set(wqe_cmnd, &wqe->generic.wqe_com, cmnd);
8358 bf_set(wqe_class, &wqe->generic.wqe_com, iocbq->iocb.ulpClass);
8359 bf_set(wqe_cqid, &wqe->generic.wqe_com, LPFC_WQE_CQ_ID_DEFAULT);
8360 return 0;
8361}
8362
8363
8364
8365
8366
8367
8368
8369
8370
8371
8372
8373
8374
8375
8376
8377static int
8378__lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t ring_number,
8379 struct lpfc_iocbq *piocb, uint32_t flag)
8380{
8381 struct lpfc_sglq *sglq;
8382 union lpfc_wqe wqe;
8383 struct lpfc_sli_ring *pring = &phba->sli.ring[ring_number];
8384
8385 if (piocb->sli4_xritag == NO_XRI) {
8386 if (piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN ||
8387 piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN)
8388 sglq = NULL;
8389 else {
8390 if (pring->txq_cnt) {
8391 if (!(flag & SLI_IOCB_RET_IOCB)) {
8392 __lpfc_sli_ringtx_put(phba,
8393 pring, piocb);
8394 return IOCB_SUCCESS;
8395 } else {
8396 return IOCB_BUSY;
8397 }
8398 } else {
8399 sglq = __lpfc_sli_get_sglq(phba, piocb);
8400 if (!sglq) {
8401 if (!(flag & SLI_IOCB_RET_IOCB)) {
8402 __lpfc_sli_ringtx_put(phba,
8403 pring,
8404 piocb);
8405 return IOCB_SUCCESS;
8406 } else
8407 return IOCB_BUSY;
8408 }
8409 }
8410 }
8411 } else if (piocb->iocb_flag & LPFC_IO_FCP) {
8412
8413 sglq = NULL;
8414 } else {
8415
8416
8417
8418
8419 sglq = __lpfc_get_active_sglq(phba, piocb->sli4_lxritag);
8420 if (!sglq)
8421 return IOCB_ERROR;
8422 }
8423
8424 if (sglq) {
8425 piocb->sli4_lxritag = sglq->sli4_lxritag;
8426 piocb->sli4_xritag = sglq->sli4_xritag;
8427 if (NO_XRI == lpfc_sli4_bpl2sgl(phba, piocb, sglq))
8428 return IOCB_ERROR;
8429 }
8430
8431 if (lpfc_sli4_iocb2wqe(phba, piocb, &wqe))
8432 return IOCB_ERROR;
8433
8434 if ((piocb->iocb_flag & LPFC_IO_FCP) ||
8435 (piocb->iocb_flag & LPFC_USE_FCPWQIDX)) {
8436 if (lpfc_sli4_wq_put(phba->sli4_hba.fcp_wq[piocb->fcp_wqidx],
8437 &wqe))
8438 return IOCB_ERROR;
8439 } else {
8440 if (lpfc_sli4_wq_put(phba->sli4_hba.els_wq, &wqe))
8441 return IOCB_ERROR;
8442 }
8443 lpfc_sli_ringtxcmpl_put(phba, pring, piocb);
8444
8445 return 0;
8446}
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459int
8460__lpfc_sli_issue_iocb(struct lpfc_hba *phba, uint32_t ring_number,
8461 struct lpfc_iocbq *piocb, uint32_t flag)
8462{
8463 return phba->__lpfc_sli_issue_iocb(phba, ring_number, piocb, flag);
8464}
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475int
8476lpfc_sli_api_table_setup(struct lpfc_hba *phba, uint8_t dev_grp)
8477{
8478
8479 switch (dev_grp) {
8480 case LPFC_PCI_DEV_LP:
8481 phba->__lpfc_sli_issue_iocb = __lpfc_sli_issue_iocb_s3;
8482 phba->__lpfc_sli_release_iocbq = __lpfc_sli_release_iocbq_s3;
8483 break;
8484 case LPFC_PCI_DEV_OC:
8485 phba->__lpfc_sli_issue_iocb = __lpfc_sli_issue_iocb_s4;
8486 phba->__lpfc_sli_release_iocbq = __lpfc_sli_release_iocbq_s4;
8487 break;
8488 default:
8489 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
8490 "1419 Invalid HBA PCI-device group: 0x%x\n",
8491 dev_grp);
8492 return -ENODEV;
8493 break;
8494 }
8495 phba->lpfc_get_iocb_from_iocbq = lpfc_get_iocb_from_iocbq;
8496 return 0;
8497}
8498
8499
8500
8501
8502
8503
8504
8505
8506
8507
8508
8509
8510
8511
8512int
8513lpfc_sli_issue_iocb(struct lpfc_hba *phba, uint32_t ring_number,
8514 struct lpfc_iocbq *piocb, uint32_t flag)
8515{
8516 struct lpfc_fcp_eq_hdl *fcp_eq_hdl;
8517 struct lpfc_sli_ring *pring;
8518 struct lpfc_queue *fpeq;
8519 struct lpfc_eqe *eqe;
8520 unsigned long iflags;
8521 int rc, idx;
8522
8523 if (phba->sli_rev == LPFC_SLI_REV4) {
8524 if (piocb->iocb_flag & LPFC_IO_FCP) {
8525 if (unlikely(!phba->sli4_hba.fcp_wq))
8526 return IOCB_ERROR;
8527 idx = lpfc_sli4_scmd_to_wqidx_distr(phba);
8528 piocb->fcp_wqidx = idx;
8529 ring_number = MAX_SLI3_CONFIGURED_RINGS + idx;
8530
8531 pring = &phba->sli.ring[ring_number];
8532 spin_lock_irqsave(&pring->ring_lock, iflags);
8533 rc = __lpfc_sli_issue_iocb(phba, ring_number, piocb,
8534 flag);
8535 spin_unlock_irqrestore(&pring->ring_lock, iflags);
8536
8537 if (lpfc_fcp_look_ahead) {
8538 fcp_eq_hdl = &phba->sli4_hba.fcp_eq_hdl[idx];
8539
8540 if (atomic_dec_and_test(&fcp_eq_hdl->
8541 fcp_eq_in_use)) {
8542
8543
8544 fpeq = phba->sli4_hba.hba_eq[idx];
8545
8546
8547 lpfc_sli4_eq_clr_intr(fpeq);
8548
8549
8550
8551
8552 while ((eqe = lpfc_sli4_eq_get(fpeq))) {
8553 lpfc_sli4_hba_handle_eqe(phba,
8554 eqe, idx);
8555 fpeq->EQ_processed++;
8556 }
8557
8558
8559 lpfc_sli4_eq_release(fpeq,
8560 LPFC_QUEUE_REARM);
8561 }
8562 atomic_inc(&fcp_eq_hdl->fcp_eq_in_use);
8563 }
8564 } else {
8565 pring = &phba->sli.ring[ring_number];
8566 spin_lock_irqsave(&pring->ring_lock, iflags);
8567 rc = __lpfc_sli_issue_iocb(phba, ring_number, piocb,
8568 flag);
8569 spin_unlock_irqrestore(&pring->ring_lock, iflags);
8570
8571 }
8572 } else {
8573
8574 spin_lock_irqsave(&phba->hbalock, iflags);
8575 rc = __lpfc_sli_issue_iocb(phba, ring_number, piocb, flag);
8576 spin_unlock_irqrestore(&phba->hbalock, iflags);
8577 }
8578 return rc;
8579}
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592static int
8593lpfc_extra_ring_setup( struct lpfc_hba *phba)
8594{
8595 struct lpfc_sli *psli;
8596 struct lpfc_sli_ring *pring;
8597
8598 psli = &phba->sli;
8599
8600
8601
8602
8603 pring = &psli->ring[psli->fcp_ring];
8604 pring->sli.sli3.numCiocb -= SLI2_IOCB_CMD_R1XTRA_ENTRIES;
8605 pring->sli.sli3.numRiocb -= SLI2_IOCB_RSP_R1XTRA_ENTRIES;
8606 pring->sli.sli3.numCiocb -= SLI2_IOCB_CMD_R3XTRA_ENTRIES;
8607 pring->sli.sli3.numRiocb -= SLI2_IOCB_RSP_R3XTRA_ENTRIES;
8608
8609
8610 pring = &psli->ring[psli->extra_ring];
8611
8612 pring->sli.sli3.numCiocb += SLI2_IOCB_CMD_R1XTRA_ENTRIES;
8613 pring->sli.sli3.numRiocb += SLI2_IOCB_RSP_R1XTRA_ENTRIES;
8614 pring->sli.sli3.numCiocb += SLI2_IOCB_CMD_R3XTRA_ENTRIES;
8615 pring->sli.sli3.numRiocb += SLI2_IOCB_RSP_R3XTRA_ENTRIES;
8616
8617
8618 pring->iotag_max = 4096;
8619 pring->num_mask = 1;
8620 pring->prt[0].profile = 0;
8621 pring->prt[0].rctl = phba->cfg_multi_ring_rctl;
8622 pring->prt[0].type = phba->cfg_multi_ring_type;
8623 pring->prt[0].lpfc_sli_rcv_unsol_event = NULL;
8624 return 0;
8625}
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639static void
8640lpfc_sli_abts_err_handler(struct lpfc_hba *phba,
8641 struct lpfc_iocbq *iocbq)
8642{
8643 struct lpfc_nodelist *ndlp = NULL;
8644 uint16_t rpi = 0, vpi = 0;
8645 struct lpfc_vport *vport = NULL;
8646
8647
8648 vpi = iocbq->iocb.un.asyncstat.sub_ctxt_tag;
8649 rpi = iocbq->iocb.ulpContext;
8650
8651 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
8652 "3092 Port generated ABTS async event "
8653 "on vpi %d rpi %d status 0x%x\n",
8654 vpi, rpi, iocbq->iocb.ulpStatus);
8655
8656 vport = lpfc_find_vport_by_vpid(phba, vpi);
8657 if (!vport)
8658 goto err_exit;
8659 ndlp = lpfc_findnode_rpi(vport, rpi);
8660 if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
8661 goto err_exit;
8662
8663 if (iocbq->iocb.ulpStatus == IOSTAT_LOCAL_REJECT)
8664 lpfc_sli_abts_recover_port(vport, ndlp);
8665 return;
8666
8667 err_exit:
8668 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
8669 "3095 Event Context not found, no "
8670 "action on vpi %d rpi %d status 0x%x, reason 0x%x\n",
8671 iocbq->iocb.ulpContext, iocbq->iocb.ulpStatus,
8672 vpi, rpi);
8673}
8674
8675
8676
8677
8678
8679
8680
8681
8682
8683
8684
8685void
8686lpfc_sli4_abts_err_handler(struct lpfc_hba *phba,
8687 struct lpfc_nodelist *ndlp,
8688 struct sli4_wcqe_xri_aborted *axri)
8689{
8690 struct lpfc_vport *vport;
8691 uint32_t ext_status = 0;
8692
8693 if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) {
8694 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
8695 "3115 Node Context not found, driver "
8696 "ignoring abts err event\n");
8697 return;
8698 }
8699
8700 vport = ndlp->vport;
8701 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
8702 "3116 Port generated FCP XRI ABORT event on "
8703 "vpi %d rpi %d xri x%x status 0x%x parameter x%x\n",
8704 ndlp->vport->vpi, ndlp->nlp_rpi,
8705 bf_get(lpfc_wcqe_xa_xri, axri),
8706 bf_get(lpfc_wcqe_xa_status, axri),
8707 axri->parameter);
8708
8709
8710
8711
8712
8713
8714 ext_status = axri->parameter & IOERR_PARAM_MASK;
8715 if ((bf_get(lpfc_wcqe_xa_status, axri) == IOSTAT_LOCAL_REJECT) &&
8716 ((ext_status == IOERR_SEQUENCE_TIMEOUT) || (ext_status == 0)))
8717 lpfc_sli_abts_recover_port(vport, ndlp);
8718}
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
8733static void
8734lpfc_sli_async_event_handler(struct lpfc_hba * phba,
8735 struct lpfc_sli_ring * pring, struct lpfc_iocbq * iocbq)
8736{
8737 IOCB_t *icmd;
8738 uint16_t evt_code;
8739 struct temp_event temp_event_data;
8740 struct Scsi_Host *shost;
8741 uint32_t *iocb_w;
8742
8743 icmd = &iocbq->iocb;
8744 evt_code = icmd->un.asyncstat.evt_code;
8745
8746 switch (evt_code) {
8747 case ASYNC_TEMP_WARN:
8748 case ASYNC_TEMP_SAFE:
8749 temp_event_data.data = (uint32_t) icmd->ulpContext;
8750 temp_event_data.event_type = FC_REG_TEMPERATURE_EVENT;
8751 if (evt_code == ASYNC_TEMP_WARN) {
8752 temp_event_data.event_code = LPFC_THRESHOLD_TEMP;
8753 lpfc_printf_log(phba, KERN_ERR, LOG_TEMP,
8754 "0347 Adapter is very hot, please take "
8755 "corrective action. temperature : %d Celsius\n",
8756 (uint32_t) icmd->ulpContext);
8757 } else {
8758 temp_event_data.event_code = LPFC_NORMAL_TEMP;
8759 lpfc_printf_log(phba, KERN_ERR, LOG_TEMP,
8760 "0340 Adapter temperature is OK now. "
8761 "temperature : %d Celsius\n",
8762 (uint32_t) icmd->ulpContext);
8763 }
8764
8765
8766 shost = lpfc_shost_from_vport(phba->pport);
8767 fc_host_post_vendor_event(shost, fc_get_event_number(),
8768 sizeof(temp_event_data), (char *) &temp_event_data,
8769 LPFC_NL_VENDOR_ID);
8770 break;
8771 case ASYNC_STATUS_CN:
8772 lpfc_sli_abts_err_handler(phba, iocbq);
8773 break;
8774 default:
8775 iocb_w = (uint32_t *) icmd;
8776 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
8777 "0346 Ring %d handler: unexpected ASYNC_STATUS"
8778 " evt_code 0x%x\n"
8779 "W0 0x%08x W1 0x%08x W2 0x%08x W3 0x%08x\n"
8780 "W4 0x%08x W5 0x%08x W6 0x%08x W7 0x%08x\n"
8781 "W8 0x%08x W9 0x%08x W10 0x%08x W11 0x%08x\n"
8782 "W12 0x%08x W13 0x%08x W14 0x%08x W15 0x%08x\n",
8783 pring->ringno, icmd->un.asyncstat.evt_code,
8784 iocb_w[0], iocb_w[1], iocb_w[2], iocb_w[3],
8785 iocb_w[4], iocb_w[5], iocb_w[6], iocb_w[7],
8786 iocb_w[8], iocb_w[9], iocb_w[10], iocb_w[11],
8787 iocb_w[12], iocb_w[13], iocb_w[14], iocb_w[15]);
8788
8789 break;
8790 }
8791}
8792
8793
8794
8795
8796
8797
8798
8799
8800
8801
8802
8803
8804
8805int
8806lpfc_sli_setup(struct lpfc_hba *phba)
8807{
8808 int i, totiocbsize = 0;
8809 struct lpfc_sli *psli = &phba->sli;
8810 struct lpfc_sli_ring *pring;
8811
8812 psli->num_rings = MAX_SLI3_CONFIGURED_RINGS;
8813 if (phba->sli_rev == LPFC_SLI_REV4)
8814 psli->num_rings += phba->cfg_fcp_io_channel;
8815 psli->sli_flag = 0;
8816 psli->fcp_ring = LPFC_FCP_RING;
8817 psli->next_ring = LPFC_FCP_NEXT_RING;
8818 psli->extra_ring = LPFC_EXTRA_RING;
8819
8820 psli->iocbq_lookup = NULL;
8821 psli->iocbq_lookup_len = 0;
8822 psli->last_iotag = 0;
8823
8824 for (i = 0; i < psli->num_rings; i++) {
8825 pring = &psli->ring[i];
8826 switch (i) {
8827 case LPFC_FCP_RING:
8828
8829 pring->sli.sli3.numCiocb = SLI2_IOCB_CMD_R0_ENTRIES;
8830 pring->sli.sli3.numRiocb = SLI2_IOCB_RSP_R0_ENTRIES;
8831 pring->sli.sli3.numCiocb +=
8832 SLI2_IOCB_CMD_R1XTRA_ENTRIES;
8833 pring->sli.sli3.numRiocb +=
8834 SLI2_IOCB_RSP_R1XTRA_ENTRIES;
8835 pring->sli.sli3.numCiocb +=
8836 SLI2_IOCB_CMD_R3XTRA_ENTRIES;
8837 pring->sli.sli3.numRiocb +=
8838 SLI2_IOCB_RSP_R3XTRA_ENTRIES;
8839 pring->sli.sli3.sizeCiocb = (phba->sli_rev == 3) ?
8840 SLI3_IOCB_CMD_SIZE :
8841 SLI2_IOCB_CMD_SIZE;
8842 pring->sli.sli3.sizeRiocb = (phba->sli_rev == 3) ?
8843 SLI3_IOCB_RSP_SIZE :
8844 SLI2_IOCB_RSP_SIZE;
8845 pring->iotag_ctr = 0;
8846 pring->iotag_max =
8847 (phba->cfg_hba_queue_depth * 2);
8848 pring->fast_iotag = pring->iotag_max;
8849 pring->num_mask = 0;
8850 break;
8851 case LPFC_EXTRA_RING:
8852
8853 pring->sli.sli3.numCiocb = SLI2_IOCB_CMD_R1_ENTRIES;
8854 pring->sli.sli3.numRiocb = SLI2_IOCB_RSP_R1_ENTRIES;
8855 pring->sli.sli3.sizeCiocb = (phba->sli_rev == 3) ?
8856 SLI3_IOCB_CMD_SIZE :
8857 SLI2_IOCB_CMD_SIZE;
8858 pring->sli.sli3.sizeRiocb = (phba->sli_rev == 3) ?
8859 SLI3_IOCB_RSP_SIZE :
8860 SLI2_IOCB_RSP_SIZE;
8861 pring->iotag_max = phba->cfg_hba_queue_depth;
8862 pring->num_mask = 0;
8863 break;
8864 case LPFC_ELS_RING:
8865
8866 pring->sli.sli3.numCiocb = SLI2_IOCB_CMD_R2_ENTRIES;
8867 pring->sli.sli3.numRiocb = SLI2_IOCB_RSP_R2_ENTRIES;
8868 pring->sli.sli3.sizeCiocb = (phba->sli_rev == 3) ?
8869 SLI3_IOCB_CMD_SIZE :
8870 SLI2_IOCB_CMD_SIZE;
8871 pring->sli.sli3.sizeRiocb = (phba->sli_rev == 3) ?
8872 SLI3_IOCB_RSP_SIZE :
8873 SLI2_IOCB_RSP_SIZE;
8874 pring->fast_iotag = 0;
8875 pring->iotag_ctr = 0;
8876 pring->iotag_max = 4096;
8877 pring->lpfc_sli_rcv_async_status =
8878 lpfc_sli_async_event_handler;
8879 pring->num_mask = LPFC_MAX_RING_MASK;
8880 pring->prt[0].profile = 0;
8881 pring->prt[0].rctl = FC_RCTL_ELS_REQ;
8882 pring->prt[0].type = FC_TYPE_ELS;
8883 pring->prt[0].lpfc_sli_rcv_unsol_event =
8884 lpfc_els_unsol_event;
8885 pring->prt[1].profile = 0;
8886 pring->prt[1].rctl = FC_RCTL_ELS_REP;
8887 pring->prt[1].type = FC_TYPE_ELS;
8888 pring->prt[1].lpfc_sli_rcv_unsol_event =
8889 lpfc_els_unsol_event;
8890 pring->prt[2].profile = 0;
8891
8892 pring->prt[2].rctl = FC_RCTL_DD_UNSOL_CTL;
8893
8894 pring->prt[2].type = FC_TYPE_CT;
8895 pring->prt[2].lpfc_sli_rcv_unsol_event =
8896 lpfc_ct_unsol_event;
8897 pring->prt[3].profile = 0;
8898
8899 pring->prt[3].rctl = FC_RCTL_DD_SOL_CTL;
8900
8901 pring->prt[3].type = FC_TYPE_CT;
8902 pring->prt[3].lpfc_sli_rcv_unsol_event =
8903 lpfc_ct_unsol_event;
8904 break;
8905 }
8906 totiocbsize += (pring->sli.sli3.numCiocb *
8907 pring->sli.sli3.sizeCiocb) +
8908 (pring->sli.sli3.numRiocb * pring->sli.sli3.sizeRiocb);
8909 }
8910 if (totiocbsize > MAX_SLIM_IOCB_SIZE) {
8911
8912 printk(KERN_ERR "%d:0462 Too many cmd / rsp ring entries in "
8913 "SLI2 SLIM Data: x%x x%lx\n",
8914 phba->brd_no, totiocbsize,
8915 (unsigned long) MAX_SLIM_IOCB_SIZE);
8916 }
8917 if (phba->cfg_multi_ring_support == 2)
8918 lpfc_extra_ring_setup(phba);
8919
8920 return 0;
8921}
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
8934int
8935lpfc_sli_queue_setup(struct lpfc_hba *phba)
8936{
8937 struct lpfc_sli *psli;
8938 struct lpfc_sli_ring *pring;
8939 int i;
8940
8941 psli = &phba->sli;
8942 spin_lock_irq(&phba->hbalock);
8943 INIT_LIST_HEAD(&psli->mboxq);
8944 INIT_LIST_HEAD(&psli->mboxq_cmpl);
8945
8946 for (i = 0; i < psli->num_rings; i++) {
8947 pring = &psli->ring[i];
8948 pring->ringno = i;
8949 pring->sli.sli3.next_cmdidx = 0;
8950 pring->sli.sli3.local_getidx = 0;
8951 pring->sli.sli3.cmdidx = 0;
8952 INIT_LIST_HEAD(&pring->txq);
8953 INIT_LIST_HEAD(&pring->txcmplq);
8954 INIT_LIST_HEAD(&pring->iocb_continueq);
8955 INIT_LIST_HEAD(&pring->iocb_continue_saveq);
8956 INIT_LIST_HEAD(&pring->postbufq);
8957 spin_lock_init(&pring->ring_lock);
8958 }
8959 spin_unlock_irq(&phba->hbalock);
8960 return 1;
8961}
8962
8963
8964
8965
8966
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978static void
8979lpfc_sli_mbox_sys_flush(struct lpfc_hba *phba)
8980{
8981 LIST_HEAD(completions);
8982 struct lpfc_sli *psli = &phba->sli;
8983 LPFC_MBOXQ_t *pmb;
8984 unsigned long iflag;
8985
8986
8987 spin_lock_irqsave(&phba->hbalock, iflag);
8988
8989 list_splice_init(&phba->sli.mboxq, &completions);
8990
8991 if (psli->mbox_active) {
8992 list_add_tail(&psli->mbox_active->list, &completions);
8993 psli->mbox_active = NULL;
8994 psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
8995 }
8996
8997 list_splice_init(&phba->sli.mboxq_cmpl, &completions);
8998 spin_unlock_irqrestore(&phba->hbalock, iflag);
8999
9000
9001 while (!list_empty(&completions)) {
9002 list_remove_head(&completions, pmb, LPFC_MBOXQ_t, list);
9003 pmb->u.mb.mbxStatus = MBX_NOT_FINISHED;
9004 if (pmb->mbox_cmpl)
9005 pmb->mbox_cmpl(phba, pmb);
9006 }
9007}
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025
9026int
9027lpfc_sli_host_down(struct lpfc_vport *vport)
9028{
9029 LIST_HEAD(completions);
9030 struct lpfc_hba *phba = vport->phba;
9031 struct lpfc_sli *psli = &phba->sli;
9032 struct lpfc_sli_ring *pring;
9033 struct lpfc_iocbq *iocb, *next_iocb;
9034 int i;
9035 unsigned long flags = 0;
9036 uint16_t prev_pring_flag;
9037
9038 lpfc_cleanup_discovery_resources(vport);
9039
9040 spin_lock_irqsave(&phba->hbalock, flags);
9041 for (i = 0; i < psli->num_rings; i++) {
9042 pring = &psli->ring[i];
9043 prev_pring_flag = pring->flag;
9044
9045 if (pring->ringno == LPFC_ELS_RING) {
9046 pring->flag |= LPFC_DEFERRED_RING_EVENT;
9047
9048 set_bit(LPFC_DATA_READY, &phba->data_flags);
9049 }
9050
9051
9052
9053
9054 list_for_each_entry_safe(iocb, next_iocb, &pring->txq, list) {
9055 if (iocb->vport != vport)
9056 continue;
9057 list_move_tail(&iocb->list, &completions);
9058 pring->txq_cnt--;
9059 }
9060
9061
9062 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq,
9063 list) {
9064 if (iocb->vport != vport)
9065 continue;
9066 lpfc_sli_issue_abort_iotag(phba, pring, iocb);
9067 }
9068
9069 pring->flag = prev_pring_flag;
9070 }
9071
9072 spin_unlock_irqrestore(&phba->hbalock, flags);
9073
9074
9075 lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
9076 IOERR_SLI_DOWN);
9077 return 1;
9078}
9079
9080
9081
9082
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095int
9096lpfc_sli_hba_down(struct lpfc_hba *phba)
9097{
9098 LIST_HEAD(completions);
9099 struct lpfc_sli *psli = &phba->sli;
9100 struct lpfc_sli_ring *pring;
9101 struct lpfc_dmabuf *buf_ptr;
9102 unsigned long flags = 0;
9103 int i;
9104
9105
9106 lpfc_sli_mbox_sys_shutdown(phba, LPFC_MBX_WAIT);
9107
9108 lpfc_hba_down_prep(phba);
9109
9110 lpfc_fabric_abort_hba(phba);
9111
9112 spin_lock_irqsave(&phba->hbalock, flags);
9113 for (i = 0; i < psli->num_rings; i++) {
9114 pring = &psli->ring[i];
9115
9116 if (pring->ringno == LPFC_ELS_RING) {
9117 pring->flag |= LPFC_DEFERRED_RING_EVENT;
9118
9119 set_bit(LPFC_DATA_READY, &phba->data_flags);
9120 }
9121
9122
9123
9124
9125
9126 list_splice_init(&pring->txq, &completions);
9127 pring->txq_cnt = 0;
9128
9129 }
9130 spin_unlock_irqrestore(&phba->hbalock, flags);
9131
9132
9133 lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
9134 IOERR_SLI_DOWN);
9135
9136 spin_lock_irqsave(&phba->hbalock, flags);
9137 list_splice_init(&phba->elsbuf, &completions);
9138 phba->elsbuf_cnt = 0;
9139 phba->elsbuf_prev_cnt = 0;
9140 spin_unlock_irqrestore(&phba->hbalock, flags);
9141
9142 while (!list_empty(&completions)) {
9143 list_remove_head(&completions, buf_ptr,
9144 struct lpfc_dmabuf, list);
9145 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
9146 kfree(buf_ptr);
9147 }
9148
9149
9150 del_timer_sync(&psli->mbox_tmo);
9151
9152 spin_lock_irqsave(&phba->pport->work_port_lock, flags);
9153 phba->pport->work_port_events &= ~WORKER_MBOX_TMO;
9154 spin_unlock_irqrestore(&phba->pport->work_port_lock, flags);
9155
9156 return 1;
9157}
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171void
9172lpfc_sli_pcimem_bcopy(void *srcp, void *destp, uint32_t cnt)
9173{
9174 uint32_t *src = srcp;
9175 uint32_t *dest = destp;
9176 uint32_t ldata;
9177 int i;
9178
9179 for (i = 0; i < (int)cnt; i += sizeof (uint32_t)) {
9180 ldata = *src;
9181 ldata = le32_to_cpu(ldata);
9182 *dest = ldata;
9183 src++;
9184 dest++;
9185 }
9186}
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199void
9200lpfc_sli_bemem_bcopy(void *srcp, void *destp, uint32_t cnt)
9201{
9202 uint32_t *src = srcp;
9203 uint32_t *dest = destp;
9204 uint32_t ldata;
9205 int i;
9206
9207 for (i = 0; i < (int)cnt; i += sizeof(uint32_t)) {
9208 ldata = *src;
9209 ldata = be32_to_cpu(ldata);
9210 *dest = ldata;
9211 src++;
9212 dest++;
9213 }
9214}
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226int
9227lpfc_sli_ringpostbuf_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
9228 struct lpfc_dmabuf *mp)
9229{
9230
9231
9232 spin_lock_irq(&phba->hbalock);
9233 list_add_tail(&mp->list, &pring->postbufq);
9234 pring->postbufq_cnt++;
9235 spin_unlock_irq(&phba->hbalock);
9236 return 0;
9237}
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250uint32_t
9251lpfc_sli_get_buffer_tag(struct lpfc_hba *phba)
9252{
9253 spin_lock_irq(&phba->hbalock);
9254 phba->buffer_tag_count++;
9255
9256
9257
9258
9259 phba->buffer_tag_count |= QUE_BUFTAG_BIT;
9260 spin_unlock_irq(&phba->hbalock);
9261 return phba->buffer_tag_count;
9262}
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279struct lpfc_dmabuf *
9280lpfc_sli_ring_taggedbuf_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
9281 uint32_t tag)
9282{
9283 struct lpfc_dmabuf *mp, *next_mp;
9284 struct list_head *slp = &pring->postbufq;
9285
9286
9287 spin_lock_irq(&phba->hbalock);
9288 list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) {
9289 if (mp->buffer_tag == tag) {
9290 list_del_init(&mp->list);
9291 pring->postbufq_cnt--;
9292 spin_unlock_irq(&phba->hbalock);
9293 return mp;
9294 }
9295 }
9296
9297 spin_unlock_irq(&phba->hbalock);
9298 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
9299 "0402 Cannot find virtual addr for buffer tag on "
9300 "ring %d Data x%lx x%p x%p x%x\n",
9301 pring->ringno, (unsigned long) tag,
9302 slp->next, slp->prev, pring->postbufq_cnt);
9303
9304 return NULL;
9305}
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323struct lpfc_dmabuf *
9324lpfc_sli_ringpostbuf_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
9325 dma_addr_t phys)
9326{
9327 struct lpfc_dmabuf *mp, *next_mp;
9328 struct list_head *slp = &pring->postbufq;
9329
9330
9331 spin_lock_irq(&phba->hbalock);
9332 list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) {
9333 if (mp->phys == phys) {
9334 list_del_init(&mp->list);
9335 pring->postbufq_cnt--;
9336 spin_unlock_irq(&phba->hbalock);
9337 return mp;
9338 }
9339 }
9340
9341 spin_unlock_irq(&phba->hbalock);
9342 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
9343 "0410 Cannot find virtual addr for mapped buf on "
9344 "ring %d Data x%llx x%p x%p x%x\n",
9345 pring->ringno, (unsigned long long)phys,
9346 slp->next, slp->prev, pring->postbufq_cnt);
9347 return NULL;
9348}
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361static void
9362lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
9363 struct lpfc_iocbq *rspiocb)
9364{
9365 IOCB_t *irsp = &rspiocb->iocb;
9366 uint16_t abort_iotag, abort_context;
9367 struct lpfc_iocbq *abort_iocb = NULL;
9368
9369 if (irsp->ulpStatus) {
9370
9371
9372
9373
9374
9375 abort_context = cmdiocb->iocb.un.acxri.abortContextTag;
9376 abort_iotag = cmdiocb->iocb.un.acxri.abortIoTag;
9377
9378 spin_lock_irq(&phba->hbalock);
9379 if (phba->sli_rev < LPFC_SLI_REV4) {
9380 if (abort_iotag != 0 &&
9381 abort_iotag <= phba->sli.last_iotag)
9382 abort_iocb =
9383 phba->sli.iocbq_lookup[abort_iotag];
9384 } else
9385
9386
9387
9388
9389
9390 abort_iocb = phba->sli.iocbq_lookup[abort_context];
9391
9392 lpfc_printf_log(phba, KERN_WARNING, LOG_ELS | LOG_SLI,
9393 "0327 Cannot abort els iocb %p "
9394 "with tag %x context %x, abort status %x, "
9395 "abort code %x\n",
9396 abort_iocb, abort_iotag, abort_context,
9397 irsp->ulpStatus, irsp->un.ulpWord[4]);
9398
9399 spin_unlock_irq(&phba->hbalock);
9400 }
9401 lpfc_sli_release_iocbq(phba, cmdiocb);
9402 return;
9403}
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416static void
9417lpfc_ignore_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
9418 struct lpfc_iocbq *rspiocb)
9419{
9420 IOCB_t *irsp = &rspiocb->iocb;
9421
9422
9423 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
9424 "0139 Ignoring ELS cmd tag x%x completion Data: "
9425 "x%x x%x x%x\n",
9426 irsp->ulpIoTag, irsp->ulpStatus,
9427 irsp->un.ulpWord[4], irsp->ulpTimeout);
9428 if (cmdiocb->iocb.ulpCommand == CMD_GEN_REQUEST64_CR)
9429 lpfc_ct_free_iocb(phba, cmdiocb);
9430 else
9431 lpfc_els_free_iocb(phba, cmdiocb);
9432 return;
9433}
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447static int
9448lpfc_sli_abort_iotag_issue(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
9449 struct lpfc_iocbq *cmdiocb)
9450{
9451 struct lpfc_vport *vport = cmdiocb->vport;
9452 struct lpfc_iocbq *abtsiocbp;
9453 IOCB_t *icmd = NULL;
9454 IOCB_t *iabt = NULL;
9455 int retval;
9456 unsigned long iflags;
9457
9458
9459
9460
9461
9462
9463 icmd = &cmdiocb->iocb;
9464 if (icmd->ulpCommand == CMD_ABORT_XRI_CN ||
9465 icmd->ulpCommand == CMD_CLOSE_XRI_CN ||
9466 (cmdiocb->iocb_flag & LPFC_DRIVER_ABORTED) != 0)
9467 return 0;
9468
9469
9470 abtsiocbp = __lpfc_sli_get_iocbq(phba);
9471 if (abtsiocbp == NULL)
9472 return 0;
9473
9474
9475
9476
9477 cmdiocb->iocb_flag |= LPFC_DRIVER_ABORTED;
9478
9479 iabt = &abtsiocbp->iocb;
9480 iabt->un.acxri.abortType = ABORT_TYPE_ABTS;
9481 iabt->un.acxri.abortContextTag = icmd->ulpContext;
9482 if (phba->sli_rev == LPFC_SLI_REV4) {
9483 iabt->un.acxri.abortIoTag = cmdiocb->sli4_xritag;
9484 iabt->un.acxri.abortContextTag = cmdiocb->iotag;
9485 }
9486 else
9487 iabt->un.acxri.abortIoTag = icmd->ulpIoTag;
9488 iabt->ulpLe = 1;
9489 iabt->ulpClass = icmd->ulpClass;
9490
9491
9492 abtsiocbp->fcp_wqidx = cmdiocb->fcp_wqidx;
9493 if (cmdiocb->iocb_flag & LPFC_IO_FCP)
9494 abtsiocbp->iocb_flag |= LPFC_USE_FCPWQIDX;
9495
9496 if (phba->link_state >= LPFC_LINK_UP)
9497 iabt->ulpCommand = CMD_ABORT_XRI_CN;
9498 else
9499 iabt->ulpCommand = CMD_CLOSE_XRI_CN;
9500
9501 abtsiocbp->iocb_cmpl = lpfc_sli_abort_els_cmpl;
9502
9503 lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI,
9504 "0339 Abort xri x%x, original iotag x%x, "
9505 "abort cmd iotag x%x\n",
9506 iabt->un.acxri.abortIoTag,
9507 iabt->un.acxri.abortContextTag,
9508 abtsiocbp->iotag);
9509
9510 if (phba->sli_rev == LPFC_SLI_REV4) {
9511
9512 spin_lock_irqsave(&pring->ring_lock, iflags);
9513 retval = __lpfc_sli_issue_iocb(phba, pring->ringno,
9514 abtsiocbp, 0);
9515 spin_unlock_irqrestore(&pring->ring_lock, iflags);
9516 } else {
9517 retval = __lpfc_sli_issue_iocb(phba, pring->ringno,
9518 abtsiocbp, 0);
9519 }
9520
9521 if (retval)
9522 __lpfc_sli_release_iocbq(phba, abtsiocbp);
9523
9524
9525
9526
9527
9528
9529 return retval;
9530}
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545int
9546lpfc_sli_issue_abort_iotag(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
9547 struct lpfc_iocbq *cmdiocb)
9548{
9549 struct lpfc_vport *vport = cmdiocb->vport;
9550 int retval = IOCB_ERROR;
9551 IOCB_t *icmd = NULL;
9552
9553
9554
9555
9556
9557
9558 icmd = &cmdiocb->iocb;
9559 if (icmd->ulpCommand == CMD_ABORT_XRI_CN ||
9560 icmd->ulpCommand == CMD_CLOSE_XRI_CN ||
9561 (cmdiocb->iocb_flag & LPFC_DRIVER_ABORTED) != 0)
9562 return 0;
9563
9564
9565
9566
9567
9568 if ((vport->load_flag & FC_UNLOADING) &&
9569 (pring->ringno == LPFC_ELS_RING)) {
9570 if (cmdiocb->iocb_flag & LPFC_IO_FABRIC)
9571 cmdiocb->fabric_iocb_cmpl = lpfc_ignore_els_cmpl;
9572 else
9573 cmdiocb->iocb_cmpl = lpfc_ignore_els_cmpl;
9574 goto abort_iotag_exit;
9575 }
9576
9577
9578 retval = lpfc_sli_abort_iotag_issue(phba, pring, cmdiocb);
9579
9580abort_iotag_exit:
9581
9582
9583
9584
9585
9586 return retval;
9587}
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600static void
9601lpfc_sli_iocb_ring_abort(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
9602{
9603 LIST_HEAD(completions);
9604 struct lpfc_iocbq *iocb, *next_iocb;
9605
9606 if (pring->ringno == LPFC_ELS_RING)
9607 lpfc_fabric_abort_hba(phba);
9608
9609 spin_lock_irq(&phba->hbalock);
9610
9611
9612 list_splice_init(&pring->txq, &completions);
9613 pring->txq_cnt = 0;
9614
9615
9616 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list)
9617 lpfc_sli_abort_iotag_issue(phba, pring, iocb);
9618
9619 spin_unlock_irq(&phba->hbalock);
9620
9621
9622 lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
9623 IOERR_SLI_ABORTED);
9624}
9625
9626
9627
9628
9629
9630
9631
9632void
9633lpfc_sli_hba_iocb_abort(struct lpfc_hba *phba)
9634{
9635 struct lpfc_sli *psli = &phba->sli;
9636 struct lpfc_sli_ring *pring;
9637 int i;
9638
9639 for (i = 0; i < psli->num_rings; i++) {
9640 pring = &psli->ring[i];
9641 lpfc_sli_iocb_ring_abort(phba, pring);
9642 }
9643}
9644
9645
9646
9647
9648
9649
9650
9651
9652
9653
9654
9655
9656
9657
9658
9659
9660
9661
9662
9663
9664
9665
9666
9667static int
9668lpfc_sli_validate_fcp_iocb(struct lpfc_iocbq *iocbq, struct lpfc_vport *vport,
9669 uint16_t tgt_id, uint64_t lun_id,
9670 lpfc_ctx_cmd ctx_cmd)
9671{
9672 struct lpfc_scsi_buf *lpfc_cmd;
9673 int rc = 1;
9674
9675 if (!(iocbq->iocb_flag & LPFC_IO_FCP))
9676 return rc;
9677
9678 if (iocbq->vport != vport)
9679 return rc;
9680
9681 lpfc_cmd = container_of(iocbq, struct lpfc_scsi_buf, cur_iocbq);
9682
9683 if (lpfc_cmd->pCmd == NULL)
9684 return rc;
9685
9686 switch (ctx_cmd) {
9687 case LPFC_CTX_LUN:
9688 if ((lpfc_cmd->rdata->pnode) &&
9689 (lpfc_cmd->rdata->pnode->nlp_sid == tgt_id) &&
9690 (scsilun_to_int(&lpfc_cmd->fcp_cmnd->fcp_lun) == lun_id))
9691 rc = 0;
9692 break;
9693 case LPFC_CTX_TGT:
9694 if ((lpfc_cmd->rdata->pnode) &&
9695 (lpfc_cmd->rdata->pnode->nlp_sid == tgt_id))
9696 rc = 0;
9697 break;
9698 case LPFC_CTX_HOST:
9699 rc = 0;
9700 break;
9701 default:
9702 printk(KERN_ERR "%s: Unknown context cmd type, value %d\n",
9703 __func__, ctx_cmd);
9704 break;
9705 }
9706
9707 return rc;
9708}
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729int
9730lpfc_sli_sum_iocb(struct lpfc_vport *vport, uint16_t tgt_id, uint64_t lun_id,
9731 lpfc_ctx_cmd ctx_cmd)
9732{
9733 struct lpfc_hba *phba = vport->phba;
9734 struct lpfc_iocbq *iocbq;
9735 int sum, i;
9736
9737 for (i = 1, sum = 0; i <= phba->sli.last_iotag; i++) {
9738 iocbq = phba->sli.iocbq_lookup[i];
9739
9740 if (lpfc_sli_validate_fcp_iocb (iocbq, vport, tgt_id, lun_id,
9741 ctx_cmd) == 0)
9742 sum++;
9743 }
9744
9745 return sum;
9746}
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757
9758void
9759lpfc_sli_abort_fcp_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
9760 struct lpfc_iocbq *rspiocb)
9761{
9762 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
9763 "3096 ABORT_XRI_CN completing on xri x%x "
9764 "original iotag x%x, abort cmd iotag x%x "
9765 "status 0x%x, reason 0x%x\n",
9766 cmdiocb->iocb.un.acxri.abortContextTag,
9767 cmdiocb->iocb.un.acxri.abortIoTag,
9768 cmdiocb->iotag, rspiocb->iocb.ulpStatus,
9769 rspiocb->iocb.un.ulpWord[4]);
9770 lpfc_sli_release_iocbq(phba, cmdiocb);
9771 return;
9772}
9773
9774
9775
9776
9777
9778
9779
9780
9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795int
9796lpfc_sli_abort_iocb(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
9797 uint16_t tgt_id, uint64_t lun_id, lpfc_ctx_cmd abort_cmd)
9798{
9799 struct lpfc_hba *phba = vport->phba;
9800 struct lpfc_iocbq *iocbq;
9801 struct lpfc_iocbq *abtsiocb;
9802 IOCB_t *cmd = NULL;
9803 int errcnt = 0, ret_val = 0;
9804 int i;
9805
9806 for (i = 1; i <= phba->sli.last_iotag; i++) {
9807 iocbq = phba->sli.iocbq_lookup[i];
9808
9809 if (lpfc_sli_validate_fcp_iocb(iocbq, vport, tgt_id, lun_id,
9810 abort_cmd) != 0)
9811 continue;
9812
9813
9814 abtsiocb = lpfc_sli_get_iocbq(phba);
9815 if (abtsiocb == NULL) {
9816 errcnt++;
9817 continue;
9818 }
9819
9820 cmd = &iocbq->iocb;
9821 abtsiocb->iocb.un.acxri.abortType = ABORT_TYPE_ABTS;
9822 abtsiocb->iocb.un.acxri.abortContextTag = cmd->ulpContext;
9823 if (phba->sli_rev == LPFC_SLI_REV4)
9824 abtsiocb->iocb.un.acxri.abortIoTag = iocbq->sli4_xritag;
9825 else
9826 abtsiocb->iocb.un.acxri.abortIoTag = cmd->ulpIoTag;
9827 abtsiocb->iocb.ulpLe = 1;
9828 abtsiocb->iocb.ulpClass = cmd->ulpClass;
9829 abtsiocb->vport = phba->pport;
9830
9831
9832 abtsiocb->fcp_wqidx = iocbq->fcp_wqidx;
9833 if (iocbq->iocb_flag & LPFC_IO_FCP)
9834 abtsiocb->iocb_flag |= LPFC_USE_FCPWQIDX;
9835
9836 if (lpfc_is_link_up(phba))
9837 abtsiocb->iocb.ulpCommand = CMD_ABORT_XRI_CN;
9838 else
9839 abtsiocb->iocb.ulpCommand = CMD_CLOSE_XRI_CN;
9840
9841
9842 abtsiocb->iocb_cmpl = lpfc_sli_abort_fcp_cmpl;
9843 ret_val = lpfc_sli_issue_iocb(phba, pring->ringno,
9844 abtsiocb, 0);
9845 if (ret_val == IOCB_ERROR) {
9846 lpfc_sli_release_iocbq(phba, abtsiocb);
9847 errcnt++;
9848 continue;
9849 }
9850 }
9851
9852 return errcnt;
9853}
9854
9855
9856
9857
9858
9859
9860
9861
9862
9863
9864
9865
9866
9867
9868
9869
9870
9871
9872static void
9873lpfc_sli_wake_iocb_wait(struct lpfc_hba *phba,
9874 struct lpfc_iocbq *cmdiocbq,
9875 struct lpfc_iocbq *rspiocbq)
9876{
9877 wait_queue_head_t *pdone_q;
9878 unsigned long iflags;
9879 struct lpfc_scsi_buf *lpfc_cmd;
9880
9881 spin_lock_irqsave(&phba->hbalock, iflags);
9882 cmdiocbq->iocb_flag |= LPFC_IO_WAKE;
9883 if (cmdiocbq->context2 && rspiocbq)
9884 memcpy(&((struct lpfc_iocbq *)cmdiocbq->context2)->iocb,
9885 &rspiocbq->iocb, sizeof(IOCB_t));
9886
9887
9888 if ((cmdiocbq->iocb_flag & LPFC_IO_FCP) &&
9889 !(cmdiocbq->iocb_flag & LPFC_IO_LIBDFC)) {
9890 lpfc_cmd = container_of(cmdiocbq, struct lpfc_scsi_buf,
9891 cur_iocbq);
9892 lpfc_cmd->exch_busy = rspiocbq->iocb_flag & LPFC_EXCHANGE_BUSY;
9893 }
9894
9895 pdone_q = cmdiocbq->context_un.wait_queue;
9896 if (pdone_q)
9897 wake_up(pdone_q);
9898 spin_unlock_irqrestore(&phba->hbalock, iflags);
9899 return;
9900}
9901
9902
9903
9904
9905
9906
9907
9908
9909
9910
9911
9912
9913
9914static int
9915lpfc_chk_iocb_flg(struct lpfc_hba *phba,
9916 struct lpfc_iocbq *piocbq, uint32_t flag)
9917{
9918 unsigned long iflags;
9919 int ret;
9920
9921 spin_lock_irqsave(&phba->hbalock, iflags);
9922 ret = piocbq->iocb_flag & flag;
9923 spin_unlock_irqrestore(&phba->hbalock, iflags);
9924 return ret;
9925
9926}
9927
9928
9929
9930
9931
9932
9933
9934
9935
9936
9937
9938
9939
9940
9941
9942
9943
9944
9945
9946
9947
9948
9949
9950
9951
9952
9953
9954
9955
9956
9957
9958int
9959lpfc_sli_issue_iocb_wait(struct lpfc_hba *phba,
9960 uint32_t ring_number,
9961 struct lpfc_iocbq *piocb,
9962 struct lpfc_iocbq *prspiocbq,
9963 uint32_t timeout)
9964{
9965 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_q);
9966 long timeleft, timeout_req = 0;
9967 int retval = IOCB_SUCCESS;
9968 uint32_t creg_val;
9969 struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
9970
9971
9972
9973
9974 if (prspiocbq) {
9975 if (piocb->context2)
9976 return IOCB_ERROR;
9977 piocb->context2 = prspiocbq;
9978 }
9979
9980 piocb->iocb_cmpl = lpfc_sli_wake_iocb_wait;
9981 piocb->context_un.wait_queue = &done_q;
9982 piocb->iocb_flag &= ~LPFC_IO_WAKE;
9983
9984 if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
9985 if (lpfc_readl(phba->HCregaddr, &creg_val))
9986 return IOCB_ERROR;
9987 creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
9988 writel(creg_val, phba->HCregaddr);
9989 readl(phba->HCregaddr);
9990 }
9991
9992 retval = lpfc_sli_issue_iocb(phba, ring_number, piocb,
9993 SLI_IOCB_RET_IOCB);
9994 if (retval == IOCB_SUCCESS) {
9995 timeout_req = timeout * HZ;
9996 timeleft = wait_event_timeout(done_q,
9997 lpfc_chk_iocb_flg(phba, piocb, LPFC_IO_WAKE),
9998 timeout_req);
9999
10000 if (piocb->iocb_flag & LPFC_IO_WAKE) {
10001 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
10002 "0331 IOCB wake signaled\n");
10003 } else if (timeleft == 0) {
10004 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
10005 "0338 IOCB wait timeout error - no "
10006 "wake response Data x%x\n", timeout);
10007 retval = IOCB_TIMEDOUT;
10008 } else {
10009 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
10010 "0330 IOCB wake NOT set, "
10011 "Data x%x x%lx\n",
10012 timeout, (timeleft / jiffies));
10013 retval = IOCB_TIMEDOUT;
10014 }
10015 } else if (retval == IOCB_BUSY) {
10016 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
10017 "2818 Max IOCBs %d txq cnt %d txcmplq cnt %d\n",
10018 phba->iocb_cnt, pring->txq_cnt, pring->txcmplq_cnt);
10019 return retval;
10020 } else {
10021 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
10022 "0332 IOCB wait issue failed, Data x%x\n",
10023 retval);
10024 retval = IOCB_ERROR;
10025 }
10026
10027 if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
10028 if (lpfc_readl(phba->HCregaddr, &creg_val))
10029 return IOCB_ERROR;
10030 creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING);
10031 writel(creg_val, phba->HCregaddr);
10032 readl(phba->HCregaddr);
10033 }
10034
10035 if (prspiocbq)
10036 piocb->context2 = NULL;
10037
10038 piocb->context_un.wait_queue = NULL;
10039 piocb->iocb_cmpl = NULL;
10040 return retval;
10041}
10042
10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061
10062
10063
10064
10065
10066
10067
10068
10069int
10070lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq,
10071 uint32_t timeout)
10072{
10073 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_q);
10074 int retval;
10075 unsigned long flag;
10076
10077
10078 if (pmboxq->context1)
10079 return MBX_NOT_FINISHED;
10080
10081 pmboxq->mbox_flag &= ~LPFC_MBX_WAKE;
10082
10083 pmboxq->mbox_cmpl = lpfc_sli_wake_mbox_wait;
10084
10085 pmboxq->context1 = &done_q;
10086
10087
10088 retval = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
10089 if (retval == MBX_BUSY || retval == MBX_SUCCESS) {
10090 wait_event_interruptible_timeout(done_q,
10091 pmboxq->mbox_flag & LPFC_MBX_WAKE,
10092 timeout * HZ);
10093
10094 spin_lock_irqsave(&phba->hbalock, flag);
10095 pmboxq->context1 = NULL;
10096
10097
10098
10099
10100 if (pmboxq->mbox_flag & LPFC_MBX_WAKE) {
10101 retval = MBX_SUCCESS;
10102 lpfc_sli4_swap_str(phba, pmboxq);
10103 } else {
10104 retval = MBX_TIMEOUT;
10105 pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
10106 }
10107 spin_unlock_irqrestore(&phba->hbalock, flag);
10108 }
10109
10110 return retval;
10111}
10112
10113
10114
10115
10116
10117
10118
10119
10120
10121
10122
10123
10124
10125
10126
10127
10128void
10129lpfc_sli_mbox_sys_shutdown(struct lpfc_hba *phba, int mbx_action)
10130{
10131 struct lpfc_sli *psli = &phba->sli;
10132 unsigned long timeout;
10133
10134 if (mbx_action == LPFC_MBX_NO_WAIT) {
10135
10136 msleep(100);
10137 lpfc_sli_mbox_sys_flush(phba);
10138 return;
10139 }
10140 timeout = msecs_to_jiffies(LPFC_MBOX_TMO * 1000) + jiffies;
10141
10142 spin_lock_irq(&phba->hbalock);
10143 psli->sli_flag |= LPFC_SLI_ASYNC_MBX_BLK;
10144
10145 if (psli->sli_flag & LPFC_SLI_ACTIVE) {
10146
10147
10148
10149 if (phba->sli.mbox_active)
10150 timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba,
10151 phba->sli.mbox_active) *
10152 1000) + jiffies;
10153 spin_unlock_irq(&phba->hbalock);
10154
10155 while (phba->sli.mbox_active) {
10156
10157 msleep(2);
10158 if (time_after(jiffies, timeout))
10159
10160
10161
10162 break;
10163 }
10164 } else
10165 spin_unlock_irq(&phba->hbalock);
10166
10167 lpfc_sli_mbox_sys_flush(phba);
10168}
10169
10170
10171
10172
10173
10174
10175
10176
10177
10178
10179
10180
10181static int
10182lpfc_sli_eratt_read(struct lpfc_hba *phba)
10183{
10184 uint32_t ha_copy;
10185
10186
10187 if (lpfc_readl(phba->HAregaddr, &ha_copy))
10188 goto unplug_err;
10189
10190 if (ha_copy & HA_ERATT) {
10191
10192 if (lpfc_sli_read_hs(phba))
10193 goto unplug_err;
10194
10195
10196 if ((HS_FFER1 & phba->work_hs) &&
10197 ((HS_FFER2 | HS_FFER3 | HS_FFER4 | HS_FFER5 |
10198 HS_FFER6 | HS_FFER7 | HS_FFER8) & phba->work_hs)) {
10199 phba->hba_flag |= DEFER_ERATT;
10200
10201 writel(0, phba->HCregaddr);
10202 readl(phba->HCregaddr);
10203 }
10204
10205
10206 phba->work_ha |= HA_ERATT;
10207
10208 phba->hba_flag |= HBA_ERATT_HANDLED;
10209 return 1;
10210 }
10211 return 0;
10212
10213unplug_err:
10214
10215 phba->work_hs |= UNPLUG_ERR;
10216
10217 phba->work_ha |= HA_ERATT;
10218
10219 phba->hba_flag |= HBA_ERATT_HANDLED;
10220 return 1;
10221}
10222
10223
10224
10225
10226
10227
10228
10229
10230
10231
10232
10233
10234static int
10235lpfc_sli4_eratt_read(struct lpfc_hba *phba)
10236{
10237 uint32_t uerr_sta_hi, uerr_sta_lo;
10238 uint32_t if_type, portsmphr;
10239 struct lpfc_register portstat_reg;
10240
10241
10242
10243
10244
10245 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf);
10246 switch (if_type) {
10247 case LPFC_SLI_INTF_IF_TYPE_0:
10248 if (lpfc_readl(phba->sli4_hba.u.if_type0.UERRLOregaddr,
10249 &uerr_sta_lo) ||
10250 lpfc_readl(phba->sli4_hba.u.if_type0.UERRHIregaddr,
10251 &uerr_sta_hi)) {
10252 phba->work_hs |= UNPLUG_ERR;
10253 phba->work_ha |= HA_ERATT;
10254 phba->hba_flag |= HBA_ERATT_HANDLED;
10255 return 1;
10256 }
10257 if ((~phba->sli4_hba.ue_mask_lo & uerr_sta_lo) ||
10258 (~phba->sli4_hba.ue_mask_hi & uerr_sta_hi)) {
10259 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
10260 "1423 HBA Unrecoverable error: "
10261 "uerr_lo_reg=0x%x, uerr_hi_reg=0x%x, "
10262 "ue_mask_lo_reg=0x%x, "
10263 "ue_mask_hi_reg=0x%x\n",
10264 uerr_sta_lo, uerr_sta_hi,
10265 phba->sli4_hba.ue_mask_lo,
10266 phba->sli4_hba.ue_mask_hi);
10267 phba->work_status[0] = uerr_sta_lo;
10268 phba->work_status[1] = uerr_sta_hi;
10269 phba->work_ha |= HA_ERATT;
10270 phba->hba_flag |= HBA_ERATT_HANDLED;
10271 return 1;
10272 }
10273 break;
10274 case LPFC_SLI_INTF_IF_TYPE_2:
10275 if (lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr,
10276 &portstat_reg.word0) ||
10277 lpfc_readl(phba->sli4_hba.PSMPHRregaddr,
10278 &portsmphr)){
10279 phba->work_hs |= UNPLUG_ERR;
10280 phba->work_ha |= HA_ERATT;
10281 phba->hba_flag |= HBA_ERATT_HANDLED;
10282 return 1;
10283 }
10284 if (bf_get(lpfc_sliport_status_err, &portstat_reg)) {
10285 phba->work_status[0] =
10286 readl(phba->sli4_hba.u.if_type2.ERR1regaddr);
10287 phba->work_status[1] =
10288 readl(phba->sli4_hba.u.if_type2.ERR2regaddr);
10289 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
10290 "2885 Port Status Event: "
10291 "port status reg 0x%x, "
10292 "port smphr reg 0x%x, "
10293 "error 1=0x%x, error 2=0x%x\n",
10294 portstat_reg.word0,
10295 portsmphr,
10296 phba->work_status[0],
10297 phba->work_status[1]);
10298 phba->work_ha |= HA_ERATT;
10299 phba->hba_flag |= HBA_ERATT_HANDLED;
10300 return 1;
10301 }
10302 break;
10303 case LPFC_SLI_INTF_IF_TYPE_1:
10304 default:
10305 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
10306 "2886 HBA Error Attention on unsupported "
10307 "if type %d.", if_type);
10308 return 1;
10309 }
10310
10311 return 0;
10312}
10313
10314
10315
10316
10317
10318
10319
10320
10321
10322
10323
10324int
10325lpfc_sli_check_eratt(struct lpfc_hba *phba)
10326{
10327 uint32_t ha_copy;
10328
10329
10330
10331
10332 if (phba->link_flag & LS_IGNORE_ERATT)
10333 return 0;
10334
10335
10336 spin_lock_irq(&phba->hbalock);
10337 if (phba->hba_flag & HBA_ERATT_HANDLED) {
10338
10339 spin_unlock_irq(&phba->hbalock);
10340 return 0;
10341 }
10342
10343
10344
10345
10346
10347 if (unlikely(phba->hba_flag & DEFER_ERATT)) {
10348 spin_unlock_irq(&phba->hbalock);
10349 return 0;
10350 }
10351
10352
10353 if (unlikely(pci_channel_offline(phba->pcidev))) {
10354 spin_unlock_irq(&phba->hbalock);
10355 return 0;
10356 }
10357
10358 switch (phba->sli_rev) {
10359 case LPFC_SLI_REV2:
10360 case LPFC_SLI_REV3:
10361
10362 ha_copy = lpfc_sli_eratt_read(phba);
10363 break;
10364 case LPFC_SLI_REV4:
10365
10366 ha_copy = lpfc_sli4_eratt_read(phba);
10367 break;
10368 default:
10369 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
10370 "0299 Invalid SLI revision (%d)\n",
10371 phba->sli_rev);
10372 ha_copy = 0;
10373 break;
10374 }
10375 spin_unlock_irq(&phba->hbalock);
10376
10377 return ha_copy;
10378}
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389
10390static inline int
10391lpfc_intr_state_check(struct lpfc_hba *phba)
10392{
10393
10394 if (unlikely(pci_channel_offline(phba->pcidev)))
10395 return -EIO;
10396
10397
10398 phba->sli.slistat.sli_intr++;
10399
10400
10401 if (unlikely(phba->link_state < LPFC_LINK_DOWN))
10402 return -EIO;
10403
10404 return 0;
10405}
10406
10407
10408
10409
10410
10411
10412
10413
10414
10415
10416
10417
10418
10419
10420
10421
10422
10423
10424
10425
10426
10427
10428irqreturn_t
10429lpfc_sli_sp_intr_handler(int irq, void *dev_id)
10430{
10431 struct lpfc_hba *phba;
10432 uint32_t ha_copy, hc_copy;
10433 uint32_t work_ha_copy;
10434 unsigned long status;
10435 unsigned long iflag;
10436 uint32_t control;
10437
10438 MAILBOX_t *mbox, *pmbox;
10439 struct lpfc_vport *vport;
10440 struct lpfc_nodelist *ndlp;
10441 struct lpfc_dmabuf *mp;
10442 LPFC_MBOXQ_t *pmb;
10443 int rc;
10444
10445
10446
10447
10448
10449 phba = (struct lpfc_hba *)dev_id;
10450
10451 if (unlikely(!phba))
10452 return IRQ_NONE;
10453
10454
10455
10456
10457
10458 if (phba->intr_type == MSIX) {
10459
10460 if (lpfc_intr_state_check(phba))
10461 return IRQ_NONE;
10462
10463 spin_lock_irqsave(&phba->hbalock, iflag);
10464 if (lpfc_readl(phba->HAregaddr, &ha_copy))
10465 goto unplug_error;
10466
10467
10468
10469 if (phba->link_flag & LS_IGNORE_ERATT)
10470 ha_copy &= ~HA_ERATT;
10471
10472 if (ha_copy & HA_ERATT) {
10473 if (phba->hba_flag & HBA_ERATT_HANDLED)
10474
10475 ha_copy &= ~HA_ERATT;
10476 else
10477
10478 phba->hba_flag |= HBA_ERATT_HANDLED;
10479 }
10480
10481
10482
10483
10484
10485 if (unlikely(phba->hba_flag & DEFER_ERATT)) {
10486 spin_unlock_irqrestore(&phba->hbalock, iflag);
10487 return IRQ_NONE;
10488 }
10489
10490
10491 if (lpfc_readl(phba->HCregaddr, &hc_copy))
10492 goto unplug_error;
10493
10494 writel(hc_copy & ~(HC_MBINT_ENA | HC_R2INT_ENA |
10495 HC_LAINT_ENA | HC_ERINT_ENA),
10496 phba->HCregaddr);
10497 writel((ha_copy & (HA_MBATT | HA_R2_CLR_MSK)),
10498 phba->HAregaddr);
10499 writel(hc_copy, phba->HCregaddr);
10500 readl(phba->HAregaddr);
10501 spin_unlock_irqrestore(&phba->hbalock, iflag);
10502 } else
10503 ha_copy = phba->ha_copy;
10504
10505 work_ha_copy = ha_copy & phba->work_ha_mask;
10506
10507 if (work_ha_copy) {
10508 if (work_ha_copy & HA_LATT) {
10509 if (phba->sli.sli_flag & LPFC_PROCESS_LA) {
10510
10511
10512
10513
10514 spin_lock_irqsave(&phba->hbalock, iflag);
10515 phba->sli.sli_flag &= ~LPFC_PROCESS_LA;
10516 if (lpfc_readl(phba->HCregaddr, &control))
10517 goto unplug_error;
10518 control &= ~HC_LAINT_ENA;
10519 writel(control, phba->HCregaddr);
10520 readl(phba->HCregaddr);
10521 spin_unlock_irqrestore(&phba->hbalock, iflag);
10522 }
10523 else
10524 work_ha_copy &= ~HA_LATT;
10525 }
10526
10527 if (work_ha_copy & ~(HA_ERATT | HA_MBATT | HA_LATT)) {
10528
10529
10530
10531
10532 status = (work_ha_copy &
10533 (HA_RXMASK << (4*LPFC_ELS_RING)));
10534 status >>= (4*LPFC_ELS_RING);
10535 if (status & HA_RXMASK) {
10536 spin_lock_irqsave(&phba->hbalock, iflag);
10537 if (lpfc_readl(phba->HCregaddr, &control))
10538 goto unplug_error;
10539
10540 lpfc_debugfs_slow_ring_trc(phba,
10541 "ISR slow ring: ctl:x%x stat:x%x isrcnt:x%x",
10542 control, status,
10543 (uint32_t)phba->sli.slistat.sli_intr);
10544
10545 if (control & (HC_R0INT_ENA << LPFC_ELS_RING)) {
10546 lpfc_debugfs_slow_ring_trc(phba,
10547 "ISR Disable ring:"
10548 "pwork:x%x hawork:x%x wait:x%x",
10549 phba->work_ha, work_ha_copy,
10550 (uint32_t)((unsigned long)
10551 &phba->work_waitq));
10552
10553 control &=
10554 ~(HC_R0INT_ENA << LPFC_ELS_RING);
10555 writel(control, phba->HCregaddr);
10556 readl(phba->HCregaddr);
10557 }
10558 else {
10559 lpfc_debugfs_slow_ring_trc(phba,
10560 "ISR slow ring: pwork:"
10561 "x%x hawork:x%x wait:x%x",
10562 phba->work_ha, work_ha_copy,
10563 (uint32_t)((unsigned long)
10564 &phba->work_waitq));
10565 }
10566 spin_unlock_irqrestore(&phba->hbalock, iflag);
10567 }
10568 }
10569 spin_lock_irqsave(&phba->hbalock, iflag);
10570 if (work_ha_copy & HA_ERATT) {
10571 if (lpfc_sli_read_hs(phba))
10572 goto unplug_error;
10573
10574
10575
10576
10577 if ((HS_FFER1 & phba->work_hs) &&
10578 ((HS_FFER2 | HS_FFER3 | HS_FFER4 | HS_FFER5 |
10579 HS_FFER6 | HS_FFER7 | HS_FFER8) &
10580 phba->work_hs)) {
10581 phba->hba_flag |= DEFER_ERATT;
10582
10583 writel(0, phba->HCregaddr);
10584 readl(phba->HCregaddr);
10585 }
10586 }
10587
10588 if ((work_ha_copy & HA_MBATT) && (phba->sli.mbox_active)) {
10589 pmb = phba->sli.mbox_active;
10590 pmbox = &pmb->u.mb;
10591 mbox = phba->mbox;
10592 vport = pmb->vport;
10593
10594
10595 lpfc_sli_pcimem_bcopy(mbox, pmbox, sizeof(uint32_t));
10596 if (pmbox->mbxOwner != OWN_HOST) {
10597 spin_unlock_irqrestore(&phba->hbalock, iflag);
10598
10599
10600
10601
10602 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX |
10603 LOG_SLI,
10604 "(%d):0304 Stray Mailbox "
10605 "Interrupt mbxCommand x%x "
10606 "mbxStatus x%x\n",
10607 (vport ? vport->vpi : 0),
10608 pmbox->mbxCommand,
10609 pmbox->mbxStatus);
10610
10611 work_ha_copy &= ~HA_MBATT;
10612 } else {
10613 phba->sli.mbox_active = NULL;
10614 spin_unlock_irqrestore(&phba->hbalock, iflag);
10615 phba->last_completion_time = jiffies;
10616 del_timer(&phba->sli.mbox_tmo);
10617 if (pmb->mbox_cmpl) {
10618 lpfc_sli_pcimem_bcopy(mbox, pmbox,
10619 MAILBOX_CMD_SIZE);
10620 if (pmb->out_ext_byte_len &&
10621 pmb->context2)
10622 lpfc_sli_pcimem_bcopy(
10623 phba->mbox_ext,
10624 pmb->context2,
10625 pmb->out_ext_byte_len);
10626 }
10627 if (pmb->mbox_flag & LPFC_MBX_IMED_UNREG) {
10628 pmb->mbox_flag &= ~LPFC_MBX_IMED_UNREG;
10629
10630 lpfc_debugfs_disc_trc(vport,
10631 LPFC_DISC_TRC_MBOX_VPORT,
10632 "MBOX dflt rpi: : "
10633 "status:x%x rpi:x%x",
10634 (uint32_t)pmbox->mbxStatus,
10635 pmbox->un.varWords[0], 0);
10636
10637 if (!pmbox->mbxStatus) {
10638 mp = (struct lpfc_dmabuf *)
10639 (pmb->context1);
10640 ndlp = (struct lpfc_nodelist *)
10641 pmb->context2;
10642
10643
10644
10645
10646
10647
10648 lpfc_unreg_login(phba,
10649 vport->vpi,
10650 pmbox->un.varWords[0],
10651 pmb);
10652 pmb->mbox_cmpl =
10653 lpfc_mbx_cmpl_dflt_rpi;
10654 pmb->context1 = mp;
10655 pmb->context2 = ndlp;
10656 pmb->vport = vport;
10657 rc = lpfc_sli_issue_mbox(phba,
10658 pmb,
10659 MBX_NOWAIT);
10660 if (rc != MBX_BUSY)
10661 lpfc_printf_log(phba,
10662 KERN_ERR,
10663 LOG_MBOX | LOG_SLI,
10664 "0350 rc should have"
10665 "been MBX_BUSY\n");
10666 if (rc != MBX_NOT_FINISHED)
10667 goto send_current_mbox;
10668 }
10669 }
10670 spin_lock_irqsave(
10671 &phba->pport->work_port_lock,
10672 iflag);
10673 phba->pport->work_port_events &=
10674 ~WORKER_MBOX_TMO;
10675 spin_unlock_irqrestore(
10676 &phba->pport->work_port_lock,
10677 iflag);
10678 lpfc_mbox_cmpl_put(phba, pmb);
10679 }
10680 } else
10681 spin_unlock_irqrestore(&phba->hbalock, iflag);
10682
10683 if ((work_ha_copy & HA_MBATT) &&
10684 (phba->sli.mbox_active == NULL)) {
10685send_current_mbox:
10686
10687 do {
10688 rc = lpfc_sli_issue_mbox(phba, NULL,
10689 MBX_NOWAIT);
10690 } while (rc == MBX_NOT_FINISHED);
10691 if (rc != MBX_SUCCESS)
10692 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX |
10693 LOG_SLI, "0349 rc should be "
10694 "MBX_SUCCESS\n");
10695 }
10696
10697 spin_lock_irqsave(&phba->hbalock, iflag);
10698 phba->work_ha |= work_ha_copy;
10699 spin_unlock_irqrestore(&phba->hbalock, iflag);
10700 lpfc_worker_wake_up(phba);
10701 }
10702 return IRQ_HANDLED;
10703unplug_error:
10704 spin_unlock_irqrestore(&phba->hbalock, iflag);
10705 return IRQ_HANDLED;
10706
10707}
10708
10709
10710
10711
10712
10713
10714
10715
10716
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726
10727
10728irqreturn_t
10729lpfc_sli_fp_intr_handler(int irq, void *dev_id)
10730{
10731 struct lpfc_hba *phba;
10732 uint32_t ha_copy;
10733 unsigned long status;
10734 unsigned long iflag;
10735
10736
10737
10738
10739 phba = (struct lpfc_hba *) dev_id;
10740
10741 if (unlikely(!phba))
10742 return IRQ_NONE;
10743
10744
10745
10746
10747
10748 if (phba->intr_type == MSIX) {
10749
10750 if (lpfc_intr_state_check(phba))
10751 return IRQ_NONE;
10752
10753 if (lpfc_readl(phba->HAregaddr, &ha_copy))
10754 return IRQ_HANDLED;
10755
10756 spin_lock_irqsave(&phba->hbalock, iflag);
10757
10758
10759
10760
10761 if (unlikely(phba->hba_flag & DEFER_ERATT)) {
10762 spin_unlock_irqrestore(&phba->hbalock, iflag);
10763 return IRQ_NONE;
10764 }
10765 writel((ha_copy & (HA_R0_CLR_MSK | HA_R1_CLR_MSK)),
10766 phba->HAregaddr);
10767 readl(phba->HAregaddr);
10768 spin_unlock_irqrestore(&phba->hbalock, iflag);
10769 } else
10770 ha_copy = phba->ha_copy;
10771
10772
10773
10774
10775 ha_copy &= ~(phba->work_ha_mask);
10776
10777 status = (ha_copy & (HA_RXMASK << (4*LPFC_FCP_RING)));
10778 status >>= (4*LPFC_FCP_RING);
10779 if (status & HA_RXMASK)
10780 lpfc_sli_handle_fast_ring_event(phba,
10781 &phba->sli.ring[LPFC_FCP_RING],
10782 status);
10783
10784 if (phba->cfg_multi_ring_support == 2) {
10785
10786
10787
10788
10789 status = (ha_copy & (HA_RXMASK << (4*LPFC_EXTRA_RING)));
10790 status >>= (4*LPFC_EXTRA_RING);
10791 if (status & HA_RXMASK) {
10792 lpfc_sli_handle_fast_ring_event(phba,
10793 &phba->sli.ring[LPFC_EXTRA_RING],
10794 status);
10795 }
10796 }
10797 return IRQ_HANDLED;
10798}
10799
10800
10801
10802
10803
10804
10805
10806
10807
10808
10809
10810
10811
10812
10813
10814
10815
10816
10817irqreturn_t
10818lpfc_sli_intr_handler(int irq, void *dev_id)
10819{
10820 struct lpfc_hba *phba;
10821 irqreturn_t sp_irq_rc, fp_irq_rc;
10822 unsigned long status1, status2;
10823 uint32_t hc_copy;
10824
10825
10826
10827
10828
10829 phba = (struct lpfc_hba *) dev_id;
10830
10831 if (unlikely(!phba))
10832 return IRQ_NONE;
10833
10834
10835 if (lpfc_intr_state_check(phba))
10836 return IRQ_NONE;
10837
10838 spin_lock(&phba->hbalock);
10839 if (lpfc_readl(phba->HAregaddr, &phba->ha_copy)) {
10840 spin_unlock(&phba->hbalock);
10841 return IRQ_HANDLED;
10842 }
10843
10844 if (unlikely(!phba->ha_copy)) {
10845 spin_unlock(&phba->hbalock);
10846 return IRQ_NONE;
10847 } else if (phba->ha_copy & HA_ERATT) {
10848 if (phba->hba_flag & HBA_ERATT_HANDLED)
10849
10850 phba->ha_copy &= ~HA_ERATT;
10851 else
10852
10853 phba->hba_flag |= HBA_ERATT_HANDLED;
10854 }
10855
10856
10857
10858
10859 if (unlikely(phba->hba_flag & DEFER_ERATT)) {
10860 spin_unlock(&phba->hbalock);
10861 return IRQ_NONE;
10862 }
10863
10864
10865 if (lpfc_readl(phba->HCregaddr, &hc_copy)) {
10866 spin_unlock(&phba->hbalock);
10867 return IRQ_HANDLED;
10868 }
10869 writel(hc_copy & ~(HC_MBINT_ENA | HC_R0INT_ENA | HC_R1INT_ENA
10870 | HC_R2INT_ENA | HC_LAINT_ENA | HC_ERINT_ENA),
10871 phba->HCregaddr);
10872 writel((phba->ha_copy & ~(HA_LATT | HA_ERATT)), phba->HAregaddr);
10873 writel(hc_copy, phba->HCregaddr);
10874 readl(phba->HAregaddr);
10875 spin_unlock(&phba->hbalock);
10876
10877
10878
10879
10880
10881
10882 status1 = phba->ha_copy & (HA_MBATT | HA_LATT | HA_ERATT);
10883
10884
10885 status2 = (phba->ha_copy & (HA_RXMASK << (4*LPFC_ELS_RING)));
10886 status2 >>= (4*LPFC_ELS_RING);
10887
10888 if (status1 || (status2 & HA_RXMASK))
10889 sp_irq_rc = lpfc_sli_sp_intr_handler(irq, dev_id);
10890 else
10891 sp_irq_rc = IRQ_NONE;
10892
10893
10894
10895
10896
10897
10898 status1 = (phba->ha_copy & (HA_RXMASK << (4*LPFC_FCP_RING)));
10899 status1 >>= (4*LPFC_FCP_RING);
10900
10901
10902 if (phba->cfg_multi_ring_support == 2) {
10903 status2 = (phba->ha_copy & (HA_RXMASK << (4*LPFC_EXTRA_RING)));
10904 status2 >>= (4*LPFC_EXTRA_RING);
10905 } else
10906 status2 = 0;
10907
10908 if ((status1 & HA_RXMASK) || (status2 & HA_RXMASK))
10909 fp_irq_rc = lpfc_sli_fp_intr_handler(irq, dev_id);
10910 else
10911 fp_irq_rc = IRQ_NONE;
10912
10913
10914 return (sp_irq_rc == IRQ_HANDLED) ? sp_irq_rc : fp_irq_rc;
10915}
10916
10917
10918
10919
10920
10921
10922
10923
10924void lpfc_sli4_fcp_xri_abort_event_proc(struct lpfc_hba *phba)
10925{
10926 struct lpfc_cq_event *cq_event;
10927
10928
10929 spin_lock_irq(&phba->hbalock);
10930 phba->hba_flag &= ~FCP_XRI_ABORT_EVENT;
10931 spin_unlock_irq(&phba->hbalock);
10932
10933 while (!list_empty(&phba->sli4_hba.sp_fcp_xri_aborted_work_queue)) {
10934
10935 spin_lock_irq(&phba->hbalock);
10936 list_remove_head(&phba->sli4_hba.sp_fcp_xri_aborted_work_queue,
10937 cq_event, struct lpfc_cq_event, list);
10938 spin_unlock_irq(&phba->hbalock);
10939
10940 lpfc_sli4_fcp_xri_aborted(phba, &cq_event->cqe.wcqe_axri);
10941
10942 lpfc_sli4_cq_event_release(phba, cq_event);
10943 }
10944}
10945
10946
10947
10948
10949
10950
10951
10952
10953void lpfc_sli4_els_xri_abort_event_proc(struct lpfc_hba *phba)
10954{
10955 struct lpfc_cq_event *cq_event;
10956
10957
10958 spin_lock_irq(&phba->hbalock);
10959 phba->hba_flag &= ~ELS_XRI_ABORT_EVENT;
10960 spin_unlock_irq(&phba->hbalock);
10961
10962 while (!list_empty(&phba->sli4_hba.sp_els_xri_aborted_work_queue)) {
10963
10964 spin_lock_irq(&phba->hbalock);
10965 list_remove_head(&phba->sli4_hba.sp_els_xri_aborted_work_queue,
10966 cq_event, struct lpfc_cq_event, list);
10967 spin_unlock_irq(&phba->hbalock);
10968
10969 lpfc_sli4_els_xri_aborted(phba, &cq_event->cqe.wcqe_axri);
10970
10971 lpfc_sli4_cq_event_release(phba, cq_event);
10972 }
10973}
10974
10975
10976
10977
10978
10979
10980
10981
10982
10983
10984
10985
10986static void
10987lpfc_sli4_iocb_param_transfer(struct lpfc_hba *phba,
10988 struct lpfc_iocbq *pIocbIn,
10989 struct lpfc_iocbq *pIocbOut,
10990 struct lpfc_wcqe_complete *wcqe)
10991{
10992 unsigned long iflags;
10993 uint32_t status;
10994 size_t offset = offsetof(struct lpfc_iocbq, iocb);
10995
10996 memcpy((char *)pIocbIn + offset, (char *)pIocbOut + offset,
10997 sizeof(struct lpfc_iocbq) - offset);
10998
10999 status = bf_get(lpfc_wcqe_c_status, wcqe);
11000 pIocbIn->iocb.ulpStatus = (status & LPFC_IOCB_STATUS_MASK);
11001 if (pIocbOut->iocb_flag & LPFC_IO_FCP)
11002 if (pIocbIn->iocb.ulpStatus == IOSTAT_FCP_RSP_ERROR)
11003 pIocbIn->iocb.un.fcpi.fcpi_parm =
11004 pIocbOut->iocb.un.fcpi.fcpi_parm -
11005 wcqe->total_data_placed;
11006 else
11007 pIocbIn->iocb.un.ulpWord[4] = wcqe->parameter;
11008 else {
11009 pIocbIn->iocb.un.ulpWord[4] = wcqe->parameter;
11010 pIocbIn->iocb.un.genreq64.bdl.bdeSize = wcqe->total_data_placed;
11011 }
11012
11013
11014 if (status == CQE_STATUS_DI_ERROR) {
11015 pIocbIn->iocb.ulpStatus = IOSTAT_LOCAL_REJECT;
11016
11017 if (bf_get(lpfc_wcqe_c_bg_edir, wcqe))
11018 pIocbIn->iocb.un.ulpWord[4] = IOERR_RX_DMA_FAILED;
11019 else
11020 pIocbIn->iocb.un.ulpWord[4] = IOERR_TX_DMA_FAILED;
11021
11022 pIocbIn->iocb.unsli3.sli3_bg.bgstat = 0;
11023 if (bf_get(lpfc_wcqe_c_bg_ge, wcqe))
11024 pIocbIn->iocb.unsli3.sli3_bg.bgstat |=
11025 BGS_GUARD_ERR_MASK;
11026 if (bf_get(lpfc_wcqe_c_bg_ae, wcqe))
11027 pIocbIn->iocb.unsli3.sli3_bg.bgstat |=
11028 BGS_APPTAG_ERR_MASK;
11029 if (bf_get(lpfc_wcqe_c_bg_re, wcqe))
11030 pIocbIn->iocb.unsli3.sli3_bg.bgstat |=
11031 BGS_REFTAG_ERR_MASK;
11032
11033
11034 if (bf_get(lpfc_wcqe_c_bg_tdpv, wcqe)) {
11035 pIocbIn->iocb.unsli3.sli3_bg.bgstat |=
11036 BGS_HI_WATER_MARK_PRESENT_MASK;
11037 pIocbIn->iocb.unsli3.sli3_bg.bghm =
11038 wcqe->total_data_placed;
11039 }
11040
11041
11042
11043
11044
11045 if (!pIocbIn->iocb.unsli3.sli3_bg.bgstat)
11046 pIocbIn->iocb.unsli3.sli3_bg.bgstat |=
11047 (BGS_REFTAG_ERR_MASK | BGS_APPTAG_ERR_MASK |
11048 BGS_GUARD_ERR_MASK);
11049 }
11050
11051
11052 if (bf_get(lpfc_wcqe_c_xb, wcqe)) {
11053 spin_lock_irqsave(&phba->hbalock, iflags);
11054 pIocbIn->iocb_flag |= LPFC_EXCHANGE_BUSY;
11055 spin_unlock_irqrestore(&phba->hbalock, iflags);
11056 }
11057}
11058
11059
11060
11061
11062
11063
11064
11065
11066
11067
11068
11069
11070static struct lpfc_iocbq *
11071lpfc_sli4_els_wcqe_to_rspiocbq(struct lpfc_hba *phba,
11072 struct lpfc_iocbq *irspiocbq)
11073{
11074 struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
11075 struct lpfc_iocbq *cmdiocbq;
11076 struct lpfc_wcqe_complete *wcqe;
11077 unsigned long iflags;
11078
11079 wcqe = &irspiocbq->cq_event.cqe.wcqe_cmpl;
11080 spin_lock_irqsave(&pring->ring_lock, iflags);
11081 pring->stats.iocb_event++;
11082
11083 cmdiocbq = lpfc_sli_iocbq_lookup_by_tag(phba, pring,
11084 bf_get(lpfc_wcqe_c_request_tag, wcqe));
11085 spin_unlock_irqrestore(&pring->ring_lock, iflags);
11086
11087 if (unlikely(!cmdiocbq)) {
11088 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
11089 "0386 ELS complete with no corresponding "
11090 "cmdiocb: iotag (%d)\n",
11091 bf_get(lpfc_wcqe_c_request_tag, wcqe));
11092 lpfc_sli_release_iocbq(phba, irspiocbq);
11093 return NULL;
11094 }
11095
11096
11097 lpfc_sli4_iocb_param_transfer(phba, irspiocbq, cmdiocbq, wcqe);
11098
11099 return irspiocbq;
11100}
11101
11102
11103
11104
11105
11106
11107
11108
11109
11110
11111
11112static bool
11113lpfc_sli4_sp_handle_async_event(struct lpfc_hba *phba, struct lpfc_mcqe *mcqe)
11114{
11115 struct lpfc_cq_event *cq_event;
11116 unsigned long iflags;
11117
11118 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
11119 "0392 Async Event: word0:x%x, word1:x%x, "
11120 "word2:x%x, word3:x%x\n", mcqe->word0,
11121 mcqe->mcqe_tag0, mcqe->mcqe_tag1, mcqe->trailer);
11122
11123
11124 cq_event = lpfc_sli4_cq_event_alloc(phba);
11125 if (!cq_event) {
11126 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11127 "0394 Failed to allocate CQ_EVENT entry\n");
11128 return false;
11129 }
11130
11131
11132 memcpy(&cq_event->cqe, mcqe, sizeof(struct lpfc_mcqe));
11133 spin_lock_irqsave(&phba->hbalock, iflags);
11134 list_add_tail(&cq_event->list, &phba->sli4_hba.sp_asynce_work_queue);
11135
11136 phba->hba_flag |= ASYNC_EVENT;
11137 spin_unlock_irqrestore(&phba->hbalock, iflags);
11138
11139 return true;
11140}
11141
11142
11143
11144
11145
11146
11147
11148
11149
11150
11151
11152static bool
11153lpfc_sli4_sp_handle_mbox_event(struct lpfc_hba *phba, struct lpfc_mcqe *mcqe)
11154{
11155 uint32_t mcqe_status;
11156 MAILBOX_t *mbox, *pmbox;
11157 struct lpfc_mqe *mqe;
11158 struct lpfc_vport *vport;
11159 struct lpfc_nodelist *ndlp;
11160 struct lpfc_dmabuf *mp;
11161 unsigned long iflags;
11162 LPFC_MBOXQ_t *pmb;
11163 bool workposted = false;
11164 int rc;
11165
11166
11167 if (!bf_get(lpfc_trailer_completed, mcqe))
11168 goto out_no_mqe_complete;
11169
11170
11171 spin_lock_irqsave(&phba->hbalock, iflags);
11172 pmb = phba->sli.mbox_active;
11173 if (unlikely(!pmb)) {
11174 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
11175 "1832 No pending MBOX command to handle\n");
11176 spin_unlock_irqrestore(&phba->hbalock, iflags);
11177 goto out_no_mqe_complete;
11178 }
11179 spin_unlock_irqrestore(&phba->hbalock, iflags);
11180 mqe = &pmb->u.mqe;
11181 pmbox = (MAILBOX_t *)&pmb->u.mqe;
11182 mbox = phba->mbox;
11183 vport = pmb->vport;
11184
11185
11186 phba->last_completion_time = jiffies;
11187 del_timer(&phba->sli.mbox_tmo);
11188
11189
11190 if (pmb->mbox_cmpl && mbox)
11191 lpfc_sli_pcimem_bcopy(mbox, mqe, sizeof(struct lpfc_mqe));
11192
11193
11194
11195
11196
11197 mcqe_status = bf_get(lpfc_mcqe_status, mcqe);
11198 if (mcqe_status != MB_CQE_STATUS_SUCCESS) {
11199 if (bf_get(lpfc_mqe_status, mqe) == MBX_SUCCESS)
11200 bf_set(lpfc_mqe_status, mqe,
11201 (LPFC_MBX_ERROR_RANGE | mcqe_status));
11202 }
11203 if (pmb->mbox_flag & LPFC_MBX_IMED_UNREG) {
11204 pmb->mbox_flag &= ~LPFC_MBX_IMED_UNREG;
11205 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_MBOX_VPORT,
11206 "MBOX dflt rpi: status:x%x rpi:x%x",
11207 mcqe_status,
11208 pmbox->un.varWords[0], 0);
11209 if (mcqe_status == MB_CQE_STATUS_SUCCESS) {
11210 mp = (struct lpfc_dmabuf *)(pmb->context1);
11211 ndlp = (struct lpfc_nodelist *)pmb->context2;
11212
11213
11214
11215 lpfc_unreg_login(phba, vport->vpi,
11216 pmbox->un.varWords[0], pmb);
11217 pmb->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi;
11218 pmb->context1 = mp;
11219 pmb->context2 = ndlp;
11220 pmb->vport = vport;
11221 rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
11222 if (rc != MBX_BUSY)
11223 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX |
11224 LOG_SLI, "0385 rc should "
11225 "have been MBX_BUSY\n");
11226 if (rc != MBX_NOT_FINISHED)
11227 goto send_current_mbox;
11228 }
11229 }
11230 spin_lock_irqsave(&phba->pport->work_port_lock, iflags);
11231 phba->pport->work_port_events &= ~WORKER_MBOX_TMO;
11232 spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags);
11233
11234
11235 spin_lock_irqsave(&phba->hbalock, iflags);
11236 __lpfc_mbox_cmpl_put(phba, pmb);
11237 phba->work_ha |= HA_MBATT;
11238 spin_unlock_irqrestore(&phba->hbalock, iflags);
11239 workposted = true;
11240
11241send_current_mbox:
11242 spin_lock_irqsave(&phba->hbalock, iflags);
11243
11244 phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
11245
11246 phba->sli.mbox_active = NULL;
11247 spin_unlock_irqrestore(&phba->hbalock, iflags);
11248
11249 lpfc_worker_wake_up(phba);
11250out_no_mqe_complete:
11251 if (bf_get(lpfc_trailer_consumed, mcqe))
11252 lpfc_sli4_mq_release(phba->sli4_hba.mbx_wq);
11253 return workposted;
11254}
11255
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266
11267static bool
11268lpfc_sli4_sp_handle_mcqe(struct lpfc_hba *phba, struct lpfc_cqe *cqe)
11269{
11270 struct lpfc_mcqe mcqe;
11271 bool workposted;
11272
11273
11274 lpfc_sli_pcimem_bcopy(cqe, &mcqe, sizeof(struct lpfc_mcqe));
11275
11276
11277 if (!bf_get(lpfc_trailer_async, &mcqe))
11278 workposted = lpfc_sli4_sp_handle_mbox_event(phba, &mcqe);
11279 else
11280 workposted = lpfc_sli4_sp_handle_async_event(phba, &mcqe);
11281 return workposted;
11282}
11283
11284
11285
11286
11287
11288
11289
11290
11291
11292
11293
11294static bool
11295lpfc_sli4_sp_handle_els_wcqe(struct lpfc_hba *phba, struct lpfc_queue *cq,
11296 struct lpfc_wcqe_complete *wcqe)
11297{
11298 struct lpfc_iocbq *irspiocbq;
11299 unsigned long iflags;
11300 struct lpfc_sli_ring *pring = cq->pring;
11301
11302
11303 irspiocbq = lpfc_sli_get_iocbq(phba);
11304 if (!irspiocbq) {
11305 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11306 "0387 NO IOCBQ data: txq_cnt=%d iocb_cnt=%d "
11307 "fcp_txcmplq_cnt=%d, els_txcmplq_cnt=%d\n",
11308 pring->txq_cnt, phba->iocb_cnt,
11309 phba->sli.ring[LPFC_FCP_RING].txcmplq_cnt,
11310 phba->sli.ring[LPFC_ELS_RING].txcmplq_cnt);
11311 return false;
11312 }
11313
11314
11315 memcpy(&irspiocbq->cq_event.cqe.wcqe_cmpl, wcqe, sizeof(*wcqe));
11316 spin_lock_irqsave(&phba->hbalock, iflags);
11317 list_add_tail(&irspiocbq->cq_event.list,
11318 &phba->sli4_hba.sp_queue_event);
11319 phba->hba_flag |= HBA_SP_QUEUE_EVT;
11320 spin_unlock_irqrestore(&phba->hbalock, iflags);
11321
11322 return true;
11323}
11324
11325
11326
11327
11328
11329
11330
11331
11332
11333static void
11334lpfc_sli4_sp_handle_rel_wcqe(struct lpfc_hba *phba,
11335 struct lpfc_wcqe_release *wcqe)
11336{
11337
11338 if (unlikely(!phba->sli4_hba.els_wq))
11339 return;
11340
11341 if (bf_get(lpfc_wcqe_r_wq_id, wcqe) == phba->sli4_hba.els_wq->queue_id)
11342 lpfc_sli4_wq_release(phba->sli4_hba.els_wq,
11343 bf_get(lpfc_wcqe_r_wqe_index, wcqe));
11344 else
11345 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
11346 "2579 Slow-path wqe consume event carries "
11347 "miss-matched qid: wcqe-qid=x%x, sp-qid=x%x\n",
11348 bf_get(lpfc_wcqe_r_wqe_index, wcqe),
11349 phba->sli4_hba.els_wq->queue_id);
11350}
11351
11352
11353
11354
11355
11356
11357
11358
11359
11360
11361
11362static bool
11363lpfc_sli4_sp_handle_abort_xri_wcqe(struct lpfc_hba *phba,
11364 struct lpfc_queue *cq,
11365 struct sli4_wcqe_xri_aborted *wcqe)
11366{
11367 bool workposted = false;
11368 struct lpfc_cq_event *cq_event;
11369 unsigned long iflags;
11370
11371
11372 cq_event = lpfc_sli4_cq_event_alloc(phba);
11373 if (!cq_event) {
11374 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11375 "0602 Failed to allocate CQ_EVENT entry\n");
11376 return false;
11377 }
11378
11379
11380 memcpy(&cq_event->cqe, wcqe, sizeof(struct sli4_wcqe_xri_aborted));
11381 switch (cq->subtype) {
11382 case LPFC_FCP:
11383 spin_lock_irqsave(&phba->hbalock, iflags);
11384 list_add_tail(&cq_event->list,
11385 &phba->sli4_hba.sp_fcp_xri_aborted_work_queue);
11386
11387 phba->hba_flag |= FCP_XRI_ABORT_EVENT;
11388 spin_unlock_irqrestore(&phba->hbalock, iflags);
11389 workposted = true;
11390 break;
11391 case LPFC_ELS:
11392 spin_lock_irqsave(&phba->hbalock, iflags);
11393 list_add_tail(&cq_event->list,
11394 &phba->sli4_hba.sp_els_xri_aborted_work_queue);
11395
11396 phba->hba_flag |= ELS_XRI_ABORT_EVENT;
11397 spin_unlock_irqrestore(&phba->hbalock, iflags);
11398 workposted = true;
11399 break;
11400 default:
11401 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11402 "0603 Invalid work queue CQE subtype (x%x)\n",
11403 cq->subtype);
11404 workposted = false;
11405 break;
11406 }
11407 return workposted;
11408}
11409
11410
11411
11412
11413
11414
11415
11416
11417
11418
11419static bool
11420lpfc_sli4_sp_handle_rcqe(struct lpfc_hba *phba, struct lpfc_rcqe *rcqe)
11421{
11422 bool workposted = false;
11423 struct lpfc_queue *hrq = phba->sli4_hba.hdr_rq;
11424 struct lpfc_queue *drq = phba->sli4_hba.dat_rq;
11425 struct hbq_dmabuf *dma_buf;
11426 uint32_t status, rq_id;
11427 unsigned long iflags;
11428
11429
11430 if (unlikely(!hrq) || unlikely(!drq))
11431 return workposted;
11432
11433 if (bf_get(lpfc_cqe_code, rcqe) == CQE_CODE_RECEIVE_V1)
11434 rq_id = bf_get(lpfc_rcqe_rq_id_v1, rcqe);
11435 else
11436 rq_id = bf_get(lpfc_rcqe_rq_id, rcqe);
11437 if (rq_id != hrq->queue_id)
11438 goto out;
11439
11440 status = bf_get(lpfc_rcqe_status, rcqe);
11441 switch (status) {
11442 case FC_STATUS_RQ_BUF_LEN_EXCEEDED:
11443 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11444 "2537 Receive Frame Truncated!!\n");
11445 hrq->RQ_buf_trunc++;
11446 case FC_STATUS_RQ_SUCCESS:
11447 lpfc_sli4_rq_release(hrq, drq);
11448 spin_lock_irqsave(&phba->hbalock, iflags);
11449 dma_buf = lpfc_sli_hbqbuf_get(&phba->hbqs[0].hbq_buffer_list);
11450 if (!dma_buf) {
11451 hrq->RQ_no_buf_found++;
11452 spin_unlock_irqrestore(&phba->hbalock, iflags);
11453 goto out;
11454 }
11455 hrq->RQ_rcv_buf++;
11456 memcpy(&dma_buf->cq_event.cqe.rcqe_cmpl, rcqe, sizeof(*rcqe));
11457
11458 list_add_tail(&dma_buf->cq_event.list,
11459 &phba->sli4_hba.sp_queue_event);
11460
11461 phba->hba_flag |= HBA_SP_QUEUE_EVT;
11462 spin_unlock_irqrestore(&phba->hbalock, iflags);
11463 workposted = true;
11464 break;
11465 case FC_STATUS_INSUFF_BUF_NEED_BUF:
11466 case FC_STATUS_INSUFF_BUF_FRM_DISC:
11467 hrq->RQ_no_posted_buf++;
11468
11469 spin_lock_irqsave(&phba->hbalock, iflags);
11470 phba->hba_flag |= HBA_POST_RECEIVE_BUFFER;
11471 spin_unlock_irqrestore(&phba->hbalock, iflags);
11472 workposted = true;
11473 break;
11474 }
11475out:
11476 return workposted;
11477}
11478
11479
11480
11481
11482
11483
11484
11485
11486
11487
11488
11489
11490static bool
11491lpfc_sli4_sp_handle_cqe(struct lpfc_hba *phba, struct lpfc_queue *cq,
11492 struct lpfc_cqe *cqe)
11493{
11494 struct lpfc_cqe cqevt;
11495 bool workposted = false;
11496
11497
11498 lpfc_sli_pcimem_bcopy(cqe, &cqevt, sizeof(struct lpfc_cqe));
11499
11500
11501 switch (bf_get(lpfc_cqe_code, &cqevt)) {
11502 case CQE_CODE_COMPL_WQE:
11503
11504 phba->last_completion_time = jiffies;
11505 workposted = lpfc_sli4_sp_handle_els_wcqe(phba, cq,
11506 (struct lpfc_wcqe_complete *)&cqevt);
11507 break;
11508 case CQE_CODE_RELEASE_WQE:
11509
11510 lpfc_sli4_sp_handle_rel_wcqe(phba,
11511 (struct lpfc_wcqe_release *)&cqevt);
11512 break;
11513 case CQE_CODE_XRI_ABORTED:
11514
11515 phba->last_completion_time = jiffies;
11516 workposted = lpfc_sli4_sp_handle_abort_xri_wcqe(phba, cq,
11517 (struct sli4_wcqe_xri_aborted *)&cqevt);
11518 break;
11519 case CQE_CODE_RECEIVE:
11520 case CQE_CODE_RECEIVE_V1:
11521
11522 phba->last_completion_time = jiffies;
11523 workposted = lpfc_sli4_sp_handle_rcqe(phba,
11524 (struct lpfc_rcqe *)&cqevt);
11525 break;
11526 default:
11527 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11528 "0388 Not a valid WCQE code: x%x\n",
11529 bf_get(lpfc_cqe_code, &cqevt));
11530 break;
11531 }
11532 return workposted;
11533}
11534
11535
11536
11537
11538
11539
11540
11541
11542
11543
11544
11545
11546
11547
11548static void
11549lpfc_sli4_sp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe,
11550 struct lpfc_queue *speq)
11551{
11552 struct lpfc_queue *cq = NULL, *childq;
11553 struct lpfc_cqe *cqe;
11554 bool workposted = false;
11555 int ecount = 0;
11556 uint16_t cqid;
11557
11558
11559 cqid = bf_get_le32(lpfc_eqe_resource_id, eqe);
11560
11561 list_for_each_entry(childq, &speq->child_list, list) {
11562 if (childq->queue_id == cqid) {
11563 cq = childq;
11564 break;
11565 }
11566 }
11567 if (unlikely(!cq)) {
11568 if (phba->sli.sli_flag & LPFC_SLI_ACTIVE)
11569 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11570 "0365 Slow-path CQ identifier "
11571 "(%d) does not exist\n", cqid);
11572 return;
11573 }
11574
11575
11576 switch (cq->type) {
11577 case LPFC_MCQ:
11578 while ((cqe = lpfc_sli4_cq_get(cq))) {
11579 workposted |= lpfc_sli4_sp_handle_mcqe(phba, cqe);
11580 if (!(++ecount % cq->entry_repost))
11581 lpfc_sli4_cq_release(cq, LPFC_QUEUE_NOARM);
11582 cq->CQ_mbox++;
11583 }
11584 break;
11585 case LPFC_WCQ:
11586 while ((cqe = lpfc_sli4_cq_get(cq))) {
11587 if (cq->subtype == LPFC_FCP)
11588 workposted |= lpfc_sli4_fp_handle_wcqe(phba, cq,
11589 cqe);
11590 else
11591 workposted |= lpfc_sli4_sp_handle_cqe(phba, cq,
11592 cqe);
11593 if (!(++ecount % cq->entry_repost))
11594 lpfc_sli4_cq_release(cq, LPFC_QUEUE_NOARM);
11595 }
11596
11597
11598 if (ecount > cq->CQ_max_cqe)
11599 cq->CQ_max_cqe = ecount;
11600 break;
11601 default:
11602 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11603 "0370 Invalid completion queue type (%d)\n",
11604 cq->type);
11605 return;
11606 }
11607
11608
11609 if (unlikely(ecount == 0))
11610 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11611 "0371 No entry from the CQ: identifier "
11612 "(x%x), type (%d)\n", cq->queue_id, cq->type);
11613
11614
11615 lpfc_sli4_cq_release(cq, LPFC_QUEUE_REARM);
11616
11617
11618 if (workposted)
11619 lpfc_worker_wake_up(phba);
11620}
11621
11622
11623
11624
11625
11626
11627
11628
11629
11630
11631static void
11632lpfc_sli4_fp_handle_fcp_wcqe(struct lpfc_hba *phba, struct lpfc_queue *cq,
11633 struct lpfc_wcqe_complete *wcqe)
11634{
11635 struct lpfc_sli_ring *pring = cq->pring;
11636 struct lpfc_iocbq *cmdiocbq;
11637 struct lpfc_iocbq irspiocbq;
11638 unsigned long iflags;
11639
11640
11641 if (unlikely(bf_get(lpfc_wcqe_c_status, wcqe))) {
11642
11643
11644
11645 if (((bf_get(lpfc_wcqe_c_status, wcqe) ==
11646 IOSTAT_LOCAL_REJECT)) &&
11647 ((wcqe->parameter & IOERR_PARAM_MASK) ==
11648 IOERR_NO_RESOURCES))
11649 phba->lpfc_rampdown_queue_depth(phba);
11650
11651
11652 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
11653 "0373 FCP complete error: status=x%x, "
11654 "hw_status=x%x, total_data_specified=%d, "
11655 "parameter=x%x, word3=x%x\n",
11656 bf_get(lpfc_wcqe_c_status, wcqe),
11657 bf_get(lpfc_wcqe_c_hw_status, wcqe),
11658 wcqe->total_data_placed, wcqe->parameter,
11659 wcqe->word3);
11660 }
11661
11662
11663 spin_lock_irqsave(&pring->ring_lock, iflags);
11664 pring->stats.iocb_event++;
11665 cmdiocbq = lpfc_sli_iocbq_lookup_by_tag(phba, pring,
11666 bf_get(lpfc_wcqe_c_request_tag, wcqe));
11667 spin_unlock_irqrestore(&pring->ring_lock, iflags);
11668 if (unlikely(!cmdiocbq)) {
11669 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
11670 "0374 FCP complete with no corresponding "
11671 "cmdiocb: iotag (%d)\n",
11672 bf_get(lpfc_wcqe_c_request_tag, wcqe));
11673 return;
11674 }
11675 if (unlikely(!cmdiocbq->iocb_cmpl)) {
11676 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
11677 "0375 FCP cmdiocb not callback function "
11678 "iotag: (%d)\n",
11679 bf_get(lpfc_wcqe_c_request_tag, wcqe));
11680 return;
11681 }
11682
11683
11684 lpfc_sli4_iocb_param_transfer(phba, &irspiocbq, cmdiocbq, wcqe);
11685
11686 if (cmdiocbq->iocb_flag & LPFC_DRIVER_ABORTED) {
11687 spin_lock_irqsave(&phba->hbalock, iflags);
11688 cmdiocbq->iocb_flag &= ~LPFC_DRIVER_ABORTED;
11689 spin_unlock_irqrestore(&phba->hbalock, iflags);
11690 }
11691
11692
11693 (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, &irspiocbq);
11694}
11695
11696
11697
11698
11699
11700
11701
11702
11703
11704
11705static void
11706lpfc_sli4_fp_handle_rel_wcqe(struct lpfc_hba *phba, struct lpfc_queue *cq,
11707 struct lpfc_wcqe_release *wcqe)
11708{
11709 struct lpfc_queue *childwq;
11710 bool wqid_matched = false;
11711 uint16_t fcp_wqid;
11712
11713
11714 fcp_wqid = bf_get(lpfc_wcqe_r_wq_id, wcqe);
11715 list_for_each_entry(childwq, &cq->child_list, list) {
11716 if (childwq->queue_id == fcp_wqid) {
11717 lpfc_sli4_wq_release(childwq,
11718 bf_get(lpfc_wcqe_r_wqe_index, wcqe));
11719 wqid_matched = true;
11720 break;
11721 }
11722 }
11723
11724 if (wqid_matched != true)
11725 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
11726 "2580 Fast-path wqe consume event carries "
11727 "miss-matched qid: wcqe-qid=x%x\n", fcp_wqid);
11728}
11729
11730
11731
11732
11733
11734
11735
11736
11737
11738static int
11739lpfc_sli4_fp_handle_wcqe(struct lpfc_hba *phba, struct lpfc_queue *cq,
11740 struct lpfc_cqe *cqe)
11741{
11742 struct lpfc_wcqe_release wcqe;
11743 bool workposted = false;
11744
11745
11746 lpfc_sli_pcimem_bcopy(cqe, &wcqe, sizeof(struct lpfc_cqe));
11747
11748
11749 switch (bf_get(lpfc_wcqe_c_code, &wcqe)) {
11750 case CQE_CODE_COMPL_WQE:
11751 cq->CQ_wq++;
11752
11753 phba->last_completion_time = jiffies;
11754 lpfc_sli4_fp_handle_fcp_wcqe(phba, cq,
11755 (struct lpfc_wcqe_complete *)&wcqe);
11756 break;
11757 case CQE_CODE_RELEASE_WQE:
11758 cq->CQ_release_wqe++;
11759
11760 lpfc_sli4_fp_handle_rel_wcqe(phba, cq,
11761 (struct lpfc_wcqe_release *)&wcqe);
11762 break;
11763 case CQE_CODE_XRI_ABORTED:
11764 cq->CQ_xri_aborted++;
11765
11766 phba->last_completion_time = jiffies;
11767 workposted = lpfc_sli4_sp_handle_abort_xri_wcqe(phba, cq,
11768 (struct sli4_wcqe_xri_aborted *)&wcqe);
11769 break;
11770 default:
11771 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11772 "0144 Not a valid WCQE code: x%x\n",
11773 bf_get(lpfc_wcqe_c_code, &wcqe));
11774 break;
11775 }
11776 return workposted;
11777}
11778
11779
11780
11781
11782
11783
11784
11785
11786
11787
11788
11789
11790
11791static void
11792lpfc_sli4_hba_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe,
11793 uint32_t qidx)
11794{
11795 struct lpfc_queue *cq;
11796 struct lpfc_cqe *cqe;
11797 bool workposted = false;
11798 uint16_t cqid;
11799 int ecount = 0;
11800
11801 if (unlikely(bf_get_le32(lpfc_eqe_major_code, eqe) != 0)) {
11802 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11803 "0366 Not a valid completion "
11804 "event: majorcode=x%x, minorcode=x%x\n",
11805 bf_get_le32(lpfc_eqe_major_code, eqe),
11806 bf_get_le32(lpfc_eqe_minor_code, eqe));
11807 return;
11808 }
11809
11810
11811 cqid = bf_get_le32(lpfc_eqe_resource_id, eqe);
11812
11813
11814 if (unlikely(cqid != phba->sli4_hba.fcp_cq_map[qidx])) {
11815 lpfc_sli4_sp_handle_eqe(phba, eqe,
11816 phba->sli4_hba.hba_eq[qidx]);
11817 return;
11818 }
11819
11820 if (unlikely(!phba->sli4_hba.fcp_cq)) {
11821 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
11822 "3146 Fast-path completion queues "
11823 "does not exist\n");
11824 return;
11825 }
11826 cq = phba->sli4_hba.fcp_cq[qidx];
11827 if (unlikely(!cq)) {
11828 if (phba->sli.sli_flag & LPFC_SLI_ACTIVE)
11829 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11830 "0367 Fast-path completion queue "
11831 "(%d) does not exist\n", qidx);
11832 return;
11833 }
11834
11835 if (unlikely(cqid != cq->queue_id)) {
11836 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11837 "0368 Miss-matched fast-path completion "
11838 "queue identifier: eqcqid=%d, fcpcqid=%d\n",
11839 cqid, cq->queue_id);
11840 return;
11841 }
11842
11843
11844 while ((cqe = lpfc_sli4_cq_get(cq))) {
11845 workposted |= lpfc_sli4_fp_handle_wcqe(phba, cq, cqe);
11846 if (!(++ecount % cq->entry_repost))
11847 lpfc_sli4_cq_release(cq, LPFC_QUEUE_NOARM);
11848 }
11849
11850
11851 if (ecount > cq->CQ_max_cqe)
11852 cq->CQ_max_cqe = ecount;
11853
11854
11855 if (unlikely(ecount == 0))
11856 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
11857 "0369 No entry from fast-path completion "
11858 "queue fcpcqid=%d\n", cq->queue_id);
11859
11860
11861 lpfc_sli4_cq_release(cq, LPFC_QUEUE_REARM);
11862
11863
11864 if (workposted)
11865 lpfc_worker_wake_up(phba);
11866}
11867
11868static void
11869lpfc_sli4_eq_flush(struct lpfc_hba *phba, struct lpfc_queue *eq)
11870{
11871 struct lpfc_eqe *eqe;
11872
11873
11874 while ((eqe = lpfc_sli4_eq_get(eq)))
11875 ;
11876
11877
11878 lpfc_sli4_eq_release(eq, LPFC_QUEUE_REARM);
11879}
11880
11881
11882
11883
11884
11885
11886
11887
11888
11889
11890
11891
11892
11893
11894
11895
11896
11897
11898
11899
11900
11901
11902
11903
11904
11905
11906
11907irqreturn_t
11908lpfc_sli4_hba_intr_handler(int irq, void *dev_id)
11909{
11910 struct lpfc_hba *phba;
11911 struct lpfc_fcp_eq_hdl *fcp_eq_hdl;
11912 struct lpfc_queue *fpeq;
11913 struct lpfc_eqe *eqe;
11914 unsigned long iflag;
11915 int ecount = 0;
11916 int fcp_eqidx;
11917
11918
11919 fcp_eq_hdl = (struct lpfc_fcp_eq_hdl *)dev_id;
11920 phba = fcp_eq_hdl->phba;
11921 fcp_eqidx = fcp_eq_hdl->idx;
11922
11923 if (unlikely(!phba))
11924 return IRQ_NONE;
11925 if (unlikely(!phba->sli4_hba.hba_eq))
11926 return IRQ_NONE;
11927
11928
11929 fpeq = phba->sli4_hba.hba_eq[fcp_eqidx];
11930 if (unlikely(!fpeq))
11931 return IRQ_NONE;
11932
11933 if (lpfc_fcp_look_ahead) {
11934 if (atomic_dec_and_test(&fcp_eq_hdl->fcp_eq_in_use))
11935 lpfc_sli4_eq_clr_intr(fpeq);
11936 else {
11937 atomic_inc(&fcp_eq_hdl->fcp_eq_in_use);
11938 return IRQ_NONE;
11939 }
11940 }
11941
11942
11943 if (unlikely(lpfc_intr_state_check(phba))) {
11944 fpeq->EQ_badstate++;
11945
11946 spin_lock_irqsave(&phba->hbalock, iflag);
11947 if (phba->link_state < LPFC_LINK_DOWN)
11948
11949 lpfc_sli4_eq_flush(phba, fpeq);
11950 spin_unlock_irqrestore(&phba->hbalock, iflag);
11951 if (lpfc_fcp_look_ahead)
11952 atomic_inc(&fcp_eq_hdl->fcp_eq_in_use);
11953 return IRQ_NONE;
11954 }
11955
11956
11957
11958
11959 while ((eqe = lpfc_sli4_eq_get(fpeq))) {
11960 lpfc_sli4_hba_handle_eqe(phba, eqe, fcp_eqidx);
11961 if (!(++ecount % fpeq->entry_repost))
11962 lpfc_sli4_eq_release(fpeq, LPFC_QUEUE_NOARM);
11963 fpeq->EQ_processed++;
11964 }
11965
11966
11967 if (ecount > fpeq->EQ_max_eqe)
11968 fpeq->EQ_max_eqe = ecount;
11969
11970
11971 lpfc_sli4_eq_release(fpeq, LPFC_QUEUE_REARM);
11972
11973 if (unlikely(ecount == 0)) {
11974 fpeq->EQ_no_entry++;
11975
11976 if (lpfc_fcp_look_ahead) {
11977 atomic_inc(&fcp_eq_hdl->fcp_eq_in_use);
11978 return IRQ_NONE;
11979 }
11980
11981 if (phba->intr_type == MSIX)
11982
11983 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
11984 "0358 MSI-X interrupt with no EQE\n");
11985 else
11986
11987 return IRQ_NONE;
11988 }
11989
11990 if (lpfc_fcp_look_ahead)
11991 atomic_inc(&fcp_eq_hdl->fcp_eq_in_use);
11992 return IRQ_HANDLED;
11993}
11994
11995
11996
11997
11998
11999
12000
12001
12002
12003
12004
12005
12006
12007
12008
12009
12010
12011
12012irqreturn_t
12013lpfc_sli4_intr_handler(int irq, void *dev_id)
12014{
12015 struct lpfc_hba *phba;
12016 irqreturn_t hba_irq_rc;
12017 bool hba_handled = false;
12018 int fcp_eqidx;
12019
12020
12021 phba = (struct lpfc_hba *)dev_id;
12022
12023 if (unlikely(!phba))
12024 return IRQ_NONE;
12025
12026
12027
12028
12029 for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_io_channel; fcp_eqidx++) {
12030 hba_irq_rc = lpfc_sli4_hba_intr_handler(irq,
12031 &phba->sli4_hba.fcp_eq_hdl[fcp_eqidx]);
12032 if (hba_irq_rc == IRQ_HANDLED)
12033 hba_handled |= true;
12034 }
12035
12036 return (hba_handled == true) ? IRQ_HANDLED : IRQ_NONE;
12037}
12038
12039
12040
12041
12042
12043
12044
12045
12046
12047void
12048lpfc_sli4_queue_free(struct lpfc_queue *queue)
12049{
12050 struct lpfc_dmabuf *dmabuf;
12051
12052 if (!queue)
12053 return;
12054
12055 while (!list_empty(&queue->page_list)) {
12056 list_remove_head(&queue->page_list, dmabuf, struct lpfc_dmabuf,
12057 list);
12058 dma_free_coherent(&queue->phba->pcidev->dev, SLI4_PAGE_SIZE,
12059 dmabuf->virt, dmabuf->phys);
12060 kfree(dmabuf);
12061 }
12062 kfree(queue);
12063 return;
12064}
12065
12066
12067
12068
12069
12070
12071
12072
12073
12074
12075
12076struct lpfc_queue *
12077lpfc_sli4_queue_alloc(struct lpfc_hba *phba, uint32_t entry_size,
12078 uint32_t entry_count)
12079{
12080 struct lpfc_queue *queue;
12081 struct lpfc_dmabuf *dmabuf;
12082 int x, total_qe_count;
12083 void *dma_pointer;
12084 uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
12085
12086 if (!phba->sli4_hba.pc_sli4_params.supported)
12087 hw_page_size = SLI4_PAGE_SIZE;
12088
12089 queue = kzalloc(sizeof(struct lpfc_queue) +
12090 (sizeof(union sli4_qe) * entry_count), GFP_KERNEL);
12091 if (!queue)
12092 return NULL;
12093 queue->page_count = (ALIGN(entry_size * entry_count,
12094 hw_page_size))/hw_page_size;
12095 INIT_LIST_HEAD(&queue->list);
12096 INIT_LIST_HEAD(&queue->page_list);
12097 INIT_LIST_HEAD(&queue->child_list);
12098 for (x = 0, total_qe_count = 0; x < queue->page_count; x++) {
12099 dmabuf = kzalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
12100 if (!dmabuf)
12101 goto out_fail;
12102 dmabuf->virt = dma_alloc_coherent(&phba->pcidev->dev,
12103 hw_page_size, &dmabuf->phys,
12104 GFP_KERNEL);
12105 if (!dmabuf->virt) {
12106 kfree(dmabuf);
12107 goto out_fail;
12108 }
12109 memset(dmabuf->virt, 0, hw_page_size);
12110 dmabuf->buffer_tag = x;
12111 list_add_tail(&dmabuf->list, &queue->page_list);
12112
12113 dma_pointer = dmabuf->virt;
12114 for (; total_qe_count < entry_count &&
12115 dma_pointer < (hw_page_size + dmabuf->virt);
12116 total_qe_count++, dma_pointer += entry_size) {
12117 queue->qe[total_qe_count].address = dma_pointer;
12118 }
12119 }
12120 queue->entry_size = entry_size;
12121 queue->entry_count = entry_count;
12122
12123
12124
12125
12126
12127
12128 queue->entry_repost = (entry_count >> 3);
12129 if (queue->entry_repost < LPFC_QUEUE_MIN_REPOST)
12130 queue->entry_repost = LPFC_QUEUE_MIN_REPOST;
12131 queue->phba = phba;
12132
12133 return queue;
12134out_fail:
12135 lpfc_sli4_queue_free(queue);
12136 return NULL;
12137}
12138
12139
12140
12141
12142
12143
12144
12145
12146
12147
12148static void __iomem *
12149lpfc_dual_chute_pci_bar_map(struct lpfc_hba *phba, uint16_t pci_barset)
12150{
12151 struct pci_dev *pdev;
12152 unsigned long bar_map, bar_map_len;
12153
12154 if (!phba->pcidev)
12155 return NULL;
12156 else
12157 pdev = phba->pcidev;
12158
12159 switch (pci_barset) {
12160 case WQ_PCI_BAR_0_AND_1:
12161 if (!phba->pci_bar0_memmap_p) {
12162 bar_map = pci_resource_start(pdev, PCI_64BIT_BAR0);
12163 bar_map_len = pci_resource_len(pdev, PCI_64BIT_BAR0);
12164 phba->pci_bar0_memmap_p = ioremap(bar_map, bar_map_len);
12165 }
12166 return phba->pci_bar0_memmap_p;
12167 case WQ_PCI_BAR_2_AND_3:
12168 if (!phba->pci_bar2_memmap_p) {
12169 bar_map = pci_resource_start(pdev, PCI_64BIT_BAR2);
12170 bar_map_len = pci_resource_len(pdev, PCI_64BIT_BAR2);
12171 phba->pci_bar2_memmap_p = ioremap(bar_map, bar_map_len);
12172 }
12173 return phba->pci_bar2_memmap_p;
12174 case WQ_PCI_BAR_4_AND_5:
12175 if (!phba->pci_bar4_memmap_p) {
12176 bar_map = pci_resource_start(pdev, PCI_64BIT_BAR4);
12177 bar_map_len = pci_resource_len(pdev, PCI_64BIT_BAR4);
12178 phba->pci_bar4_memmap_p = ioremap(bar_map, bar_map_len);
12179 }
12180 return phba->pci_bar4_memmap_p;
12181 default:
12182 break;
12183 }
12184 return NULL;
12185}
12186
12187
12188
12189
12190
12191
12192
12193
12194
12195
12196
12197
12198
12199
12200
12201
12202
12203uint32_t
12204lpfc_modify_fcp_eq_delay(struct lpfc_hba *phba, uint16_t startq)
12205{
12206 struct lpfc_mbx_modify_eq_delay *eq_delay;
12207 LPFC_MBOXQ_t *mbox;
12208 struct lpfc_queue *eq;
12209 int cnt, rc, length, status = 0;
12210 uint32_t shdr_status, shdr_add_status;
12211 uint32_t result;
12212 int fcp_eqidx;
12213 union lpfc_sli4_cfg_shdr *shdr;
12214 uint16_t dmult;
12215
12216 if (startq >= phba->cfg_fcp_io_channel)
12217 return 0;
12218
12219 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
12220 if (!mbox)
12221 return -ENOMEM;
12222 length = (sizeof(struct lpfc_mbx_modify_eq_delay) -
12223 sizeof(struct lpfc_sli4_cfg_mhdr));
12224 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
12225 LPFC_MBOX_OPCODE_MODIFY_EQ_DELAY,
12226 length, LPFC_SLI4_MBX_EMBED);
12227 eq_delay = &mbox->u.mqe.un.eq_delay;
12228
12229
12230 result = phba->cfg_fcp_imax / phba->cfg_fcp_io_channel;
12231 if (result > LPFC_DMULT_CONST)
12232 dmult = 0;
12233 else
12234 dmult = LPFC_DMULT_CONST/result - 1;
12235
12236 cnt = 0;
12237 for (fcp_eqidx = startq; fcp_eqidx < phba->cfg_fcp_io_channel;
12238 fcp_eqidx++) {
12239 eq = phba->sli4_hba.hba_eq[fcp_eqidx];
12240 if (!eq)
12241 continue;
12242 eq_delay->u.request.eq[cnt].eq_id = eq->queue_id;
12243 eq_delay->u.request.eq[cnt].phase = 0;
12244 eq_delay->u.request.eq[cnt].delay_multi = dmult;
12245 cnt++;
12246 if (cnt >= LPFC_MAX_EQ_DELAY)
12247 break;
12248 }
12249 eq_delay->u.request.num_eq = cnt;
12250
12251 mbox->vport = phba->pport;
12252 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
12253 mbox->context1 = NULL;
12254 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
12255 shdr = (union lpfc_sli4_cfg_shdr *) &eq_delay->header.cfg_shdr;
12256 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
12257 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
12258 if (shdr_status || shdr_add_status || rc) {
12259 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
12260 "2512 MODIFY_EQ_DELAY mailbox failed with "
12261 "status x%x add_status x%x, mbx status x%x\n",
12262 shdr_status, shdr_add_status, rc);
12263 status = -ENXIO;
12264 }
12265 mempool_free(mbox, phba->mbox_mem_pool);
12266 return status;
12267}
12268
12269
12270
12271
12272
12273
12274
12275
12276
12277
12278
12279
12280
12281
12282
12283
12284
12285
12286
12287
12288
12289uint32_t
12290lpfc_eq_create(struct lpfc_hba *phba, struct lpfc_queue *eq, uint32_t imax)
12291{
12292 struct lpfc_mbx_eq_create *eq_create;
12293 LPFC_MBOXQ_t *mbox;
12294 int rc, length, status = 0;
12295 struct lpfc_dmabuf *dmabuf;
12296 uint32_t shdr_status, shdr_add_status;
12297 union lpfc_sli4_cfg_shdr *shdr;
12298 uint16_t dmult;
12299 uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
12300
12301
12302 if (!eq)
12303 return -ENODEV;
12304 if (!phba->sli4_hba.pc_sli4_params.supported)
12305 hw_page_size = SLI4_PAGE_SIZE;
12306
12307 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
12308 if (!mbox)
12309 return -ENOMEM;
12310 length = (sizeof(struct lpfc_mbx_eq_create) -
12311 sizeof(struct lpfc_sli4_cfg_mhdr));
12312 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
12313 LPFC_MBOX_OPCODE_EQ_CREATE,
12314 length, LPFC_SLI4_MBX_EMBED);
12315 eq_create = &mbox->u.mqe.un.eq_create;
12316 bf_set(lpfc_mbx_eq_create_num_pages, &eq_create->u.request,
12317 eq->page_count);
12318 bf_set(lpfc_eq_context_size, &eq_create->u.request.context,
12319 LPFC_EQE_SIZE);
12320 bf_set(lpfc_eq_context_valid, &eq_create->u.request.context, 1);
12321
12322 if (imax > LPFC_DMULT_CONST)
12323 dmult = 0;
12324 else
12325 dmult = LPFC_DMULT_CONST/imax - 1;
12326 bf_set(lpfc_eq_context_delay_multi, &eq_create->u.request.context,
12327 dmult);
12328 switch (eq->entry_count) {
12329 default:
12330 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
12331 "0360 Unsupported EQ count. (%d)\n",
12332 eq->entry_count);
12333 if (eq->entry_count < 256)
12334 return -EINVAL;
12335
12336 case 256:
12337 bf_set(lpfc_eq_context_count, &eq_create->u.request.context,
12338 LPFC_EQ_CNT_256);
12339 break;
12340 case 512:
12341 bf_set(lpfc_eq_context_count, &eq_create->u.request.context,
12342 LPFC_EQ_CNT_512);
12343 break;
12344 case 1024:
12345 bf_set(lpfc_eq_context_count, &eq_create->u.request.context,
12346 LPFC_EQ_CNT_1024);
12347 break;
12348 case 2048:
12349 bf_set(lpfc_eq_context_count, &eq_create->u.request.context,
12350 LPFC_EQ_CNT_2048);
12351 break;
12352 case 4096:
12353 bf_set(lpfc_eq_context_count, &eq_create->u.request.context,
12354 LPFC_EQ_CNT_4096);
12355 break;
12356 }
12357 list_for_each_entry(dmabuf, &eq->page_list, list) {
12358 memset(dmabuf->virt, 0, hw_page_size);
12359 eq_create->u.request.page[dmabuf->buffer_tag].addr_lo =
12360 putPaddrLow(dmabuf->phys);
12361 eq_create->u.request.page[dmabuf->buffer_tag].addr_hi =
12362 putPaddrHigh(dmabuf->phys);
12363 }
12364 mbox->vport = phba->pport;
12365 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
12366 mbox->context1 = NULL;
12367 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
12368 shdr = (union lpfc_sli4_cfg_shdr *) &eq_create->header.cfg_shdr;
12369 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
12370 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
12371 if (shdr_status || shdr_add_status || rc) {
12372 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
12373 "2500 EQ_CREATE mailbox failed with "
12374 "status x%x add_status x%x, mbx status x%x\n",
12375 shdr_status, shdr_add_status, rc);
12376 status = -ENXIO;
12377 }
12378 eq->type = LPFC_EQ;
12379 eq->subtype = LPFC_NONE;
12380 eq->queue_id = bf_get(lpfc_mbx_eq_create_q_id, &eq_create->u.response);
12381 if (eq->queue_id == 0xFFFF)
12382 status = -ENXIO;
12383 eq->host_index = 0;
12384 eq->hba_index = 0;
12385
12386 mempool_free(mbox, phba->mbox_mem_pool);
12387 return status;
12388}
12389
12390
12391
12392
12393
12394
12395
12396
12397
12398
12399
12400
12401
12402
12403
12404
12405
12406
12407
12408
12409
12410
12411uint32_t
12412lpfc_cq_create(struct lpfc_hba *phba, struct lpfc_queue *cq,
12413 struct lpfc_queue *eq, uint32_t type, uint32_t subtype)
12414{
12415 struct lpfc_mbx_cq_create *cq_create;
12416 struct lpfc_dmabuf *dmabuf;
12417 LPFC_MBOXQ_t *mbox;
12418 int rc, length, status = 0;
12419 uint32_t shdr_status, shdr_add_status;
12420 union lpfc_sli4_cfg_shdr *shdr;
12421 uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
12422
12423
12424 if (!cq || !eq)
12425 return -ENODEV;
12426 if (!phba->sli4_hba.pc_sli4_params.supported)
12427 hw_page_size = SLI4_PAGE_SIZE;
12428
12429 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
12430 if (!mbox)
12431 return -ENOMEM;
12432 length = (sizeof(struct lpfc_mbx_cq_create) -
12433 sizeof(struct lpfc_sli4_cfg_mhdr));
12434 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
12435 LPFC_MBOX_OPCODE_CQ_CREATE,
12436 length, LPFC_SLI4_MBX_EMBED);
12437 cq_create = &mbox->u.mqe.un.cq_create;
12438 shdr = (union lpfc_sli4_cfg_shdr *) &cq_create->header.cfg_shdr;
12439 bf_set(lpfc_mbx_cq_create_num_pages, &cq_create->u.request,
12440 cq->page_count);
12441 bf_set(lpfc_cq_context_event, &cq_create->u.request.context, 1);
12442 bf_set(lpfc_cq_context_valid, &cq_create->u.request.context, 1);
12443 bf_set(lpfc_mbox_hdr_version, &shdr->request,
12444 phba->sli4_hba.pc_sli4_params.cqv);
12445 if (phba->sli4_hba.pc_sli4_params.cqv == LPFC_Q_CREATE_VERSION_2) {
12446
12447 bf_set(lpfc_mbx_cq_create_page_size, &cq_create->u.request, 1);
12448 bf_set(lpfc_cq_eq_id_2, &cq_create->u.request.context,
12449 eq->queue_id);
12450 } else {
12451 bf_set(lpfc_cq_eq_id, &cq_create->u.request.context,
12452 eq->queue_id);
12453 }
12454 switch (cq->entry_count) {
12455 default:
12456 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
12457 "0361 Unsupported CQ count. (%d)\n",
12458 cq->entry_count);
12459 if (cq->entry_count < 256) {
12460 status = -EINVAL;
12461 goto out;
12462 }
12463
12464 case 256:
12465 bf_set(lpfc_cq_context_count, &cq_create->u.request.context,
12466 LPFC_CQ_CNT_256);
12467 break;
12468 case 512:
12469 bf_set(lpfc_cq_context_count, &cq_create->u.request.context,
12470 LPFC_CQ_CNT_512);
12471 break;
12472 case 1024:
12473 bf_set(lpfc_cq_context_count, &cq_create->u.request.context,
12474 LPFC_CQ_CNT_1024);
12475 break;
12476 }
12477 list_for_each_entry(dmabuf, &cq->page_list, list) {
12478 memset(dmabuf->virt, 0, hw_page_size);
12479 cq_create->u.request.page[dmabuf->buffer_tag].addr_lo =
12480 putPaddrLow(dmabuf->phys);
12481 cq_create->u.request.page[dmabuf->buffer_tag].addr_hi =
12482 putPaddrHigh(dmabuf->phys);
12483 }
12484 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
12485
12486
12487 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
12488 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
12489 if (shdr_status || shdr_add_status || rc) {
12490 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
12491 "2501 CQ_CREATE mailbox failed with "
12492 "status x%x add_status x%x, mbx status x%x\n",
12493 shdr_status, shdr_add_status, rc);
12494 status = -ENXIO;
12495 goto out;
12496 }
12497 cq->queue_id = bf_get(lpfc_mbx_cq_create_q_id, &cq_create->u.response);
12498 if (cq->queue_id == 0xFFFF) {
12499 status = -ENXIO;
12500 goto out;
12501 }
12502
12503 list_add_tail(&cq->list, &eq->child_list);
12504
12505 cq->type = type;
12506 cq->subtype = subtype;
12507 cq->queue_id = bf_get(lpfc_mbx_cq_create_q_id, &cq_create->u.response);
12508 cq->assoc_qid = eq->queue_id;
12509 cq->host_index = 0;
12510 cq->hba_index = 0;
12511
12512out:
12513 mempool_free(mbox, phba->mbox_mem_pool);
12514 return status;
12515}
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12526
12527
12528
12529
12530
12531static void
12532lpfc_mq_create_fb_init(struct lpfc_hba *phba, struct lpfc_queue *mq,
12533 LPFC_MBOXQ_t *mbox, struct lpfc_queue *cq)
12534{
12535 struct lpfc_mbx_mq_create *mq_create;
12536 struct lpfc_dmabuf *dmabuf;
12537 int length;
12538
12539 length = (sizeof(struct lpfc_mbx_mq_create) -
12540 sizeof(struct lpfc_sli4_cfg_mhdr));
12541 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
12542 LPFC_MBOX_OPCODE_MQ_CREATE,
12543 length, LPFC_SLI4_MBX_EMBED);
12544 mq_create = &mbox->u.mqe.un.mq_create;
12545 bf_set(lpfc_mbx_mq_create_num_pages, &mq_create->u.request,
12546 mq->page_count);
12547 bf_set(lpfc_mq_context_cq_id, &mq_create->u.request.context,
12548 cq->queue_id);
12549 bf_set(lpfc_mq_context_valid, &mq_create->u.request.context, 1);
12550 switch (mq->entry_count) {
12551 case 16:
12552 bf_set(lpfc_mq_context_ring_size, &mq_create->u.request.context,
12553 LPFC_MQ_RING_SIZE_16);
12554 break;
12555 case 32:
12556 bf_set(lpfc_mq_context_ring_size, &mq_create->u.request.context,
12557 LPFC_MQ_RING_SIZE_32);
12558 break;
12559 case 64:
12560 bf_set(lpfc_mq_context_ring_size, &mq_create->u.request.context,
12561 LPFC_MQ_RING_SIZE_64);
12562 break;
12563 case 128:
12564 bf_set(lpfc_mq_context_ring_size, &mq_create->u.request.context,
12565 LPFC_MQ_RING_SIZE_128);
12566 break;
12567 }
12568 list_for_each_entry(dmabuf, &mq->page_list, list) {
12569 mq_create->u.request.page[dmabuf->buffer_tag].addr_lo =
12570 putPaddrLow(dmabuf->phys);
12571 mq_create->u.request.page[dmabuf->buffer_tag].addr_hi =
12572 putPaddrHigh(dmabuf->phys);
12573 }
12574}
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
12587
12588
12589
12590
12591
12592
12593
12594
12595
12596
12597int32_t
12598lpfc_mq_create(struct lpfc_hba *phba, struct lpfc_queue *mq,
12599 struct lpfc_queue *cq, uint32_t subtype)
12600{
12601 struct lpfc_mbx_mq_create *mq_create;
12602 struct lpfc_mbx_mq_create_ext *mq_create_ext;
12603 struct lpfc_dmabuf *dmabuf;
12604 LPFC_MBOXQ_t *mbox;
12605 int rc, length, status = 0;
12606 uint32_t shdr_status, shdr_add_status;
12607 union lpfc_sli4_cfg_shdr *shdr;
12608 uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
12609
12610
12611 if (!mq || !cq)
12612 return -ENODEV;
12613 if (!phba->sli4_hba.pc_sli4_params.supported)
12614 hw_page_size = SLI4_PAGE_SIZE;
12615
12616 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
12617 if (!mbox)
12618 return -ENOMEM;
12619 length = (sizeof(struct lpfc_mbx_mq_create_ext) -
12620 sizeof(struct lpfc_sli4_cfg_mhdr));
12621 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
12622 LPFC_MBOX_OPCODE_MQ_CREATE_EXT,
12623 length, LPFC_SLI4_MBX_EMBED);
12624
12625 mq_create_ext = &mbox->u.mqe.un.mq_create_ext;
12626 shdr = (union lpfc_sli4_cfg_shdr *) &mq_create_ext->header.cfg_shdr;
12627 bf_set(lpfc_mbx_mq_create_ext_num_pages,
12628 &mq_create_ext->u.request, mq->page_count);
12629 bf_set(lpfc_mbx_mq_create_ext_async_evt_link,
12630 &mq_create_ext->u.request, 1);
12631 bf_set(lpfc_mbx_mq_create_ext_async_evt_fip,
12632 &mq_create_ext->u.request, 1);
12633 bf_set(lpfc_mbx_mq_create_ext_async_evt_group5,
12634 &mq_create_ext->u.request, 1);
12635 bf_set(lpfc_mbx_mq_create_ext_async_evt_fc,
12636 &mq_create_ext->u.request, 1);
12637 bf_set(lpfc_mbx_mq_create_ext_async_evt_sli,
12638 &mq_create_ext->u.request, 1);
12639 bf_set(lpfc_mq_context_valid, &mq_create_ext->u.request.context, 1);
12640 bf_set(lpfc_mbox_hdr_version, &shdr->request,
12641 phba->sli4_hba.pc_sli4_params.mqv);
12642 if (phba->sli4_hba.pc_sli4_params.mqv == LPFC_Q_CREATE_VERSION_1)
12643 bf_set(lpfc_mbx_mq_create_ext_cq_id, &mq_create_ext->u.request,
12644 cq->queue_id);
12645 else
12646 bf_set(lpfc_mq_context_cq_id, &mq_create_ext->u.request.context,
12647 cq->queue_id);
12648 switch (mq->entry_count) {
12649 default:
12650 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
12651 "0362 Unsupported MQ count. (%d)\n",
12652 mq->entry_count);
12653 if (mq->entry_count < 16) {
12654 status = -EINVAL;
12655 goto out;
12656 }
12657
12658 case 16:
12659 bf_set(lpfc_mq_context_ring_size,
12660 &mq_create_ext->u.request.context,
12661 LPFC_MQ_RING_SIZE_16);
12662 break;
12663 case 32:
12664 bf_set(lpfc_mq_context_ring_size,
12665 &mq_create_ext->u.request.context,
12666 LPFC_MQ_RING_SIZE_32);
12667 break;
12668 case 64:
12669 bf_set(lpfc_mq_context_ring_size,
12670 &mq_create_ext->u.request.context,
12671 LPFC_MQ_RING_SIZE_64);
12672 break;
12673 case 128:
12674 bf_set(lpfc_mq_context_ring_size,
12675 &mq_create_ext->u.request.context,
12676 LPFC_MQ_RING_SIZE_128);
12677 break;
12678 }
12679 list_for_each_entry(dmabuf, &mq->page_list, list) {
12680 memset(dmabuf->virt, 0, hw_page_size);
12681 mq_create_ext->u.request.page[dmabuf->buffer_tag].addr_lo =
12682 putPaddrLow(dmabuf->phys);
12683 mq_create_ext->u.request.page[dmabuf->buffer_tag].addr_hi =
12684 putPaddrHigh(dmabuf->phys);
12685 }
12686 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
12687 mq->queue_id = bf_get(lpfc_mbx_mq_create_q_id,
12688 &mq_create_ext->u.response);
12689 if (rc != MBX_SUCCESS) {
12690 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
12691 "2795 MQ_CREATE_EXT failed with "
12692 "status x%x. Failback to MQ_CREATE.\n",
12693 rc);
12694 lpfc_mq_create_fb_init(phba, mq, mbox, cq);
12695 mq_create = &mbox->u.mqe.un.mq_create;
12696 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
12697 shdr = (union lpfc_sli4_cfg_shdr *) &mq_create->header.cfg_shdr;
12698 mq->queue_id = bf_get(lpfc_mbx_mq_create_q_id,
12699 &mq_create->u.response);
12700 }
12701
12702
12703 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
12704 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
12705 if (shdr_status || shdr_add_status || rc) {
12706 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
12707 "2502 MQ_CREATE mailbox failed with "
12708 "status x%x add_status x%x, mbx status x%x\n",
12709 shdr_status, shdr_add_status, rc);
12710 status = -ENXIO;
12711 goto out;
12712 }
12713 if (mq->queue_id == 0xFFFF) {
12714 status = -ENXIO;
12715 goto out;
12716 }
12717 mq->type = LPFC_MQ;
12718 mq->assoc_qid = cq->queue_id;
12719 mq->subtype = subtype;
12720 mq->host_index = 0;
12721 mq->hba_index = 0;
12722
12723
12724 list_add_tail(&mq->list, &cq->child_list);
12725out:
12726 mempool_free(mbox, phba->mbox_mem_pool);
12727 return status;
12728}
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
12751
12752uint32_t
12753lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq,
12754 struct lpfc_queue *cq, uint32_t subtype)
12755{
12756 struct lpfc_mbx_wq_create *wq_create;
12757 struct lpfc_dmabuf *dmabuf;
12758 LPFC_MBOXQ_t *mbox;
12759 int rc, length, status = 0;
12760 uint32_t shdr_status, shdr_add_status;
12761 union lpfc_sli4_cfg_shdr *shdr;
12762 uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
12763 struct dma_address *page;
12764 void __iomem *bar_memmap_p;
12765 uint32_t db_offset;
12766 uint16_t pci_barset;
12767
12768
12769 if (!wq || !cq)
12770 return -ENODEV;
12771 if (!phba->sli4_hba.pc_sli4_params.supported)
12772 hw_page_size = SLI4_PAGE_SIZE;
12773
12774 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
12775 if (!mbox)
12776 return -ENOMEM;
12777 length = (sizeof(struct lpfc_mbx_wq_create) -
12778 sizeof(struct lpfc_sli4_cfg_mhdr));
12779 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE,
12780 LPFC_MBOX_OPCODE_FCOE_WQ_CREATE,
12781 length, LPFC_SLI4_MBX_EMBED);
12782 wq_create = &mbox->u.mqe.un.wq_create;
12783 shdr = (union lpfc_sli4_cfg_shdr *) &wq_create->header.cfg_shdr;
12784 bf_set(lpfc_mbx_wq_create_num_pages, &wq_create->u.request,
12785 wq->page_count);
12786 bf_set(lpfc_mbx_wq_create_cq_id, &wq_create->u.request,
12787 cq->queue_id);
12788 bf_set(lpfc_mbox_hdr_version, &shdr->request,
12789 phba->sli4_hba.pc_sli4_params.wqv);
12790
12791 if (phba->sli4_hba.pc_sli4_params.wqv == LPFC_Q_CREATE_VERSION_1) {
12792 bf_set(lpfc_mbx_wq_create_wqe_count, &wq_create->u.request_1,
12793 wq->entry_count);
12794 switch (wq->entry_size) {
12795 default:
12796 case 64:
12797 bf_set(lpfc_mbx_wq_create_wqe_size,
12798 &wq_create->u.request_1,
12799 LPFC_WQ_WQE_SIZE_64);
12800 break;
12801 case 128:
12802 bf_set(lpfc_mbx_wq_create_wqe_size,
12803 &wq_create->u.request_1,
12804 LPFC_WQ_WQE_SIZE_128);
12805 break;
12806 }
12807 bf_set(lpfc_mbx_wq_create_page_size, &wq_create->u.request_1,
12808 (PAGE_SIZE/SLI4_PAGE_SIZE));
12809 page = wq_create->u.request_1.page;
12810 } else {
12811 page = wq_create->u.request.page;
12812 }
12813 list_for_each_entry(dmabuf, &wq->page_list, list) {
12814 memset(dmabuf->virt, 0, hw_page_size);
12815 page[dmabuf->buffer_tag].addr_lo = putPaddrLow(dmabuf->phys);
12816 page[dmabuf->buffer_tag].addr_hi = putPaddrHigh(dmabuf->phys);
12817 }
12818
12819 if (phba->sli4_hba.fw_func_mode & LPFC_DUA_MODE)
12820 bf_set(lpfc_mbx_wq_create_dua, &wq_create->u.request, 1);
12821
12822 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
12823
12824 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
12825 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
12826 if (shdr_status || shdr_add_status || rc) {
12827 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
12828 "2503 WQ_CREATE mailbox failed with "
12829 "status x%x add_status x%x, mbx status x%x\n",
12830 shdr_status, shdr_add_status, rc);
12831 status = -ENXIO;
12832 goto out;
12833 }
12834 wq->queue_id = bf_get(lpfc_mbx_wq_create_q_id, &wq_create->u.response);
12835 if (wq->queue_id == 0xFFFF) {
12836 status = -ENXIO;
12837 goto out;
12838 }
12839 if (phba->sli4_hba.fw_func_mode & LPFC_DUA_MODE) {
12840 wq->db_format = bf_get(lpfc_mbx_wq_create_db_format,
12841 &wq_create->u.response);
12842 if ((wq->db_format != LPFC_DB_LIST_FORMAT) &&
12843 (wq->db_format != LPFC_DB_RING_FORMAT)) {
12844 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
12845 "3265 WQ[%d] doorbell format not "
12846 "supported: x%x\n", wq->queue_id,
12847 wq->db_format);
12848 status = -EINVAL;
12849 goto out;
12850 }
12851 pci_barset = bf_get(lpfc_mbx_wq_create_bar_set,
12852 &wq_create->u.response);
12853 bar_memmap_p = lpfc_dual_chute_pci_bar_map(phba, pci_barset);
12854 if (!bar_memmap_p) {
12855 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
12856 "3263 WQ[%d] failed to memmap pci "
12857 "barset:x%x\n", wq->queue_id,
12858 pci_barset);
12859 status = -ENOMEM;
12860 goto out;
12861 }
12862 db_offset = wq_create->u.response.doorbell_offset;
12863 if ((db_offset != LPFC_ULP0_WQ_DOORBELL) &&
12864 (db_offset != LPFC_ULP1_WQ_DOORBELL)) {
12865 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
12866 "3252 WQ[%d] doorbell offset not "
12867 "supported: x%x\n", wq->queue_id,
12868 db_offset);
12869 status = -EINVAL;
12870 goto out;
12871 }
12872 wq->db_regaddr = bar_memmap_p + db_offset;
12873 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
12874 "3264 WQ[%d]: barset:x%x, offset:x%x\n",
12875 wq->queue_id, pci_barset, db_offset);
12876 } else {
12877 wq->db_format = LPFC_DB_LIST_FORMAT;
12878 wq->db_regaddr = phba->sli4_hba.WQDBregaddr;
12879 }
12880 wq->type = LPFC_WQ;
12881 wq->assoc_qid = cq->queue_id;
12882 wq->subtype = subtype;
12883 wq->host_index = 0;
12884 wq->hba_index = 0;
12885 wq->entry_repost = LPFC_RELEASE_NOTIFICATION_INTERVAL;
12886
12887
12888 list_add_tail(&wq->list, &cq->child_list);
12889out:
12890 mempool_free(mbox, phba->mbox_mem_pool);
12891 return status;
12892}
12893
12894
12895
12896
12897
12898
12899
12900
12901
12902
12903
12904void
12905lpfc_rq_adjust_repost(struct lpfc_hba *phba, struct lpfc_queue *rq, int qno)
12906{
12907 uint32_t cnt;
12908
12909
12910 if (!rq)
12911 return;
12912 cnt = lpfc_hbq_defs[qno]->entry_count;
12913
12914
12915 cnt = (cnt >> 3);
12916 if (cnt < LPFC_QUEUE_MIN_REPOST)
12917 cnt = LPFC_QUEUE_MIN_REPOST;
12918
12919 rq->entry_repost = cnt;
12920}
12921
12922
12923
12924
12925
12926
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12940
12941
12942
12943
12944
12945uint32_t
12946lpfc_rq_create(struct lpfc_hba *phba, struct lpfc_queue *hrq,
12947 struct lpfc_queue *drq, struct lpfc_queue *cq, uint32_t subtype)
12948{
12949 struct lpfc_mbx_rq_create *rq_create;
12950 struct lpfc_dmabuf *dmabuf;
12951 LPFC_MBOXQ_t *mbox;
12952 int rc, length, status = 0;
12953 uint32_t shdr_status, shdr_add_status;
12954 union lpfc_sli4_cfg_shdr *shdr;
12955 uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz;
12956 void __iomem *bar_memmap_p;
12957 uint32_t db_offset;
12958 uint16_t pci_barset;
12959
12960
12961 if (!hrq || !drq || !cq)
12962 return -ENODEV;
12963 if (!phba->sli4_hba.pc_sli4_params.supported)
12964 hw_page_size = SLI4_PAGE_SIZE;
12965
12966 if (hrq->entry_count != drq->entry_count)
12967 return -EINVAL;
12968 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
12969 if (!mbox)
12970 return -ENOMEM;
12971 length = (sizeof(struct lpfc_mbx_rq_create) -
12972 sizeof(struct lpfc_sli4_cfg_mhdr));
12973 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE,
12974 LPFC_MBOX_OPCODE_FCOE_RQ_CREATE,
12975 length, LPFC_SLI4_MBX_EMBED);
12976 rq_create = &mbox->u.mqe.un.rq_create;
12977 shdr = (union lpfc_sli4_cfg_shdr *) &rq_create->header.cfg_shdr;
12978 bf_set(lpfc_mbox_hdr_version, &shdr->request,
12979 phba->sli4_hba.pc_sli4_params.rqv);
12980 if (phba->sli4_hba.pc_sli4_params.rqv == LPFC_Q_CREATE_VERSION_1) {
12981 bf_set(lpfc_rq_context_rqe_count_1,
12982 &rq_create->u.request.context,
12983 hrq->entry_count);
12984 rq_create->u.request.context.buffer_size = LPFC_HDR_BUF_SIZE;
12985 bf_set(lpfc_rq_context_rqe_size,
12986 &rq_create->u.request.context,
12987 LPFC_RQE_SIZE_8);
12988 bf_set(lpfc_rq_context_page_size,
12989 &rq_create->u.request.context,
12990 (PAGE_SIZE/SLI4_PAGE_SIZE));
12991 } else {
12992 switch (hrq->entry_count) {
12993 default:
12994 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
12995 "2535 Unsupported RQ count. (%d)\n",
12996 hrq->entry_count);
12997 if (hrq->entry_count < 512) {
12998 status = -EINVAL;
12999 goto out;
13000 }
13001
13002 case 512:
13003 bf_set(lpfc_rq_context_rqe_count,
13004 &rq_create->u.request.context,
13005 LPFC_RQ_RING_SIZE_512);
13006 break;
13007 case 1024:
13008 bf_set(lpfc_rq_context_rqe_count,
13009 &rq_create->u.request.context,
13010 LPFC_RQ_RING_SIZE_1024);
13011 break;
13012 case 2048:
13013 bf_set(lpfc_rq_context_rqe_count,
13014 &rq_create->u.request.context,
13015 LPFC_RQ_RING_SIZE_2048);
13016 break;
13017 case 4096:
13018 bf_set(lpfc_rq_context_rqe_count,
13019 &rq_create->u.request.context,
13020 LPFC_RQ_RING_SIZE_4096);
13021 break;
13022 }
13023 bf_set(lpfc_rq_context_buf_size, &rq_create->u.request.context,
13024 LPFC_HDR_BUF_SIZE);
13025 }
13026 bf_set(lpfc_rq_context_cq_id, &rq_create->u.request.context,
13027 cq->queue_id);
13028 bf_set(lpfc_mbx_rq_create_num_pages, &rq_create->u.request,
13029 hrq->page_count);
13030 list_for_each_entry(dmabuf, &hrq->page_list, list) {
13031 memset(dmabuf->virt, 0, hw_page_size);
13032 rq_create->u.request.page[dmabuf->buffer_tag].addr_lo =
13033 putPaddrLow(dmabuf->phys);
13034 rq_create->u.request.page[dmabuf->buffer_tag].addr_hi =
13035 putPaddrHigh(dmabuf->phys);
13036 }
13037 if (phba->sli4_hba.fw_func_mode & LPFC_DUA_MODE)
13038 bf_set(lpfc_mbx_rq_create_dua, &rq_create->u.request, 1);
13039
13040 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
13041
13042 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13043 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13044 if (shdr_status || shdr_add_status || rc) {
13045 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13046 "2504 RQ_CREATE mailbox failed with "
13047 "status x%x add_status x%x, mbx status x%x\n",
13048 shdr_status, shdr_add_status, rc);
13049 status = -ENXIO;
13050 goto out;
13051 }
13052 hrq->queue_id = bf_get(lpfc_mbx_rq_create_q_id, &rq_create->u.response);
13053 if (hrq->queue_id == 0xFFFF) {
13054 status = -ENXIO;
13055 goto out;
13056 }
13057
13058 if (phba->sli4_hba.fw_func_mode & LPFC_DUA_MODE) {
13059 hrq->db_format = bf_get(lpfc_mbx_rq_create_db_format,
13060 &rq_create->u.response);
13061 if ((hrq->db_format != LPFC_DB_LIST_FORMAT) &&
13062 (hrq->db_format != LPFC_DB_RING_FORMAT)) {
13063 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13064 "3262 RQ [%d] doorbell format not "
13065 "supported: x%x\n", hrq->queue_id,
13066 hrq->db_format);
13067 status = -EINVAL;
13068 goto out;
13069 }
13070
13071 pci_barset = bf_get(lpfc_mbx_rq_create_bar_set,
13072 &rq_create->u.response);
13073 bar_memmap_p = lpfc_dual_chute_pci_bar_map(phba, pci_barset);
13074 if (!bar_memmap_p) {
13075 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13076 "3269 RQ[%d] failed to memmap pci "
13077 "barset:x%x\n", hrq->queue_id,
13078 pci_barset);
13079 status = -ENOMEM;
13080 goto out;
13081 }
13082
13083 db_offset = rq_create->u.response.doorbell_offset;
13084 if ((db_offset != LPFC_ULP0_RQ_DOORBELL) &&
13085 (db_offset != LPFC_ULP1_RQ_DOORBELL)) {
13086 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13087 "3270 RQ[%d] doorbell offset not "
13088 "supported: x%x\n", hrq->queue_id,
13089 db_offset);
13090 status = -EINVAL;
13091 goto out;
13092 }
13093 hrq->db_regaddr = bar_memmap_p + db_offset;
13094 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
13095 "3266 RQ[qid:%d]: barset:x%x, offset:x%x\n",
13096 hrq->queue_id, pci_barset, db_offset);
13097 } else {
13098 hrq->db_format = LPFC_DB_RING_FORMAT;
13099 hrq->db_regaddr = phba->sli4_hba.RQDBregaddr;
13100 }
13101 hrq->type = LPFC_HRQ;
13102 hrq->assoc_qid = cq->queue_id;
13103 hrq->subtype = subtype;
13104 hrq->host_index = 0;
13105 hrq->hba_index = 0;
13106
13107
13108 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE,
13109 LPFC_MBOX_OPCODE_FCOE_RQ_CREATE,
13110 length, LPFC_SLI4_MBX_EMBED);
13111 bf_set(lpfc_mbox_hdr_version, &shdr->request,
13112 phba->sli4_hba.pc_sli4_params.rqv);
13113 if (phba->sli4_hba.pc_sli4_params.rqv == LPFC_Q_CREATE_VERSION_1) {
13114 bf_set(lpfc_rq_context_rqe_count_1,
13115 &rq_create->u.request.context, hrq->entry_count);
13116 rq_create->u.request.context.buffer_size = LPFC_DATA_BUF_SIZE;
13117 bf_set(lpfc_rq_context_rqe_size, &rq_create->u.request.context,
13118 LPFC_RQE_SIZE_8);
13119 bf_set(lpfc_rq_context_page_size, &rq_create->u.request.context,
13120 (PAGE_SIZE/SLI4_PAGE_SIZE));
13121 } else {
13122 switch (drq->entry_count) {
13123 default:
13124 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
13125 "2536 Unsupported RQ count. (%d)\n",
13126 drq->entry_count);
13127 if (drq->entry_count < 512) {
13128 status = -EINVAL;
13129 goto out;
13130 }
13131
13132 case 512:
13133 bf_set(lpfc_rq_context_rqe_count,
13134 &rq_create->u.request.context,
13135 LPFC_RQ_RING_SIZE_512);
13136 break;
13137 case 1024:
13138 bf_set(lpfc_rq_context_rqe_count,
13139 &rq_create->u.request.context,
13140 LPFC_RQ_RING_SIZE_1024);
13141 break;
13142 case 2048:
13143 bf_set(lpfc_rq_context_rqe_count,
13144 &rq_create->u.request.context,
13145 LPFC_RQ_RING_SIZE_2048);
13146 break;
13147 case 4096:
13148 bf_set(lpfc_rq_context_rqe_count,
13149 &rq_create->u.request.context,
13150 LPFC_RQ_RING_SIZE_4096);
13151 break;
13152 }
13153 bf_set(lpfc_rq_context_buf_size, &rq_create->u.request.context,
13154 LPFC_DATA_BUF_SIZE);
13155 }
13156 bf_set(lpfc_rq_context_cq_id, &rq_create->u.request.context,
13157 cq->queue_id);
13158 bf_set(lpfc_mbx_rq_create_num_pages, &rq_create->u.request,
13159 drq->page_count);
13160 list_for_each_entry(dmabuf, &drq->page_list, list) {
13161 rq_create->u.request.page[dmabuf->buffer_tag].addr_lo =
13162 putPaddrLow(dmabuf->phys);
13163 rq_create->u.request.page[dmabuf->buffer_tag].addr_hi =
13164 putPaddrHigh(dmabuf->phys);
13165 }
13166 if (phba->sli4_hba.fw_func_mode & LPFC_DUA_MODE)
13167 bf_set(lpfc_mbx_rq_create_dua, &rq_create->u.request, 1);
13168 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
13169
13170 shdr = (union lpfc_sli4_cfg_shdr *) &rq_create->header.cfg_shdr;
13171 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13172 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13173 if (shdr_status || shdr_add_status || rc) {
13174 status = -ENXIO;
13175 goto out;
13176 }
13177 drq->queue_id = bf_get(lpfc_mbx_rq_create_q_id, &rq_create->u.response);
13178 if (drq->queue_id == 0xFFFF) {
13179 status = -ENXIO;
13180 goto out;
13181 }
13182 drq->type = LPFC_DRQ;
13183 drq->assoc_qid = cq->queue_id;
13184 drq->subtype = subtype;
13185 drq->host_index = 0;
13186 drq->hba_index = 0;
13187
13188
13189 list_add_tail(&hrq->list, &cq->child_list);
13190 list_add_tail(&drq->list, &cq->child_list);
13191
13192out:
13193 mempool_free(mbox, phba->mbox_mem_pool);
13194 return status;
13195}
13196
13197
13198
13199
13200
13201
13202
13203
13204
13205
13206
13207
13208
13209uint32_t
13210lpfc_eq_destroy(struct lpfc_hba *phba, struct lpfc_queue *eq)
13211{
13212 LPFC_MBOXQ_t *mbox;
13213 int rc, length, status = 0;
13214 uint32_t shdr_status, shdr_add_status;
13215 union lpfc_sli4_cfg_shdr *shdr;
13216
13217
13218 if (!eq)
13219 return -ENODEV;
13220 mbox = mempool_alloc(eq->phba->mbox_mem_pool, GFP_KERNEL);
13221 if (!mbox)
13222 return -ENOMEM;
13223 length = (sizeof(struct lpfc_mbx_eq_destroy) -
13224 sizeof(struct lpfc_sli4_cfg_mhdr));
13225 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
13226 LPFC_MBOX_OPCODE_EQ_DESTROY,
13227 length, LPFC_SLI4_MBX_EMBED);
13228 bf_set(lpfc_mbx_eq_destroy_q_id, &mbox->u.mqe.un.eq_destroy.u.request,
13229 eq->queue_id);
13230 mbox->vport = eq->phba->pport;
13231 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
13232
13233 rc = lpfc_sli_issue_mbox(eq->phba, mbox, MBX_POLL);
13234
13235 shdr = (union lpfc_sli4_cfg_shdr *)
13236 &mbox->u.mqe.un.eq_destroy.header.cfg_shdr;
13237 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13238 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13239 if (shdr_status || shdr_add_status || rc) {
13240 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13241 "2505 EQ_DESTROY mailbox failed with "
13242 "status x%x add_status x%x, mbx status x%x\n",
13243 shdr_status, shdr_add_status, rc);
13244 status = -ENXIO;
13245 }
13246
13247
13248 list_del_init(&eq->list);
13249 mempool_free(mbox, eq->phba->mbox_mem_pool);
13250 return status;
13251}
13252
13253
13254
13255
13256
13257
13258
13259
13260
13261
13262
13263
13264
13265uint32_t
13266lpfc_cq_destroy(struct lpfc_hba *phba, struct lpfc_queue *cq)
13267{
13268 LPFC_MBOXQ_t *mbox;
13269 int rc, length, status = 0;
13270 uint32_t shdr_status, shdr_add_status;
13271 union lpfc_sli4_cfg_shdr *shdr;
13272
13273
13274 if (!cq)
13275 return -ENODEV;
13276 mbox = mempool_alloc(cq->phba->mbox_mem_pool, GFP_KERNEL);
13277 if (!mbox)
13278 return -ENOMEM;
13279 length = (sizeof(struct lpfc_mbx_cq_destroy) -
13280 sizeof(struct lpfc_sli4_cfg_mhdr));
13281 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
13282 LPFC_MBOX_OPCODE_CQ_DESTROY,
13283 length, LPFC_SLI4_MBX_EMBED);
13284 bf_set(lpfc_mbx_cq_destroy_q_id, &mbox->u.mqe.un.cq_destroy.u.request,
13285 cq->queue_id);
13286 mbox->vport = cq->phba->pport;
13287 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
13288 rc = lpfc_sli_issue_mbox(cq->phba, mbox, MBX_POLL);
13289
13290 shdr = (union lpfc_sli4_cfg_shdr *)
13291 &mbox->u.mqe.un.wq_create.header.cfg_shdr;
13292 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13293 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13294 if (shdr_status || shdr_add_status || rc) {
13295 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13296 "2506 CQ_DESTROY mailbox failed with "
13297 "status x%x add_status x%x, mbx status x%x\n",
13298 shdr_status, shdr_add_status, rc);
13299 status = -ENXIO;
13300 }
13301
13302 list_del_init(&cq->list);
13303 mempool_free(mbox, cq->phba->mbox_mem_pool);
13304 return status;
13305}
13306
13307
13308
13309
13310
13311
13312
13313
13314
13315
13316
13317
13318
13319uint32_t
13320lpfc_mq_destroy(struct lpfc_hba *phba, struct lpfc_queue *mq)
13321{
13322 LPFC_MBOXQ_t *mbox;
13323 int rc, length, status = 0;
13324 uint32_t shdr_status, shdr_add_status;
13325 union lpfc_sli4_cfg_shdr *shdr;
13326
13327
13328 if (!mq)
13329 return -ENODEV;
13330 mbox = mempool_alloc(mq->phba->mbox_mem_pool, GFP_KERNEL);
13331 if (!mbox)
13332 return -ENOMEM;
13333 length = (sizeof(struct lpfc_mbx_mq_destroy) -
13334 sizeof(struct lpfc_sli4_cfg_mhdr));
13335 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
13336 LPFC_MBOX_OPCODE_MQ_DESTROY,
13337 length, LPFC_SLI4_MBX_EMBED);
13338 bf_set(lpfc_mbx_mq_destroy_q_id, &mbox->u.mqe.un.mq_destroy.u.request,
13339 mq->queue_id);
13340 mbox->vport = mq->phba->pport;
13341 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
13342 rc = lpfc_sli_issue_mbox(mq->phba, mbox, MBX_POLL);
13343
13344 shdr = (union lpfc_sli4_cfg_shdr *)
13345 &mbox->u.mqe.un.mq_destroy.header.cfg_shdr;
13346 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13347 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13348 if (shdr_status || shdr_add_status || rc) {
13349 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13350 "2507 MQ_DESTROY mailbox failed with "
13351 "status x%x add_status x%x, mbx status x%x\n",
13352 shdr_status, shdr_add_status, rc);
13353 status = -ENXIO;
13354 }
13355
13356 list_del_init(&mq->list);
13357 mempool_free(mbox, mq->phba->mbox_mem_pool);
13358 return status;
13359}
13360
13361
13362
13363
13364
13365
13366
13367
13368
13369
13370
13371
13372
13373uint32_t
13374lpfc_wq_destroy(struct lpfc_hba *phba, struct lpfc_queue *wq)
13375{
13376 LPFC_MBOXQ_t *mbox;
13377 int rc, length, status = 0;
13378 uint32_t shdr_status, shdr_add_status;
13379 union lpfc_sli4_cfg_shdr *shdr;
13380
13381
13382 if (!wq)
13383 return -ENODEV;
13384 mbox = mempool_alloc(wq->phba->mbox_mem_pool, GFP_KERNEL);
13385 if (!mbox)
13386 return -ENOMEM;
13387 length = (sizeof(struct lpfc_mbx_wq_destroy) -
13388 sizeof(struct lpfc_sli4_cfg_mhdr));
13389 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE,
13390 LPFC_MBOX_OPCODE_FCOE_WQ_DESTROY,
13391 length, LPFC_SLI4_MBX_EMBED);
13392 bf_set(lpfc_mbx_wq_destroy_q_id, &mbox->u.mqe.un.wq_destroy.u.request,
13393 wq->queue_id);
13394 mbox->vport = wq->phba->pport;
13395 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
13396 rc = lpfc_sli_issue_mbox(wq->phba, mbox, MBX_POLL);
13397 shdr = (union lpfc_sli4_cfg_shdr *)
13398 &mbox->u.mqe.un.wq_destroy.header.cfg_shdr;
13399 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13400 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13401 if (shdr_status || shdr_add_status || rc) {
13402 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13403 "2508 WQ_DESTROY mailbox failed with "
13404 "status x%x add_status x%x, mbx status x%x\n",
13405 shdr_status, shdr_add_status, rc);
13406 status = -ENXIO;
13407 }
13408
13409 list_del_init(&wq->list);
13410 mempool_free(mbox, wq->phba->mbox_mem_pool);
13411 return status;
13412}
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426uint32_t
13427lpfc_rq_destroy(struct lpfc_hba *phba, struct lpfc_queue *hrq,
13428 struct lpfc_queue *drq)
13429{
13430 LPFC_MBOXQ_t *mbox;
13431 int rc, length, status = 0;
13432 uint32_t shdr_status, shdr_add_status;
13433 union lpfc_sli4_cfg_shdr *shdr;
13434
13435
13436 if (!hrq || !drq)
13437 return -ENODEV;
13438 mbox = mempool_alloc(hrq->phba->mbox_mem_pool, GFP_KERNEL);
13439 if (!mbox)
13440 return -ENOMEM;
13441 length = (sizeof(struct lpfc_mbx_rq_destroy) -
13442 sizeof(struct lpfc_sli4_cfg_mhdr));
13443 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE,
13444 LPFC_MBOX_OPCODE_FCOE_RQ_DESTROY,
13445 length, LPFC_SLI4_MBX_EMBED);
13446 bf_set(lpfc_mbx_rq_destroy_q_id, &mbox->u.mqe.un.rq_destroy.u.request,
13447 hrq->queue_id);
13448 mbox->vport = hrq->phba->pport;
13449 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
13450 rc = lpfc_sli_issue_mbox(hrq->phba, mbox, MBX_POLL);
13451
13452 shdr = (union lpfc_sli4_cfg_shdr *)
13453 &mbox->u.mqe.un.rq_destroy.header.cfg_shdr;
13454 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13455 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13456 if (shdr_status || shdr_add_status || rc) {
13457 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13458 "2509 RQ_DESTROY mailbox failed with "
13459 "status x%x add_status x%x, mbx status x%x\n",
13460 shdr_status, shdr_add_status, rc);
13461 if (rc != MBX_TIMEOUT)
13462 mempool_free(mbox, hrq->phba->mbox_mem_pool);
13463 return -ENXIO;
13464 }
13465 bf_set(lpfc_mbx_rq_destroy_q_id, &mbox->u.mqe.un.rq_destroy.u.request,
13466 drq->queue_id);
13467 rc = lpfc_sli_issue_mbox(drq->phba, mbox, MBX_POLL);
13468 shdr = (union lpfc_sli4_cfg_shdr *)
13469 &mbox->u.mqe.un.rq_destroy.header.cfg_shdr;
13470 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13471 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13472 if (shdr_status || shdr_add_status || rc) {
13473 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13474 "2510 RQ_DESTROY mailbox failed with "
13475 "status x%x add_status x%x, mbx status x%x\n",
13476 shdr_status, shdr_add_status, rc);
13477 status = -ENXIO;
13478 }
13479 list_del_init(&hrq->list);
13480 list_del_init(&drq->list);
13481 mempool_free(mbox, hrq->phba->mbox_mem_pool);
13482 return status;
13483}
13484
13485
13486
13487
13488
13489
13490
13491
13492
13493
13494
13495
13496
13497
13498
13499
13500
13501
13502
13503
13504
13505
13506
13507int
13508lpfc_sli4_post_sgl(struct lpfc_hba *phba,
13509 dma_addr_t pdma_phys_addr0,
13510 dma_addr_t pdma_phys_addr1,
13511 uint16_t xritag)
13512{
13513 struct lpfc_mbx_post_sgl_pages *post_sgl_pages;
13514 LPFC_MBOXQ_t *mbox;
13515 int rc;
13516 uint32_t shdr_status, shdr_add_status;
13517 uint32_t mbox_tmo;
13518 union lpfc_sli4_cfg_shdr *shdr;
13519
13520 if (xritag == NO_XRI) {
13521 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
13522 "0364 Invalid param:\n");
13523 return -EINVAL;
13524 }
13525
13526 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
13527 if (!mbox)
13528 return -ENOMEM;
13529
13530 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE,
13531 LPFC_MBOX_OPCODE_FCOE_POST_SGL_PAGES,
13532 sizeof(struct lpfc_mbx_post_sgl_pages) -
13533 sizeof(struct lpfc_sli4_cfg_mhdr), LPFC_SLI4_MBX_EMBED);
13534
13535 post_sgl_pages = (struct lpfc_mbx_post_sgl_pages *)
13536 &mbox->u.mqe.un.post_sgl_pages;
13537 bf_set(lpfc_post_sgl_pages_xri, post_sgl_pages, xritag);
13538 bf_set(lpfc_post_sgl_pages_xricnt, post_sgl_pages, 1);
13539
13540 post_sgl_pages->sgl_pg_pairs[0].sgl_pg0_addr_lo =
13541 cpu_to_le32(putPaddrLow(pdma_phys_addr0));
13542 post_sgl_pages->sgl_pg_pairs[0].sgl_pg0_addr_hi =
13543 cpu_to_le32(putPaddrHigh(pdma_phys_addr0));
13544
13545 post_sgl_pages->sgl_pg_pairs[0].sgl_pg1_addr_lo =
13546 cpu_to_le32(putPaddrLow(pdma_phys_addr1));
13547 post_sgl_pages->sgl_pg_pairs[0].sgl_pg1_addr_hi =
13548 cpu_to_le32(putPaddrHigh(pdma_phys_addr1));
13549 if (!phba->sli4_hba.intr_enable)
13550 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
13551 else {
13552 mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
13553 rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
13554 }
13555
13556 shdr = (union lpfc_sli4_cfg_shdr *) &post_sgl_pages->header.cfg_shdr;
13557 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13558 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13559 if (rc != MBX_TIMEOUT)
13560 mempool_free(mbox, phba->mbox_mem_pool);
13561 if (shdr_status || shdr_add_status || rc) {
13562 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13563 "2511 POST_SGL mailbox failed with "
13564 "status x%x add_status x%x, mbx status x%x\n",
13565 shdr_status, shdr_add_status, rc);
13566 rc = -ENXIO;
13567 }
13568 return 0;
13569}
13570
13571
13572
13573
13574
13575
13576
13577
13578
13579
13580
13581
13582
13583
13584uint16_t
13585lpfc_sli4_alloc_xri(struct lpfc_hba *phba)
13586{
13587 unsigned long xri;
13588
13589
13590
13591
13592
13593 spin_lock_irq(&phba->hbalock);
13594 xri = find_next_zero_bit(phba->sli4_hba.xri_bmask,
13595 phba->sli4_hba.max_cfg_param.max_xri, 0);
13596 if (xri >= phba->sli4_hba.max_cfg_param.max_xri) {
13597 spin_unlock_irq(&phba->hbalock);
13598 return NO_XRI;
13599 } else {
13600 set_bit(xri, phba->sli4_hba.xri_bmask);
13601 phba->sli4_hba.max_cfg_param.xri_used++;
13602 }
13603 spin_unlock_irq(&phba->hbalock);
13604 return xri;
13605}
13606
13607
13608
13609
13610
13611
13612
13613
13614void
13615__lpfc_sli4_free_xri(struct lpfc_hba *phba, int xri)
13616{
13617 if (test_and_clear_bit(xri, phba->sli4_hba.xri_bmask)) {
13618 phba->sli4_hba.max_cfg_param.xri_used--;
13619 }
13620}
13621
13622
13623
13624
13625
13626
13627
13628
13629void
13630lpfc_sli4_free_xri(struct lpfc_hba *phba, int xri)
13631{
13632 spin_lock_irq(&phba->hbalock);
13633 __lpfc_sli4_free_xri(phba, xri);
13634 spin_unlock_irq(&phba->hbalock);
13635}
13636
13637
13638
13639
13640
13641
13642
13643
13644
13645
13646
13647uint16_t
13648lpfc_sli4_next_xritag(struct lpfc_hba *phba)
13649{
13650 uint16_t xri_index;
13651
13652 xri_index = lpfc_sli4_alloc_xri(phba);
13653 if (xri_index == NO_XRI)
13654 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
13655 "2004 Failed to allocate XRI.last XRITAG is %d"
13656 " Max XRI is %d, Used XRI is %d\n",
13657 xri_index,
13658 phba->sli4_hba.max_cfg_param.max_xri,
13659 phba->sli4_hba.max_cfg_param.xri_used);
13660 return xri_index;
13661}
13662
13663
13664
13665
13666
13667
13668
13669
13670
13671
13672
13673
13674static int
13675lpfc_sli4_post_els_sgl_list(struct lpfc_hba *phba,
13676 struct list_head *post_sgl_list,
13677 int post_cnt)
13678{
13679 struct lpfc_sglq *sglq_entry = NULL, *sglq_next = NULL;
13680 struct lpfc_mbx_post_uembed_sgl_page1 *sgl;
13681 struct sgl_page_pairs *sgl_pg_pairs;
13682 void *viraddr;
13683 LPFC_MBOXQ_t *mbox;
13684 uint32_t reqlen, alloclen, pg_pairs;
13685 uint32_t mbox_tmo;
13686 uint16_t xritag_start = 0;
13687 int rc = 0;
13688 uint32_t shdr_status, shdr_add_status;
13689 union lpfc_sli4_cfg_shdr *shdr;
13690
13691 reqlen = phba->sli4_hba.els_xri_cnt * sizeof(struct sgl_page_pairs) +
13692 sizeof(union lpfc_sli4_cfg_shdr) + sizeof(uint32_t);
13693 if (reqlen > SLI4_PAGE_SIZE) {
13694 lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
13695 "2559 Block sgl registration required DMA "
13696 "size (%d) great than a page\n", reqlen);
13697 return -ENOMEM;
13698 }
13699 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
13700 if (!mbox)
13701 return -ENOMEM;
13702
13703
13704 alloclen = lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE,
13705 LPFC_MBOX_OPCODE_FCOE_POST_SGL_PAGES, reqlen,
13706 LPFC_SLI4_MBX_NEMBED);
13707
13708 if (alloclen < reqlen) {
13709 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13710 "0285 Allocated DMA memory size (%d) is "
13711 "less than the requested DMA memory "
13712 "size (%d)\n", alloclen, reqlen);
13713 lpfc_sli4_mbox_cmd_free(phba, mbox);
13714 return -ENOMEM;
13715 }
13716
13717 viraddr = mbox->sge_array->addr[0];
13718 sgl = (struct lpfc_mbx_post_uembed_sgl_page1 *)viraddr;
13719 sgl_pg_pairs = &sgl->sgl_pg_pairs;
13720
13721 pg_pairs = 0;
13722 list_for_each_entry_safe(sglq_entry, sglq_next, post_sgl_list, list) {
13723
13724 sgl_pg_pairs->sgl_pg0_addr_lo =
13725 cpu_to_le32(putPaddrLow(sglq_entry->phys));
13726 sgl_pg_pairs->sgl_pg0_addr_hi =
13727 cpu_to_le32(putPaddrHigh(sglq_entry->phys));
13728 sgl_pg_pairs->sgl_pg1_addr_lo =
13729 cpu_to_le32(putPaddrLow(0));
13730 sgl_pg_pairs->sgl_pg1_addr_hi =
13731 cpu_to_le32(putPaddrHigh(0));
13732
13733
13734 if (pg_pairs == 0)
13735 xritag_start = sglq_entry->sli4_xritag;
13736 sgl_pg_pairs++;
13737 pg_pairs++;
13738 }
13739
13740
13741 bf_set(lpfc_post_sgl_pages_xri, sgl, xritag_start);
13742 bf_set(lpfc_post_sgl_pages_xricnt, sgl, phba->sli4_hba.els_xri_cnt);
13743 sgl->word0 = cpu_to_le32(sgl->word0);
13744 if (!phba->sli4_hba.intr_enable)
13745 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
13746 else {
13747 mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
13748 rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
13749 }
13750 shdr = (union lpfc_sli4_cfg_shdr *) &sgl->cfg_shdr;
13751 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13752 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13753 if (rc != MBX_TIMEOUT)
13754 lpfc_sli4_mbox_cmd_free(phba, mbox);
13755 if (shdr_status || shdr_add_status || rc) {
13756 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
13757 "2513 POST_SGL_BLOCK mailbox command failed "
13758 "status x%x add_status x%x mbx status x%x\n",
13759 shdr_status, shdr_add_status, rc);
13760 rc = -ENXIO;
13761 }
13762 return rc;
13763}
13764
13765
13766
13767
13768
13769
13770
13771
13772
13773
13774
13775
13776int
13777lpfc_sli4_post_scsi_sgl_block(struct lpfc_hba *phba,
13778 struct list_head *sblist,
13779 int count)
13780{
13781 struct lpfc_scsi_buf *psb;
13782 struct lpfc_mbx_post_uembed_sgl_page1 *sgl;
13783 struct sgl_page_pairs *sgl_pg_pairs;
13784 void *viraddr;
13785 LPFC_MBOXQ_t *mbox;
13786 uint32_t reqlen, alloclen, pg_pairs;
13787 uint32_t mbox_tmo;
13788 uint16_t xritag_start = 0;
13789 int rc = 0;
13790 uint32_t shdr_status, shdr_add_status;
13791 dma_addr_t pdma_phys_bpl1;
13792 union lpfc_sli4_cfg_shdr *shdr;
13793
13794
13795 reqlen = count * sizeof(struct sgl_page_pairs) +
13796 sizeof(union lpfc_sli4_cfg_shdr) + sizeof(uint32_t);
13797 if (reqlen > SLI4_PAGE_SIZE) {
13798 lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
13799 "0217 Block sgl registration required DMA "
13800 "size (%d) great than a page\n", reqlen);
13801 return -ENOMEM;
13802 }
13803 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
13804 if (!mbox) {
13805 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13806 "0283 Failed to allocate mbox cmd memory\n");
13807 return -ENOMEM;
13808 }
13809
13810
13811 alloclen = lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE,
13812 LPFC_MBOX_OPCODE_FCOE_POST_SGL_PAGES, reqlen,
13813 LPFC_SLI4_MBX_NEMBED);
13814
13815 if (alloclen < reqlen) {
13816 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
13817 "2561 Allocated DMA memory size (%d) is "
13818 "less than the requested DMA memory "
13819 "size (%d)\n", alloclen, reqlen);
13820 lpfc_sli4_mbox_cmd_free(phba, mbox);
13821 return -ENOMEM;
13822 }
13823
13824
13825 viraddr = mbox->sge_array->addr[0];
13826
13827
13828 sgl = (struct lpfc_mbx_post_uembed_sgl_page1 *)viraddr;
13829 sgl_pg_pairs = &sgl->sgl_pg_pairs;
13830
13831 pg_pairs = 0;
13832 list_for_each_entry(psb, sblist, list) {
13833
13834 sgl_pg_pairs->sgl_pg0_addr_lo =
13835 cpu_to_le32(putPaddrLow(psb->dma_phys_bpl));
13836 sgl_pg_pairs->sgl_pg0_addr_hi =
13837 cpu_to_le32(putPaddrHigh(psb->dma_phys_bpl));
13838 if (phba->cfg_sg_dma_buf_size > SGL_PAGE_SIZE)
13839 pdma_phys_bpl1 = psb->dma_phys_bpl + SGL_PAGE_SIZE;
13840 else
13841 pdma_phys_bpl1 = 0;
13842 sgl_pg_pairs->sgl_pg1_addr_lo =
13843 cpu_to_le32(putPaddrLow(pdma_phys_bpl1));
13844 sgl_pg_pairs->sgl_pg1_addr_hi =
13845 cpu_to_le32(putPaddrHigh(pdma_phys_bpl1));
13846
13847 if (pg_pairs == 0)
13848 xritag_start = psb->cur_iocbq.sli4_xritag;
13849 sgl_pg_pairs++;
13850 pg_pairs++;
13851 }
13852 bf_set(lpfc_post_sgl_pages_xri, sgl, xritag_start);
13853 bf_set(lpfc_post_sgl_pages_xricnt, sgl, pg_pairs);
13854
13855 sgl->word0 = cpu_to_le32(sgl->word0);
13856
13857 if (!phba->sli4_hba.intr_enable)
13858 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
13859 else {
13860 mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
13861 rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
13862 }
13863 shdr = (union lpfc_sli4_cfg_shdr *) &sgl->cfg_shdr;
13864 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
13865 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
13866 if (rc != MBX_TIMEOUT)
13867 lpfc_sli4_mbox_cmd_free(phba, mbox);
13868 if (shdr_status || shdr_add_status || rc) {
13869 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
13870 "2564 POST_SGL_BLOCK mailbox command failed "
13871 "status x%x add_status x%x mbx status x%x\n",
13872 shdr_status, shdr_add_status, rc);
13873 rc = -ENXIO;
13874 }
13875 return rc;
13876}
13877
13878
13879
13880
13881
13882
13883
13884
13885
13886
13887
13888static int
13889lpfc_fc_frame_check(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr)
13890{
13891
13892 static char *rctl_names[] = FC_RCTL_NAMES_INIT;
13893 char *type_names[] = FC_TYPE_NAMES_INIT;
13894 struct fc_vft_header *fc_vft_hdr;
13895 uint32_t *header = (uint32_t *) fc_hdr;
13896
13897 switch (fc_hdr->fh_r_ctl) {
13898 case FC_RCTL_DD_UNCAT:
13899 case FC_RCTL_DD_SOL_DATA:
13900 case FC_RCTL_DD_UNSOL_CTL:
13901 case FC_RCTL_DD_SOL_CTL:
13902 case FC_RCTL_DD_UNSOL_DATA:
13903 case FC_RCTL_DD_DATA_DESC:
13904 case FC_RCTL_DD_UNSOL_CMD:
13905 case FC_RCTL_DD_CMD_STATUS:
13906 case FC_RCTL_ELS_REQ:
13907 case FC_RCTL_ELS_REP:
13908 case FC_RCTL_ELS4_REQ:
13909 case FC_RCTL_ELS4_REP:
13910 case FC_RCTL_BA_NOP:
13911 case FC_RCTL_BA_ABTS:
13912 case FC_RCTL_BA_RMC:
13913 case FC_RCTL_BA_ACC:
13914 case FC_RCTL_BA_RJT:
13915 case FC_RCTL_BA_PRMT:
13916 case FC_RCTL_ACK_1:
13917 case FC_RCTL_ACK_0:
13918 case FC_RCTL_P_RJT:
13919 case FC_RCTL_F_RJT:
13920 case FC_RCTL_P_BSY:
13921 case FC_RCTL_F_BSY:
13922 case FC_RCTL_F_BSYL:
13923 case FC_RCTL_LCR:
13924 case FC_RCTL_END:
13925 break;
13926 case FC_RCTL_VFTH:
13927 fc_vft_hdr = (struct fc_vft_header *)fc_hdr;
13928 fc_hdr = &((struct fc_frame_header *)fc_vft_hdr)[1];
13929 return lpfc_fc_frame_check(phba, fc_hdr);
13930 default:
13931 goto drop;
13932 }
13933 switch (fc_hdr->fh_type) {
13934 case FC_TYPE_BLS:
13935 case FC_TYPE_ELS:
13936 case FC_TYPE_FCP:
13937 case FC_TYPE_CT:
13938 break;
13939 case FC_TYPE_IP:
13940 case FC_TYPE_ILS:
13941 default:
13942 goto drop;
13943 }
13944
13945 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
13946 "2538 Received frame rctl:%s type:%s "
13947 "Frame Data:%08x %08x %08x %08x %08x %08x\n",
13948 rctl_names[fc_hdr->fh_r_ctl],
13949 type_names[fc_hdr->fh_type],
13950 be32_to_cpu(header[0]), be32_to_cpu(header[1]),
13951 be32_to_cpu(header[2]), be32_to_cpu(header[3]),
13952 be32_to_cpu(header[4]), be32_to_cpu(header[5]));
13953 return 0;
13954drop:
13955 lpfc_printf_log(phba, KERN_WARNING, LOG_ELS,
13956 "2539 Dropped frame rctl:%s type:%s\n",
13957 rctl_names[fc_hdr->fh_r_ctl],
13958 type_names[fc_hdr->fh_type]);
13959 return 1;
13960}
13961
13962
13963
13964
13965
13966
13967
13968
13969
13970static uint32_t
13971lpfc_fc_hdr_get_vfi(struct fc_frame_header *fc_hdr)
13972{
13973 struct fc_vft_header *fc_vft_hdr = (struct fc_vft_header *)fc_hdr;
13974
13975 if (fc_hdr->fh_r_ctl != FC_RCTL_VFTH)
13976 return 0;
13977 return bf_get(fc_vft_hdr_vf_id, fc_vft_hdr);
13978}
13979
13980
13981
13982
13983
13984
13985
13986
13987
13988
13989
13990
13991
13992static struct lpfc_vport *
13993lpfc_fc_frame_to_vport(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr,
13994 uint16_t fcfi)
13995{
13996 struct lpfc_vport **vports;
13997 struct lpfc_vport *vport = NULL;
13998 int i;
13999 uint32_t did = (fc_hdr->fh_d_id[0] << 16 |
14000 fc_hdr->fh_d_id[1] << 8 |
14001 fc_hdr->fh_d_id[2]);
14002
14003 if (did == Fabric_DID)
14004 return phba->pport;
14005 if ((phba->pport->fc_flag & FC_PT2PT) &&
14006 !(phba->link_state == LPFC_HBA_READY))
14007 return phba->pport;
14008
14009 vports = lpfc_create_vport_work_array(phba);
14010 if (vports != NULL)
14011 for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
14012 if (phba->fcf.fcfi == fcfi &&
14013 vports[i]->vfi == lpfc_fc_hdr_get_vfi(fc_hdr) &&
14014 vports[i]->fc_myDID == did) {
14015 vport = vports[i];
14016 break;
14017 }
14018 }
14019 lpfc_destroy_vport_work_array(phba, vports);
14020 return vport;
14021}
14022
14023
14024
14025
14026
14027
14028
14029
14030
14031
14032
14033void
14034lpfc_update_rcv_time_stamp(struct lpfc_vport *vport)
14035{
14036 struct lpfc_dmabuf *h_buf;
14037 struct hbq_dmabuf *dmabuf = NULL;
14038
14039
14040 h_buf = list_get_first(&vport->rcv_buffer_list,
14041 struct lpfc_dmabuf, list);
14042 if (!h_buf)
14043 return;
14044 dmabuf = container_of(h_buf, struct hbq_dmabuf, hbuf);
14045 vport->rcv_buffer_time_stamp = dmabuf->time_stamp;
14046}
14047
14048
14049
14050
14051
14052
14053
14054
14055
14056void
14057lpfc_cleanup_rcv_buffers(struct lpfc_vport *vport)
14058{
14059 struct lpfc_dmabuf *h_buf, *hnext;
14060 struct lpfc_dmabuf *d_buf, *dnext;
14061 struct hbq_dmabuf *dmabuf = NULL;
14062
14063
14064 list_for_each_entry_safe(h_buf, hnext, &vport->rcv_buffer_list, list) {
14065 dmabuf = container_of(h_buf, struct hbq_dmabuf, hbuf);
14066 list_del_init(&dmabuf->hbuf.list);
14067 list_for_each_entry_safe(d_buf, dnext,
14068 &dmabuf->dbuf.list, list) {
14069 list_del_init(&d_buf->list);
14070 lpfc_in_buf_free(vport->phba, d_buf);
14071 }
14072 lpfc_in_buf_free(vport->phba, &dmabuf->dbuf);
14073 }
14074}
14075
14076
14077
14078
14079
14080
14081
14082
14083
14084
14085
14086
14087
14088void
14089lpfc_rcv_seq_check_edtov(struct lpfc_vport *vport)
14090{
14091 struct lpfc_dmabuf *h_buf, *hnext;
14092 struct lpfc_dmabuf *d_buf, *dnext;
14093 struct hbq_dmabuf *dmabuf = NULL;
14094 unsigned long timeout;
14095 int abort_count = 0;
14096
14097 timeout = (msecs_to_jiffies(vport->phba->fc_edtov) +
14098 vport->rcv_buffer_time_stamp);
14099 if (list_empty(&vport->rcv_buffer_list) ||
14100 time_before(jiffies, timeout))
14101 return;
14102
14103 list_for_each_entry_safe(h_buf, hnext, &vport->rcv_buffer_list, list) {
14104 dmabuf = container_of(h_buf, struct hbq_dmabuf, hbuf);
14105 timeout = (msecs_to_jiffies(vport->phba->fc_edtov) +
14106 dmabuf->time_stamp);
14107 if (time_before(jiffies, timeout))
14108 break;
14109 abort_count++;
14110 list_del_init(&dmabuf->hbuf.list);
14111 list_for_each_entry_safe(d_buf, dnext,
14112 &dmabuf->dbuf.list, list) {
14113 list_del_init(&d_buf->list);
14114 lpfc_in_buf_free(vport->phba, d_buf);
14115 }
14116 lpfc_in_buf_free(vport->phba, &dmabuf->dbuf);
14117 }
14118 if (abort_count)
14119 lpfc_update_rcv_time_stamp(vport);
14120}
14121
14122
14123
14124
14125
14126
14127
14128
14129
14130
14131
14132
14133
14134static struct hbq_dmabuf *
14135lpfc_fc_frame_add(struct lpfc_vport *vport, struct hbq_dmabuf *dmabuf)
14136{
14137 struct fc_frame_header *new_hdr;
14138 struct fc_frame_header *temp_hdr;
14139 struct lpfc_dmabuf *d_buf;
14140 struct lpfc_dmabuf *h_buf;
14141 struct hbq_dmabuf *seq_dmabuf = NULL;
14142 struct hbq_dmabuf *temp_dmabuf = NULL;
14143
14144 INIT_LIST_HEAD(&dmabuf->dbuf.list);
14145 dmabuf->time_stamp = jiffies;
14146 new_hdr = (struct fc_frame_header *)dmabuf->hbuf.virt;
14147
14148 list_for_each_entry(h_buf, &vport->rcv_buffer_list, list) {
14149 temp_hdr = (struct fc_frame_header *)h_buf->virt;
14150 if ((temp_hdr->fh_seq_id != new_hdr->fh_seq_id) ||
14151 (temp_hdr->fh_ox_id != new_hdr->fh_ox_id) ||
14152 (memcmp(&temp_hdr->fh_s_id, &new_hdr->fh_s_id, 3)))
14153 continue;
14154
14155 seq_dmabuf = container_of(h_buf, struct hbq_dmabuf, hbuf);
14156 break;
14157 }
14158 if (!seq_dmabuf) {
14159
14160
14161
14162
14163 list_add_tail(&dmabuf->hbuf.list, &vport->rcv_buffer_list);
14164 lpfc_update_rcv_time_stamp(vport);
14165 return dmabuf;
14166 }
14167 temp_hdr = seq_dmabuf->hbuf.virt;
14168 if (be16_to_cpu(new_hdr->fh_seq_cnt) <
14169 be16_to_cpu(temp_hdr->fh_seq_cnt)) {
14170 list_del_init(&seq_dmabuf->hbuf.list);
14171 list_add_tail(&dmabuf->hbuf.list, &vport->rcv_buffer_list);
14172 list_add_tail(&dmabuf->dbuf.list, &seq_dmabuf->dbuf.list);
14173 lpfc_update_rcv_time_stamp(vport);
14174 return dmabuf;
14175 }
14176
14177 list_move_tail(&seq_dmabuf->hbuf.list, &vport->rcv_buffer_list);
14178 seq_dmabuf->time_stamp = jiffies;
14179 lpfc_update_rcv_time_stamp(vport);
14180 if (list_empty(&seq_dmabuf->dbuf.list)) {
14181 temp_hdr = dmabuf->hbuf.virt;
14182 list_add_tail(&dmabuf->dbuf.list, &seq_dmabuf->dbuf.list);
14183 return seq_dmabuf;
14184 }
14185
14186 list_for_each_entry_reverse(d_buf, &seq_dmabuf->dbuf.list, list) {
14187 temp_dmabuf = container_of(d_buf, struct hbq_dmabuf, dbuf);
14188 temp_hdr = (struct fc_frame_header *)temp_dmabuf->hbuf.virt;
14189
14190
14191
14192
14193 if (be16_to_cpu(new_hdr->fh_seq_cnt) >
14194 be16_to_cpu(temp_hdr->fh_seq_cnt)) {
14195 list_add(&dmabuf->dbuf.list, &temp_dmabuf->dbuf.list);
14196 return seq_dmabuf;
14197 }
14198 }
14199 return NULL;
14200}
14201
14202
14203
14204
14205
14206
14207
14208
14209
14210
14211
14212
14213
14214
14215
14216
14217
14218static bool
14219lpfc_sli4_abort_partial_seq(struct lpfc_vport *vport,
14220 struct hbq_dmabuf *dmabuf)
14221{
14222 struct fc_frame_header *new_hdr;
14223 struct fc_frame_header *temp_hdr;
14224 struct lpfc_dmabuf *d_buf, *n_buf, *h_buf;
14225 struct hbq_dmabuf *seq_dmabuf = NULL;
14226
14227
14228 INIT_LIST_HEAD(&dmabuf->dbuf.list);
14229 INIT_LIST_HEAD(&dmabuf->hbuf.list);
14230 new_hdr = (struct fc_frame_header *)dmabuf->hbuf.virt;
14231 list_for_each_entry(h_buf, &vport->rcv_buffer_list, list) {
14232 temp_hdr = (struct fc_frame_header *)h_buf->virt;
14233 if ((temp_hdr->fh_seq_id != new_hdr->fh_seq_id) ||
14234 (temp_hdr->fh_ox_id != new_hdr->fh_ox_id) ||
14235 (memcmp(&temp_hdr->fh_s_id, &new_hdr->fh_s_id, 3)))
14236 continue;
14237
14238 seq_dmabuf = container_of(h_buf, struct hbq_dmabuf, hbuf);
14239 break;
14240 }
14241
14242
14243 if (seq_dmabuf) {
14244 list_for_each_entry_safe(d_buf, n_buf,
14245 &seq_dmabuf->dbuf.list, list) {
14246 list_del_init(&d_buf->list);
14247 lpfc_in_buf_free(vport->phba, d_buf);
14248 }
14249 return true;
14250 }
14251 return false;
14252}
14253
14254
14255
14256
14257
14258
14259
14260
14261
14262
14263
14264
14265
14266
14267
14268
14269
14270static bool
14271lpfc_sli4_abort_ulp_seq(struct lpfc_vport *vport, struct hbq_dmabuf *dmabuf)
14272{
14273 struct lpfc_hba *phba = vport->phba;
14274 int handled;
14275
14276
14277 if (phba->sli_rev < LPFC_SLI_REV4)
14278 return false;
14279
14280
14281 handled = lpfc_ct_handle_unsol_abort(phba, dmabuf);
14282 if (handled)
14283 return true;
14284
14285 return false;
14286}
14287
14288
14289
14290
14291
14292
14293
14294
14295
14296
14297
14298static void
14299lpfc_sli4_seq_abort_rsp_cmpl(struct lpfc_hba *phba,
14300 struct lpfc_iocbq *cmd_iocbq,
14301 struct lpfc_iocbq *rsp_iocbq)
14302{
14303 struct lpfc_nodelist *ndlp;
14304
14305 if (cmd_iocbq) {
14306 ndlp = (struct lpfc_nodelist *)cmd_iocbq->context1;
14307 lpfc_nlp_put(ndlp);
14308 lpfc_nlp_not_used(ndlp);
14309 lpfc_sli_release_iocbq(phba, cmd_iocbq);
14310 }
14311
14312
14313 if (rsp_iocbq && rsp_iocbq->iocb.ulpStatus)
14314 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
14315 "3154 BLS ABORT RSP failed, data: x%x/x%x\n",
14316 rsp_iocbq->iocb.ulpStatus,
14317 rsp_iocbq->iocb.un.ulpWord[4]);
14318}
14319
14320
14321
14322
14323
14324
14325
14326
14327
14328uint16_t
14329lpfc_sli4_xri_inrange(struct lpfc_hba *phba,
14330 uint16_t xri)
14331{
14332 int i;
14333
14334 for (i = 0; i < phba->sli4_hba.max_cfg_param.max_xri; i++) {
14335 if (xri == phba->sli4_hba.xri_ids[i])
14336 return i;
14337 }
14338 return NO_XRI;
14339}
14340
14341
14342
14343
14344
14345
14346
14347
14348
14349static void
14350lpfc_sli4_seq_abort_rsp(struct lpfc_vport *vport,
14351 struct fc_frame_header *fc_hdr, bool aborted)
14352{
14353 struct lpfc_hba *phba = vport->phba;
14354 struct lpfc_iocbq *ctiocb = NULL;
14355 struct lpfc_nodelist *ndlp;
14356 uint16_t oxid, rxid, xri, lxri;
14357 uint32_t sid, fctl;
14358 IOCB_t *icmd;
14359 int rc;
14360
14361 if (!lpfc_is_link_up(phba))
14362 return;
14363
14364 sid = sli4_sid_from_fc_hdr(fc_hdr);
14365 oxid = be16_to_cpu(fc_hdr->fh_ox_id);
14366 rxid = be16_to_cpu(fc_hdr->fh_rx_id);
14367
14368 ndlp = lpfc_findnode_did(vport, sid);
14369 if (!ndlp) {
14370 ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
14371 if (!ndlp) {
14372 lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS,
14373 "1268 Failed to allocate ndlp for "
14374 "oxid:x%x SID:x%x\n", oxid, sid);
14375 return;
14376 }
14377 lpfc_nlp_init(vport, ndlp, sid);
14378
14379 lpfc_enqueue_node(vport, ndlp);
14380 } else if (!NLP_CHK_NODE_ACT(ndlp)) {
14381
14382 ndlp = lpfc_enable_node(vport, ndlp, NLP_STE_UNUSED_NODE);
14383 if (!ndlp) {
14384 lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS,
14385 "3275 Failed to active ndlp found "
14386 "for oxid:x%x SID:x%x\n", oxid, sid);
14387 return;
14388 }
14389 }
14390
14391
14392 ctiocb = lpfc_sli_get_iocbq(phba);
14393 if (!ctiocb)
14394 return;
14395
14396
14397 fctl = sli4_fctl_from_fc_hdr(fc_hdr);
14398
14399 icmd = &ctiocb->iocb;
14400 icmd->un.xseq64.bdl.bdeSize = 0;
14401 icmd->un.xseq64.bdl.ulpIoTag32 = 0;
14402 icmd->un.xseq64.w5.hcsw.Dfctl = 0;
14403 icmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_BA_ACC;
14404 icmd->un.xseq64.w5.hcsw.Type = FC_TYPE_BLS;
14405
14406
14407 icmd->ulpCommand = CMD_XMIT_BLS_RSP64_CX;
14408 icmd->ulpBdeCount = 0;
14409 icmd->ulpLe = 1;
14410 icmd->ulpClass = CLASS3;
14411 icmd->ulpContext = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
14412 ctiocb->context1 = lpfc_nlp_get(ndlp);
14413
14414 ctiocb->iocb_cmpl = NULL;
14415 ctiocb->vport = phba->pport;
14416 ctiocb->iocb_cmpl = lpfc_sli4_seq_abort_rsp_cmpl;
14417 ctiocb->sli4_lxritag = NO_XRI;
14418 ctiocb->sli4_xritag = NO_XRI;
14419
14420 if (fctl & FC_FC_EX_CTX)
14421
14422
14423
14424 xri = oxid;
14425 else
14426 xri = rxid;
14427 lxri = lpfc_sli4_xri_inrange(phba, xri);
14428 if (lxri != NO_XRI)
14429 lpfc_set_rrq_active(phba, ndlp, lxri,
14430 (xri == oxid) ? rxid : oxid, 0);
14431
14432
14433
14434
14435
14436 if ((fctl & FC_FC_EX_CTX) &&
14437 (lxri > lpfc_sli4_get_els_iocb_cnt(phba))) {
14438 icmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_BA_RJT;
14439 bf_set(lpfc_vndr_code, &icmd->un.bls_rsp, 0);
14440 bf_set(lpfc_rsn_expln, &icmd->un.bls_rsp, FC_BA_RJT_INV_XID);
14441 bf_set(lpfc_rsn_code, &icmd->un.bls_rsp, FC_BA_RJT_UNABLE);
14442 }
14443
14444
14445
14446
14447
14448 if (aborted == false) {
14449 icmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_BA_RJT;
14450 bf_set(lpfc_vndr_code, &icmd->un.bls_rsp, 0);
14451 bf_set(lpfc_rsn_expln, &icmd->un.bls_rsp, FC_BA_RJT_INV_XID);
14452 bf_set(lpfc_rsn_code, &icmd->un.bls_rsp, FC_BA_RJT_UNABLE);
14453 }
14454
14455 if (fctl & FC_FC_EX_CTX) {
14456
14457
14458
14459
14460 bf_set(lpfc_abts_orig, &icmd->un.bls_rsp, LPFC_ABTS_UNSOL_RSP);
14461 } else {
14462
14463
14464
14465
14466 bf_set(lpfc_abts_orig, &icmd->un.bls_rsp, LPFC_ABTS_UNSOL_INT);
14467 }
14468 bf_set(lpfc_abts_rxid, &icmd->un.bls_rsp, rxid);
14469 bf_set(lpfc_abts_oxid, &icmd->un.bls_rsp, oxid);
14470
14471
14472 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
14473 "1200 Send BLS cmd x%x on oxid x%x Data: x%x\n",
14474 icmd->un.xseq64.w5.hcsw.Rctl, oxid, phba->link_state);
14475
14476 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, ctiocb, 0);
14477 if (rc == IOCB_ERROR) {
14478 lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
14479 "2925 Failed to issue CT ABTS RSP x%x on "
14480 "xri x%x, Data x%x\n",
14481 icmd->un.xseq64.w5.hcsw.Rctl, oxid,
14482 phba->link_state);
14483 lpfc_nlp_put(ndlp);
14484 ctiocb->context1 = NULL;
14485 lpfc_sli_release_iocbq(phba, ctiocb);
14486 }
14487}
14488
14489
14490
14491
14492
14493
14494
14495
14496
14497
14498
14499
14500
14501
14502void
14503lpfc_sli4_handle_unsol_abort(struct lpfc_vport *vport,
14504 struct hbq_dmabuf *dmabuf)
14505{
14506 struct lpfc_hba *phba = vport->phba;
14507 struct fc_frame_header fc_hdr;
14508 uint32_t fctl;
14509 bool aborted;
14510
14511
14512 memcpy(&fc_hdr, dmabuf->hbuf.virt, sizeof(struct fc_frame_header));
14513 fctl = sli4_fctl_from_fc_hdr(&fc_hdr);
14514
14515 if (fctl & FC_FC_EX_CTX) {
14516
14517 aborted = true;
14518 } else {
14519
14520 aborted = lpfc_sli4_abort_partial_seq(vport, dmabuf);
14521 if (aborted == false)
14522 aborted = lpfc_sli4_abort_ulp_seq(vport, dmabuf);
14523 }
14524 lpfc_in_buf_free(phba, &dmabuf->dbuf);
14525
14526
14527 lpfc_sli4_seq_abort_rsp(vport, &fc_hdr, aborted);
14528}
14529
14530
14531
14532
14533
14534
14535
14536
14537
14538
14539
14540
14541
14542static int
14543lpfc_seq_complete(struct hbq_dmabuf *dmabuf)
14544{
14545 struct fc_frame_header *hdr;
14546 struct lpfc_dmabuf *d_buf;
14547 struct hbq_dmabuf *seq_dmabuf;
14548 uint32_t fctl;
14549 int seq_count = 0;
14550
14551 hdr = (struct fc_frame_header *)dmabuf->hbuf.virt;
14552
14553 if (hdr->fh_seq_cnt != seq_count)
14554 return 0;
14555 fctl = (hdr->fh_f_ctl[0] << 16 |
14556 hdr->fh_f_ctl[1] << 8 |
14557 hdr->fh_f_ctl[2]);
14558
14559 if (fctl & FC_FC_END_SEQ)
14560 return 1;
14561 list_for_each_entry(d_buf, &dmabuf->dbuf.list, list) {
14562 seq_dmabuf = container_of(d_buf, struct hbq_dmabuf, dbuf);
14563 hdr = (struct fc_frame_header *)seq_dmabuf->hbuf.virt;
14564
14565 if (++seq_count != be16_to_cpu(hdr->fh_seq_cnt))
14566 return 0;
14567 fctl = (hdr->fh_f_ctl[0] << 16 |
14568 hdr->fh_f_ctl[1] << 8 |
14569 hdr->fh_f_ctl[2]);
14570
14571 if (fctl & FC_FC_END_SEQ)
14572 return 1;
14573 }
14574 return 0;
14575}
14576
14577
14578
14579
14580
14581
14582
14583
14584
14585
14586
14587
14588
14589
14590static struct lpfc_iocbq *
14591lpfc_prep_seq(struct lpfc_vport *vport, struct hbq_dmabuf *seq_dmabuf)
14592{
14593 struct hbq_dmabuf *hbq_buf;
14594 struct lpfc_dmabuf *d_buf, *n_buf;
14595 struct lpfc_iocbq *first_iocbq, *iocbq;
14596 struct fc_frame_header *fc_hdr;
14597 uint32_t sid;
14598 uint32_t len, tot_len;
14599 struct ulp_bde64 *pbde;
14600
14601 fc_hdr = (struct fc_frame_header *)seq_dmabuf->hbuf.virt;
14602
14603 list_del_init(&seq_dmabuf->hbuf.list);
14604 lpfc_update_rcv_time_stamp(vport);
14605
14606 sid = sli4_sid_from_fc_hdr(fc_hdr);
14607 tot_len = 0;
14608
14609 first_iocbq = lpfc_sli_get_iocbq(vport->phba);
14610 if (first_iocbq) {
14611
14612 first_iocbq->iocb.unsli3.rcvsli3.acc_len = 0;
14613 first_iocbq->iocb.ulpStatus = IOSTAT_SUCCESS;
14614
14615
14616 if (sli4_type_from_fc_hdr(fc_hdr) == FC_TYPE_ELS) {
14617 first_iocbq->iocb.ulpCommand = CMD_IOCB_RCV_ELS64_CX;
14618 first_iocbq->iocb.un.rcvels.parmRo =
14619 sli4_did_from_fc_hdr(fc_hdr);
14620 first_iocbq->iocb.ulpPU = PARM_NPIV_DID;
14621 } else
14622 first_iocbq->iocb.ulpCommand = CMD_IOCB_RCV_SEQ64_CX;
14623 first_iocbq->iocb.ulpContext = NO_XRI;
14624 first_iocbq->iocb.unsli3.rcvsli3.ox_id =
14625 be16_to_cpu(fc_hdr->fh_ox_id);
14626
14627 first_iocbq->iocb.unsli3.rcvsli3.vpi =
14628 vport->phba->vpi_ids[vport->vpi];
14629
14630 first_iocbq->context2 = &seq_dmabuf->dbuf;
14631 first_iocbq->context3 = NULL;
14632 first_iocbq->iocb.ulpBdeCount = 1;
14633 first_iocbq->iocb.un.cont64[0].tus.f.bdeSize =
14634 LPFC_DATA_BUF_SIZE;
14635 first_iocbq->iocb.un.rcvels.remoteID = sid;
14636 tot_len = bf_get(lpfc_rcqe_length,
14637 &seq_dmabuf->cq_event.cqe.rcqe_cmpl);
14638 first_iocbq->iocb.unsli3.rcvsli3.acc_len = tot_len;
14639 }
14640 iocbq = first_iocbq;
14641
14642
14643
14644
14645 list_for_each_entry_safe(d_buf, n_buf, &seq_dmabuf->dbuf.list, list) {
14646 if (!iocbq) {
14647 lpfc_in_buf_free(vport->phba, d_buf);
14648 continue;
14649 }
14650 if (!iocbq->context3) {
14651 iocbq->context3 = d_buf;
14652 iocbq->iocb.ulpBdeCount++;
14653 pbde = (struct ulp_bde64 *)
14654 &iocbq->iocb.unsli3.sli3Words[4];
14655 pbde->tus.f.bdeSize = LPFC_DATA_BUF_SIZE;
14656
14657
14658 hbq_buf = container_of(d_buf, struct hbq_dmabuf, dbuf);
14659 len = bf_get(lpfc_rcqe_length,
14660 &hbq_buf->cq_event.cqe.rcqe_cmpl);
14661 iocbq->iocb.unsli3.rcvsli3.acc_len += len;
14662 tot_len += len;
14663 } else {
14664 iocbq = lpfc_sli_get_iocbq(vport->phba);
14665 if (!iocbq) {
14666 if (first_iocbq) {
14667 first_iocbq->iocb.ulpStatus =
14668 IOSTAT_FCP_RSP_ERROR;
14669 first_iocbq->iocb.un.ulpWord[4] =
14670 IOERR_NO_RESOURCES;
14671 }
14672 lpfc_in_buf_free(vport->phba, d_buf);
14673 continue;
14674 }
14675 iocbq->context2 = d_buf;
14676 iocbq->context3 = NULL;
14677 iocbq->iocb.ulpBdeCount = 1;
14678 iocbq->iocb.un.cont64[0].tus.f.bdeSize =
14679 LPFC_DATA_BUF_SIZE;
14680
14681
14682 hbq_buf = container_of(d_buf, struct hbq_dmabuf, dbuf);
14683 len = bf_get(lpfc_rcqe_length,
14684 &hbq_buf->cq_event.cqe.rcqe_cmpl);
14685 tot_len += len;
14686 iocbq->iocb.unsli3.rcvsli3.acc_len = tot_len;
14687
14688 iocbq->iocb.un.rcvels.remoteID = sid;
14689 list_add_tail(&iocbq->list, &first_iocbq->list);
14690 }
14691 }
14692 return first_iocbq;
14693}
14694
14695static void
14696lpfc_sli4_send_seq_to_ulp(struct lpfc_vport *vport,
14697 struct hbq_dmabuf *seq_dmabuf)
14698{
14699 struct fc_frame_header *fc_hdr;
14700 struct lpfc_iocbq *iocbq, *curr_iocb, *next_iocb;
14701 struct lpfc_hba *phba = vport->phba;
14702
14703 fc_hdr = (struct fc_frame_header *)seq_dmabuf->hbuf.virt;
14704 iocbq = lpfc_prep_seq(vport, seq_dmabuf);
14705 if (!iocbq) {
14706 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
14707 "2707 Ring %d handler: Failed to allocate "
14708 "iocb Rctl x%x Type x%x received\n",
14709 LPFC_ELS_RING,
14710 fc_hdr->fh_r_ctl, fc_hdr->fh_type);
14711 return;
14712 }
14713 if (!lpfc_complete_unsol_iocb(phba,
14714 &phba->sli.ring[LPFC_ELS_RING],
14715 iocbq, fc_hdr->fh_r_ctl,
14716 fc_hdr->fh_type))
14717 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
14718 "2540 Ring %d handler: unexpected Rctl "
14719 "x%x Type x%x received\n",
14720 LPFC_ELS_RING,
14721 fc_hdr->fh_r_ctl, fc_hdr->fh_type);
14722
14723
14724 list_for_each_entry_safe(curr_iocb, next_iocb,
14725 &iocbq->list, list) {
14726 list_del_init(&curr_iocb->list);
14727 lpfc_sli_release_iocbq(phba, curr_iocb);
14728 }
14729 lpfc_sli_release_iocbq(phba, iocbq);
14730}
14731
14732
14733
14734
14735
14736
14737
14738
14739
14740
14741
14742
14743
14744void
14745lpfc_sli4_handle_received_buffer(struct lpfc_hba *phba,
14746 struct hbq_dmabuf *dmabuf)
14747{
14748 struct hbq_dmabuf *seq_dmabuf;
14749 struct fc_frame_header *fc_hdr;
14750 struct lpfc_vport *vport;
14751 uint32_t fcfi;
14752 uint32_t did;
14753
14754
14755 fc_hdr = (struct fc_frame_header *)dmabuf->hbuf.virt;
14756
14757 if (lpfc_fc_frame_check(phba, fc_hdr)) {
14758 lpfc_in_buf_free(phba, &dmabuf->dbuf);
14759 return;
14760 }
14761 if ((bf_get(lpfc_cqe_code,
14762 &dmabuf->cq_event.cqe.rcqe_cmpl) == CQE_CODE_RECEIVE_V1))
14763 fcfi = bf_get(lpfc_rcqe_fcf_id_v1,
14764 &dmabuf->cq_event.cqe.rcqe_cmpl);
14765 else
14766 fcfi = bf_get(lpfc_rcqe_fcf_id,
14767 &dmabuf->cq_event.cqe.rcqe_cmpl);
14768
14769 vport = lpfc_fc_frame_to_vport(phba, fc_hdr, fcfi);
14770 if (!vport) {
14771
14772 lpfc_in_buf_free(phba, &dmabuf->dbuf);
14773 return;
14774 }
14775
14776
14777 did = sli4_did_from_fc_hdr(fc_hdr);
14778
14779
14780 if (!(vport->vpi_state & LPFC_VPI_REGISTERED) &&
14781 (did != Fabric_DID)) {
14782
14783
14784
14785
14786
14787 if (!(vport->fc_flag & FC_PT2PT) ||
14788 (phba->link_state == LPFC_HBA_READY)) {
14789 lpfc_in_buf_free(phba, &dmabuf->dbuf);
14790 return;
14791 }
14792 }
14793
14794
14795 if (fc_hdr->fh_r_ctl == FC_RCTL_BA_ABTS) {
14796 lpfc_sli4_handle_unsol_abort(vport, dmabuf);
14797 return;
14798 }
14799
14800
14801 seq_dmabuf = lpfc_fc_frame_add(vport, dmabuf);
14802 if (!seq_dmabuf) {
14803
14804 lpfc_in_buf_free(phba, &dmabuf->dbuf);
14805 return;
14806 }
14807
14808 if (!lpfc_seq_complete(seq_dmabuf))
14809 return;
14810
14811
14812 lpfc_sli4_send_seq_to_ulp(vport, seq_dmabuf);
14813}
14814
14815
14816
14817
14818
14819
14820
14821
14822
14823
14824
14825
14826
14827
14828
14829
14830
14831
14832
14833
14834
14835
14836int
14837lpfc_sli4_post_all_rpi_hdrs(struct lpfc_hba *phba)
14838{
14839 struct lpfc_rpi_hdr *rpi_page;
14840 uint32_t rc = 0;
14841 uint16_t lrpi = 0;
14842
14843
14844 if (!phba->sli4_hba.rpi_hdrs_in_use)
14845 goto exit;
14846 if (phba->sli4_hba.extents_in_use)
14847 return -EIO;
14848
14849 list_for_each_entry(rpi_page, &phba->sli4_hba.lpfc_rpi_hdr_list, list) {
14850
14851
14852
14853
14854
14855 if (bf_get(lpfc_rpi_rsrc_rdy, &phba->sli4_hba.sli4_flags) !=
14856 LPFC_RPI_RSRC_RDY)
14857 rpi_page->start_rpi = phba->sli4_hba.rpi_ids[lrpi];
14858
14859 rc = lpfc_sli4_post_rpi_hdr(phba, rpi_page);
14860 if (rc != MBX_SUCCESS) {
14861 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
14862 "2008 Error %d posting all rpi "
14863 "headers\n", rc);
14864 rc = -EIO;
14865 break;
14866 }
14867 }
14868
14869 exit:
14870 bf_set(lpfc_rpi_rsrc_rdy, &phba->sli4_hba.sli4_flags,
14871 LPFC_RPI_RSRC_RDY);
14872 return rc;
14873}
14874
14875
14876
14877
14878
14879
14880
14881
14882
14883
14884
14885
14886
14887
14888
14889int
14890lpfc_sli4_post_rpi_hdr(struct lpfc_hba *phba, struct lpfc_rpi_hdr *rpi_page)
14891{
14892 LPFC_MBOXQ_t *mboxq;
14893 struct lpfc_mbx_post_hdr_tmpl *hdr_tmpl;
14894 uint32_t rc = 0;
14895 uint32_t shdr_status, shdr_add_status;
14896 union lpfc_sli4_cfg_shdr *shdr;
14897
14898
14899 if (!phba->sli4_hba.rpi_hdrs_in_use)
14900 return rc;
14901 if (phba->sli4_hba.extents_in_use)
14902 return -EIO;
14903
14904
14905 mboxq = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
14906 if (!mboxq) {
14907 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
14908 "2001 Unable to allocate memory for issuing "
14909 "SLI_CONFIG_SPECIAL mailbox command\n");
14910 return -ENOMEM;
14911 }
14912
14913
14914 hdr_tmpl = &mboxq->u.mqe.un.hdr_tmpl;
14915 lpfc_sli4_config(phba, mboxq, LPFC_MBOX_SUBSYSTEM_FCOE,
14916 LPFC_MBOX_OPCODE_FCOE_POST_HDR_TEMPLATE,
14917 sizeof(struct lpfc_mbx_post_hdr_tmpl) -
14918 sizeof(struct lpfc_sli4_cfg_mhdr),
14919 LPFC_SLI4_MBX_EMBED);
14920
14921
14922
14923 bf_set(lpfc_mbx_post_hdr_tmpl_rpi_offset, hdr_tmpl,
14924 rpi_page->start_rpi);
14925 bf_set(lpfc_mbx_post_hdr_tmpl_page_cnt,
14926 hdr_tmpl, rpi_page->page_count);
14927
14928 hdr_tmpl->rpi_paddr_lo = putPaddrLow(rpi_page->dmabuf->phys);
14929 hdr_tmpl->rpi_paddr_hi = putPaddrHigh(rpi_page->dmabuf->phys);
14930 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
14931 shdr = (union lpfc_sli4_cfg_shdr *) &hdr_tmpl->header.cfg_shdr;
14932 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
14933 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
14934 if (rc != MBX_TIMEOUT)
14935 mempool_free(mboxq, phba->mbox_mem_pool);
14936 if (shdr_status || shdr_add_status || rc) {
14937 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
14938 "2514 POST_RPI_HDR mailbox failed with "
14939 "status x%x add_status x%x, mbx status x%x\n",
14940 shdr_status, shdr_add_status, rc);
14941 rc = -ENXIO;
14942 }
14943 return rc;
14944}
14945
14946
14947
14948
14949
14950
14951
14952
14953
14954
14955
14956
14957
14958
14959int
14960lpfc_sli4_alloc_rpi(struct lpfc_hba *phba)
14961{
14962 unsigned long rpi;
14963 uint16_t max_rpi, rpi_limit;
14964 uint16_t rpi_remaining, lrpi = 0;
14965 struct lpfc_rpi_hdr *rpi_hdr;
14966
14967 max_rpi = phba->sli4_hba.max_cfg_param.max_rpi;
14968 rpi_limit = phba->sli4_hba.next_rpi;
14969
14970
14971
14972
14973
14974 spin_lock_irq(&phba->hbalock);
14975 rpi = find_next_zero_bit(phba->sli4_hba.rpi_bmask, rpi_limit, 0);
14976 if (rpi >= rpi_limit)
14977 rpi = LPFC_RPI_ALLOC_ERROR;
14978 else {
14979 set_bit(rpi, phba->sli4_hba.rpi_bmask);
14980 phba->sli4_hba.max_cfg_param.rpi_used++;
14981 phba->sli4_hba.rpi_count++;
14982 }
14983
14984
14985
14986
14987
14988 if ((rpi == LPFC_RPI_ALLOC_ERROR) &&
14989 (phba->sli4_hba.rpi_count >= max_rpi)) {
14990 spin_unlock_irq(&phba->hbalock);
14991 return rpi;
14992 }
14993
14994
14995
14996
14997
14998 if (!phba->sli4_hba.rpi_hdrs_in_use) {
14999 spin_unlock_irq(&phba->hbalock);
15000 return rpi;
15001 }
15002
15003
15004
15005
15006
15007
15008
15009 rpi_remaining = phba->sli4_hba.next_rpi - phba->sli4_hba.rpi_count;
15010 spin_unlock_irq(&phba->hbalock);
15011 if (rpi_remaining < LPFC_RPI_LOW_WATER_MARK) {
15012 rpi_hdr = lpfc_sli4_create_rpi_hdr(phba);
15013 if (!rpi_hdr) {
15014 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
15015 "2002 Error Could not grow rpi "
15016 "count\n");
15017 } else {
15018 lrpi = rpi_hdr->start_rpi;
15019 rpi_hdr->start_rpi = phba->sli4_hba.rpi_ids[lrpi];
15020 lpfc_sli4_post_rpi_hdr(phba, rpi_hdr);
15021 }
15022 }
15023
15024 return rpi;
15025}
15026
15027
15028
15029
15030
15031
15032
15033
15034void
15035__lpfc_sli4_free_rpi(struct lpfc_hba *phba, int rpi)
15036{
15037 if (test_and_clear_bit(rpi, phba->sli4_hba.rpi_bmask)) {
15038 phba->sli4_hba.rpi_count--;
15039 phba->sli4_hba.max_cfg_param.rpi_used--;
15040 }
15041}
15042
15043
15044
15045
15046
15047
15048
15049
15050void
15051lpfc_sli4_free_rpi(struct lpfc_hba *phba, int rpi)
15052{
15053 spin_lock_irq(&phba->hbalock);
15054 __lpfc_sli4_free_rpi(phba, rpi);
15055 spin_unlock_irq(&phba->hbalock);
15056}
15057
15058
15059
15060
15061
15062
15063
15064
15065void
15066lpfc_sli4_remove_rpis(struct lpfc_hba *phba)
15067{
15068 kfree(phba->sli4_hba.rpi_bmask);
15069 kfree(phba->sli4_hba.rpi_ids);
15070 bf_set(lpfc_rpi_rsrc_rdy, &phba->sli4_hba.sli4_flags, 0);
15071}
15072
15073
15074
15075
15076
15077
15078
15079
15080int
15081lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp,
15082 void (*cmpl)(struct lpfc_hba *, LPFC_MBOXQ_t *), void *arg)
15083{
15084 LPFC_MBOXQ_t *mboxq;
15085 struct lpfc_hba *phba = ndlp->phba;
15086 int rc;
15087
15088
15089 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
15090 if (!mboxq)
15091 return -ENOMEM;
15092
15093
15094 lpfc_resume_rpi(mboxq, ndlp);
15095 if (cmpl) {
15096 mboxq->mbox_cmpl = cmpl;
15097 mboxq->context1 = arg;
15098 mboxq->context2 = ndlp;
15099 } else
15100 mboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
15101 mboxq->vport = ndlp->vport;
15102 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
15103 if (rc == MBX_NOT_FINISHED) {
15104 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
15105 "2010 Resume RPI Mailbox failed "
15106 "status %d, mbxStatus x%x\n", rc,
15107 bf_get(lpfc_mqe_status, &mboxq->u.mqe));
15108 mempool_free(mboxq, phba->mbox_mem_pool);
15109 return -EIO;
15110 }
15111 return 0;
15112}
15113
15114
15115
15116
15117
15118
15119
15120
15121
15122
15123
15124int
15125lpfc_sli4_init_vpi(struct lpfc_vport *vport)
15126{
15127 LPFC_MBOXQ_t *mboxq;
15128 int rc = 0;
15129 int retval = MBX_SUCCESS;
15130 uint32_t mbox_tmo;
15131 struct lpfc_hba *phba = vport->phba;
15132 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
15133 if (!mboxq)
15134 return -ENOMEM;
15135 lpfc_init_vpi(phba, mboxq, vport->vpi);
15136 mbox_tmo = lpfc_mbox_tmo_val(phba, mboxq);
15137 rc = lpfc_sli_issue_mbox_wait(phba, mboxq, mbox_tmo);
15138 if (rc != MBX_SUCCESS) {
15139 lpfc_printf_vlog(vport, KERN_ERR, LOG_SLI,
15140 "2022 INIT VPI Mailbox failed "
15141 "status %d, mbxStatus x%x\n", rc,
15142 bf_get(lpfc_mqe_status, &mboxq->u.mqe));
15143 retval = -EIO;
15144 }
15145 if (rc != MBX_TIMEOUT)
15146 mempool_free(mboxq, vport->phba->mbox_mem_pool);
15147
15148 return retval;
15149}
15150
15151
15152
15153
15154
15155
15156
15157
15158
15159
15160static void
15161lpfc_mbx_cmpl_add_fcf_record(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
15162{
15163 void *virt_addr;
15164 union lpfc_sli4_cfg_shdr *shdr;
15165 uint32_t shdr_status, shdr_add_status;
15166
15167 virt_addr = mboxq->sge_array->addr[0];
15168
15169 shdr = (union lpfc_sli4_cfg_shdr *) virt_addr;
15170 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
15171 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
15172
15173 if ((shdr_status || shdr_add_status) &&
15174 (shdr_status != STATUS_FCF_IN_USE))
15175 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
15176 "2558 ADD_FCF_RECORD mailbox failed with "
15177 "status x%x add_status x%x\n",
15178 shdr_status, shdr_add_status);
15179
15180 lpfc_sli4_mbox_cmd_free(phba, mboxq);
15181}
15182
15183
15184
15185
15186
15187
15188
15189
15190
15191
15192int
15193lpfc_sli4_add_fcf_record(struct lpfc_hba *phba, struct fcf_record *fcf_record)
15194{
15195 int rc = 0;
15196 LPFC_MBOXQ_t *mboxq;
15197 uint8_t *bytep;
15198 void *virt_addr;
15199 dma_addr_t phys_addr;
15200 struct lpfc_mbx_sge sge;
15201 uint32_t alloc_len, req_len;
15202 uint32_t fcfindex;
15203
15204 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
15205 if (!mboxq) {
15206 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
15207 "2009 Failed to allocate mbox for ADD_FCF cmd\n");
15208 return -ENOMEM;
15209 }
15210
15211 req_len = sizeof(struct fcf_record) + sizeof(union lpfc_sli4_cfg_shdr) +
15212 sizeof(uint32_t);
15213
15214
15215 alloc_len = lpfc_sli4_config(phba, mboxq, LPFC_MBOX_SUBSYSTEM_FCOE,
15216 LPFC_MBOX_OPCODE_FCOE_ADD_FCF,
15217 req_len, LPFC_SLI4_MBX_NEMBED);
15218 if (alloc_len < req_len) {
15219 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
15220 "2523 Allocated DMA memory size (x%x) is "
15221 "less than the requested DMA memory "
15222 "size (x%x)\n", alloc_len, req_len);
15223 lpfc_sli4_mbox_cmd_free(phba, mboxq);
15224 return -ENOMEM;
15225 }
15226
15227
15228
15229
15230
15231 lpfc_sli4_mbx_sge_get(mboxq, 0, &sge);
15232 phys_addr = getPaddr(sge.pa_hi, sge.pa_lo);
15233 virt_addr = mboxq->sge_array->addr[0];
15234
15235
15236
15237
15238 fcfindex = bf_get(lpfc_fcf_record_fcf_index, fcf_record);
15239 bytep = virt_addr + sizeof(union lpfc_sli4_cfg_shdr);
15240 lpfc_sli_pcimem_bcopy(&fcfindex, bytep, sizeof(uint32_t));
15241
15242
15243
15244
15245
15246
15247 bytep += sizeof(uint32_t);
15248 lpfc_sli_pcimem_bcopy(fcf_record, bytep, sizeof(struct fcf_record));
15249 mboxq->vport = phba->pport;
15250 mboxq->mbox_cmpl = lpfc_mbx_cmpl_add_fcf_record;
15251 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
15252 if (rc == MBX_NOT_FINISHED) {
15253 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
15254 "2515 ADD_FCF_RECORD mailbox failed with "
15255 "status 0x%x\n", rc);
15256 lpfc_sli4_mbox_cmd_free(phba, mboxq);
15257 rc = -EIO;
15258 } else
15259 rc = 0;
15260
15261 return rc;
15262}
15263
15264
15265
15266
15267
15268
15269
15270
15271
15272
15273
15274void
15275lpfc_sli4_build_dflt_fcf_record(struct lpfc_hba *phba,
15276 struct fcf_record *fcf_record,
15277 uint16_t fcf_index)
15278{
15279 memset(fcf_record, 0, sizeof(struct fcf_record));
15280 fcf_record->max_rcv_size = LPFC_FCOE_MAX_RCV_SIZE;
15281 fcf_record->fka_adv_period = LPFC_FCOE_FKA_ADV_PER;
15282 fcf_record->fip_priority = LPFC_FCOE_FIP_PRIORITY;
15283 bf_set(lpfc_fcf_record_mac_0, fcf_record, phba->fc_map[0]);
15284 bf_set(lpfc_fcf_record_mac_1, fcf_record, phba->fc_map[1]);
15285 bf_set(lpfc_fcf_record_mac_2, fcf_record, phba->fc_map[2]);
15286 bf_set(lpfc_fcf_record_mac_3, fcf_record, LPFC_FCOE_FCF_MAC3);
15287 bf_set(lpfc_fcf_record_mac_4, fcf_record, LPFC_FCOE_FCF_MAC4);
15288 bf_set(lpfc_fcf_record_mac_5, fcf_record, LPFC_FCOE_FCF_MAC5);
15289 bf_set(lpfc_fcf_record_fc_map_0, fcf_record, phba->fc_map[0]);
15290 bf_set(lpfc_fcf_record_fc_map_1, fcf_record, phba->fc_map[1]);
15291 bf_set(lpfc_fcf_record_fc_map_2, fcf_record, phba->fc_map[2]);
15292 bf_set(lpfc_fcf_record_fcf_valid, fcf_record, 1);
15293 bf_set(lpfc_fcf_record_fcf_avail, fcf_record, 1);
15294 bf_set(lpfc_fcf_record_fcf_index, fcf_record, fcf_index);
15295 bf_set(lpfc_fcf_record_mac_addr_prov, fcf_record,
15296 LPFC_FCF_FPMA | LPFC_FCF_SPMA);
15297
15298 if (phba->valid_vlan) {
15299 fcf_record->vlan_bitmap[phba->vlan_id / 8]
15300 = 1 << (phba->vlan_id % 8);
15301 }
15302}
15303
15304
15305
15306
15307
15308
15309
15310
15311
15312
15313
15314
15315
15316int
15317lpfc_sli4_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index)
15318{
15319 int rc = 0, error;
15320 LPFC_MBOXQ_t *mboxq;
15321
15322 phba->fcoe_eventtag_at_fcf_scan = phba->fcoe_eventtag;
15323 phba->fcoe_cvl_eventtag_attn = phba->fcoe_cvl_eventtag;
15324 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
15325 if (!mboxq) {
15326 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
15327 "2000 Failed to allocate mbox for "
15328 "READ_FCF cmd\n");
15329 error = -ENOMEM;
15330 goto fail_fcf_scan;
15331 }
15332
15333 rc = lpfc_sli4_mbx_read_fcf_rec(phba, mboxq, fcf_index);
15334 if (rc) {
15335 error = -EINVAL;
15336 goto fail_fcf_scan;
15337 }
15338
15339 mboxq->vport = phba->pport;
15340 mboxq->mbox_cmpl = lpfc_mbx_cmpl_fcf_scan_read_fcf_rec;
15341
15342 spin_lock_irq(&phba->hbalock);
15343 phba->hba_flag |= FCF_TS_INPROG;
15344 spin_unlock_irq(&phba->hbalock);
15345
15346 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
15347 if (rc == MBX_NOT_FINISHED)
15348 error = -EIO;
15349 else {
15350
15351 if (fcf_index == LPFC_FCOE_FCF_GET_FIRST)
15352 phba->fcf.eligible_fcf_cnt = 0;
15353 error = 0;
15354 }
15355fail_fcf_scan:
15356 if (error) {
15357 if (mboxq)
15358 lpfc_sli4_mbox_cmd_free(phba, mboxq);
15359
15360 spin_lock_irq(&phba->hbalock);
15361 phba->hba_flag &= ~FCF_TS_INPROG;
15362 spin_unlock_irq(&phba->hbalock);
15363 }
15364 return error;
15365}
15366
15367
15368
15369
15370
15371
15372
15373
15374
15375
15376
15377
15378int
15379lpfc_sli4_fcf_rr_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index)
15380{
15381 int rc = 0, error;
15382 LPFC_MBOXQ_t *mboxq;
15383
15384 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
15385 if (!mboxq) {
15386 lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_INIT,
15387 "2763 Failed to allocate mbox for "
15388 "READ_FCF cmd\n");
15389 error = -ENOMEM;
15390 goto fail_fcf_read;
15391 }
15392
15393 rc = lpfc_sli4_mbx_read_fcf_rec(phba, mboxq, fcf_index);
15394 if (rc) {
15395 error = -EINVAL;
15396 goto fail_fcf_read;
15397 }
15398
15399 mboxq->vport = phba->pport;
15400 mboxq->mbox_cmpl = lpfc_mbx_cmpl_fcf_rr_read_fcf_rec;
15401 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
15402 if (rc == MBX_NOT_FINISHED)
15403 error = -EIO;
15404 else
15405 error = 0;
15406
15407fail_fcf_read:
15408 if (error && mboxq)
15409 lpfc_sli4_mbox_cmd_free(phba, mboxq);
15410 return error;
15411}
15412
15413
15414
15415
15416
15417
15418
15419
15420
15421
15422
15423
15424int
15425lpfc_sli4_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index)
15426{
15427 int rc = 0, error;
15428 LPFC_MBOXQ_t *mboxq;
15429
15430 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
15431 if (!mboxq) {
15432 lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_INIT,
15433 "2758 Failed to allocate mbox for "
15434 "READ_FCF cmd\n");
15435 error = -ENOMEM;
15436 goto fail_fcf_read;
15437 }
15438
15439 rc = lpfc_sli4_mbx_read_fcf_rec(phba, mboxq, fcf_index);
15440 if (rc) {
15441 error = -EINVAL;
15442 goto fail_fcf_read;
15443 }
15444
15445 mboxq->vport = phba->pport;
15446 mboxq->mbox_cmpl = lpfc_mbx_cmpl_read_fcf_rec;
15447 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
15448 if (rc == MBX_NOT_FINISHED)
15449 error = -EIO;
15450 else
15451 error = 0;
15452
15453fail_fcf_read:
15454 if (error && mboxq)
15455 lpfc_sli4_mbox_cmd_free(phba, mboxq);
15456 return error;
15457}
15458
15459
15460
15461
15462
15463
15464
15465
15466
15467
15468
15469
15470
15471
15472int
15473lpfc_check_next_fcf_pri_level(struct lpfc_hba *phba)
15474{
15475 uint16_t next_fcf_pri;
15476 uint16_t last_index;
15477 struct lpfc_fcf_pri *fcf_pri;
15478 int rc;
15479 int ret = 0;
15480
15481 last_index = find_first_bit(phba->fcf.fcf_rr_bmask,
15482 LPFC_SLI4_FCF_TBL_INDX_MAX);
15483 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
15484 "3060 Last IDX %d\n", last_index);
15485 if (list_empty(&phba->fcf.fcf_pri_list)) {
15486 lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
15487 "3061 Last IDX %d\n", last_index);
15488 return 0;
15489 }
15490 next_fcf_pri = 0;
15491
15492
15493
15494
15495 memset(phba->fcf.fcf_rr_bmask, 0,
15496 sizeof(*phba->fcf.fcf_rr_bmask));
15497 spin_lock_irq(&phba->hbalock);
15498 list_for_each_entry(fcf_pri, &phba->fcf.fcf_pri_list, list) {
15499 if (fcf_pri->fcf_rec.flag & LPFC_FCF_FLOGI_FAILED)
15500 continue;
15501
15502
15503
15504
15505 if (!next_fcf_pri)
15506 next_fcf_pri = fcf_pri->fcf_rec.priority;
15507 spin_unlock_irq(&phba->hbalock);
15508 if (fcf_pri->fcf_rec.priority == next_fcf_pri) {
15509 rc = lpfc_sli4_fcf_rr_index_set(phba,
15510 fcf_pri->fcf_rec.fcf_index);
15511 if (rc)
15512 return 0;
15513 }
15514 spin_lock_irq(&phba->hbalock);
15515 }
15516
15517
15518
15519
15520
15521 if (!next_fcf_pri && !list_empty(&phba->fcf.fcf_pri_list)) {
15522 list_for_each_entry(fcf_pri, &phba->fcf.fcf_pri_list, list) {
15523 fcf_pri->fcf_rec.flag &= ~LPFC_FCF_FLOGI_FAILED;
15524
15525
15526
15527
15528 if (!next_fcf_pri)
15529 next_fcf_pri = fcf_pri->fcf_rec.priority;
15530 spin_unlock_irq(&phba->hbalock);
15531 if (fcf_pri->fcf_rec.priority == next_fcf_pri) {
15532 rc = lpfc_sli4_fcf_rr_index_set(phba,
15533 fcf_pri->fcf_rec.fcf_index);
15534 if (rc)
15535 return 0;
15536 }
15537 spin_lock_irq(&phba->hbalock);
15538 }
15539 } else
15540 ret = 1;
15541 spin_unlock_irq(&phba->hbalock);
15542
15543 return ret;
15544}
15545
15546
15547
15548
15549
15550
15551
15552
15553
15554
15555uint16_t
15556lpfc_sli4_fcf_rr_next_index_get(struct lpfc_hba *phba)
15557{
15558 uint16_t next_fcf_index;
15559
15560initial_priority:
15561
15562 next_fcf_index = phba->fcf.current_rec.fcf_indx;
15563
15564next_priority:
15565
15566 next_fcf_index = (next_fcf_index + 1) % LPFC_SLI4_FCF_TBL_INDX_MAX;
15567 next_fcf_index = find_next_bit(phba->fcf.fcf_rr_bmask,
15568 LPFC_SLI4_FCF_TBL_INDX_MAX,
15569 next_fcf_index);
15570
15571
15572 if (next_fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX) {
15573
15574
15575
15576
15577
15578 next_fcf_index = find_next_bit(phba->fcf.fcf_rr_bmask,
15579 LPFC_SLI4_FCF_TBL_INDX_MAX, 0);
15580 }
15581
15582
15583
15584 if (next_fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX ||
15585 next_fcf_index == phba->fcf.current_rec.fcf_indx) {
15586
15587
15588
15589
15590
15591
15592 if (lpfc_check_next_fcf_pri_level(phba))
15593 goto initial_priority;
15594 lpfc_printf_log(phba, KERN_WARNING, LOG_FIP,
15595 "2844 No roundrobin failover FCF available\n");
15596 if (next_fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX)
15597 return LPFC_FCOE_FCF_NEXT_NONE;
15598 else {
15599 lpfc_printf_log(phba, KERN_WARNING, LOG_FIP,
15600 "3063 Only FCF available idx %d, flag %x\n",
15601 next_fcf_index,
15602 phba->fcf.fcf_pri[next_fcf_index].fcf_rec.flag);
15603 return next_fcf_index;
15604 }
15605 }
15606
15607 if (next_fcf_index < LPFC_SLI4_FCF_TBL_INDX_MAX &&
15608 phba->fcf.fcf_pri[next_fcf_index].fcf_rec.flag &
15609 LPFC_FCF_FLOGI_FAILED)
15610 goto next_priority;
15611
15612 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
15613 "2845 Get next roundrobin failover FCF (x%x)\n",
15614 next_fcf_index);
15615
15616 return next_fcf_index;
15617}
15618
15619
15620
15621
15622
15623
15624
15625
15626
15627
15628
15629
15630
15631int
15632lpfc_sli4_fcf_rr_index_set(struct lpfc_hba *phba, uint16_t fcf_index)
15633{
15634 if (fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX) {
15635 lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
15636 "2610 FCF (x%x) reached driver's book "
15637 "keeping dimension:x%x\n",
15638 fcf_index, LPFC_SLI4_FCF_TBL_INDX_MAX);
15639 return -EINVAL;
15640 }
15641
15642 set_bit(fcf_index, phba->fcf.fcf_rr_bmask);
15643
15644 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
15645 "2790 Set FCF (x%x) to roundrobin FCF failover "
15646 "bmask\n", fcf_index);
15647
15648 return 0;
15649}
15650
15651
15652
15653
15654
15655
15656
15657
15658
15659
15660void
15661lpfc_sli4_fcf_rr_index_clear(struct lpfc_hba *phba, uint16_t fcf_index)
15662{
15663 struct lpfc_fcf_pri *fcf_pri;
15664 if (fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX) {
15665 lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
15666 "2762 FCF (x%x) reached driver's book "
15667 "keeping dimension:x%x\n",
15668 fcf_index, LPFC_SLI4_FCF_TBL_INDX_MAX);
15669 return;
15670 }
15671
15672 spin_lock_irq(&phba->hbalock);
15673 list_for_each_entry(fcf_pri, &phba->fcf.fcf_pri_list, list) {
15674 if (fcf_pri->fcf_rec.fcf_index == fcf_index) {
15675 list_del_init(&fcf_pri->list);
15676 break;
15677 }
15678 }
15679 spin_unlock_irq(&phba->hbalock);
15680 clear_bit(fcf_index, phba->fcf.fcf_rr_bmask);
15681
15682 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
15683 "2791 Clear FCF (x%x) from roundrobin failover "
15684 "bmask\n", fcf_index);
15685}
15686
15687
15688
15689
15690
15691
15692
15693
15694
15695void
15696lpfc_mbx_cmpl_redisc_fcf_table(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox)
15697{
15698 struct lpfc_mbx_redisc_fcf_tbl *redisc_fcf;
15699 uint32_t shdr_status, shdr_add_status;
15700
15701 redisc_fcf = &mbox->u.mqe.un.redisc_fcf_tbl;
15702
15703 shdr_status = bf_get(lpfc_mbox_hdr_status,
15704 &redisc_fcf->header.cfg_shdr.response);
15705 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status,
15706 &redisc_fcf->header.cfg_shdr.response);
15707 if (shdr_status || shdr_add_status) {
15708 lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
15709 "2746 Requesting for FCF rediscovery failed "
15710 "status x%x add_status x%x\n",
15711 shdr_status, shdr_add_status);
15712 if (phba->fcf.fcf_flag & FCF_ACVL_DISC) {
15713 spin_lock_irq(&phba->hbalock);
15714 phba->fcf.fcf_flag &= ~FCF_ACVL_DISC;
15715 spin_unlock_irq(&phba->hbalock);
15716
15717
15718
15719
15720 lpfc_retry_pport_discovery(phba);
15721 } else {
15722 spin_lock_irq(&phba->hbalock);
15723 phba->fcf.fcf_flag &= ~FCF_DEAD_DISC;
15724 spin_unlock_irq(&phba->hbalock);
15725
15726
15727
15728
15729
15730 lpfc_sli4_fcf_dead_failthrough(phba);
15731 }
15732 } else {
15733 lpfc_printf_log(phba, KERN_INFO, LOG_FIP,
15734 "2775 Start FCF rediscover quiescent timer\n");
15735
15736
15737
15738
15739 lpfc_fcf_redisc_wait_start_timer(phba);
15740 }
15741
15742 mempool_free(mbox, phba->mbox_mem_pool);
15743}
15744
15745
15746
15747
15748
15749
15750
15751
15752int
15753lpfc_sli4_redisc_fcf_table(struct lpfc_hba *phba)
15754{
15755 LPFC_MBOXQ_t *mbox;
15756 struct lpfc_mbx_redisc_fcf_tbl *redisc_fcf;
15757 int rc, length;
15758
15759
15760 lpfc_cancel_all_vport_retry_delay_timer(phba);
15761
15762 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
15763 if (!mbox) {
15764 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
15765 "2745 Failed to allocate mbox for "
15766 "requesting FCF rediscover.\n");
15767 return -ENOMEM;
15768 }
15769
15770 length = (sizeof(struct lpfc_mbx_redisc_fcf_tbl) -
15771 sizeof(struct lpfc_sli4_cfg_mhdr));
15772 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE,
15773 LPFC_MBOX_OPCODE_FCOE_REDISCOVER_FCF,
15774 length, LPFC_SLI4_MBX_EMBED);
15775
15776 redisc_fcf = &mbox->u.mqe.un.redisc_fcf_tbl;
15777
15778 bf_set(lpfc_mbx_redisc_fcf_count, redisc_fcf, 0);
15779
15780
15781 mbox->vport = phba->pport;
15782 mbox->mbox_cmpl = lpfc_mbx_cmpl_redisc_fcf_table;
15783 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
15784
15785 if (rc == MBX_NOT_FINISHED) {
15786 mempool_free(mbox, phba->mbox_mem_pool);
15787 return -EIO;
15788 }
15789 return 0;
15790}
15791
15792
15793
15794
15795
15796
15797
15798
15799void
15800lpfc_sli4_fcf_dead_failthrough(struct lpfc_hba *phba)
15801{
15802 uint32_t link_state;
15803
15804
15805
15806
15807
15808
15809 link_state = phba->link_state;
15810 lpfc_linkdown(phba);
15811 phba->link_state = link_state;
15812
15813
15814 lpfc_unregister_unused_fcf(phba);
15815}
15816
15817
15818
15819
15820
15821
15822
15823
15824
15825
15826static uint32_t
15827lpfc_sli_get_config_region23(struct lpfc_hba *phba, char *rgn23_data)
15828{
15829 LPFC_MBOXQ_t *pmb = NULL;
15830 MAILBOX_t *mb;
15831 uint32_t offset = 0;
15832 int rc;
15833
15834 if (!rgn23_data)
15835 return 0;
15836
15837 pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
15838 if (!pmb) {
15839 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
15840 "2600 failed to allocate mailbox memory\n");
15841 return 0;
15842 }
15843 mb = &pmb->u.mb;
15844
15845 do {
15846 lpfc_dump_mem(phba, pmb, offset, DMP_REGION_23);
15847 rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL);
15848
15849 if (rc != MBX_SUCCESS) {
15850 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
15851 "2601 failed to read config "
15852 "region 23, rc 0x%x Status 0x%x\n",
15853 rc, mb->mbxStatus);
15854 mb->un.varDmp.word_cnt = 0;
15855 }
15856
15857
15858
15859
15860 if (mb->un.varDmp.word_cnt == 0)
15861 break;
15862 if (mb->un.varDmp.word_cnt > DMP_RGN23_SIZE - offset)
15863 mb->un.varDmp.word_cnt = DMP_RGN23_SIZE - offset;
15864
15865 lpfc_sli_pcimem_bcopy(((uint8_t *)mb) + DMP_RSP_OFFSET,
15866 rgn23_data + offset,
15867 mb->un.varDmp.word_cnt);
15868 offset += mb->un.varDmp.word_cnt;
15869 } while (mb->un.varDmp.word_cnt && offset < DMP_RGN23_SIZE);
15870
15871 mempool_free(pmb, phba->mbox_mem_pool);
15872 return offset;
15873}
15874
15875
15876
15877
15878
15879
15880
15881
15882
15883
15884static uint32_t
15885lpfc_sli4_get_config_region23(struct lpfc_hba *phba, char *rgn23_data)
15886{
15887 LPFC_MBOXQ_t *mboxq = NULL;
15888 struct lpfc_dmabuf *mp = NULL;
15889 struct lpfc_mqe *mqe;
15890 uint32_t data_length = 0;
15891 int rc;
15892
15893 if (!rgn23_data)
15894 return 0;
15895
15896 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
15897 if (!mboxq) {
15898 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
15899 "3105 failed to allocate mailbox memory\n");
15900 return 0;
15901 }
15902
15903 if (lpfc_sli4_dump_cfg_rg23(phba, mboxq))
15904 goto out;
15905 mqe = &mboxq->u.mqe;
15906 mp = (struct lpfc_dmabuf *) mboxq->context1;
15907 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
15908 if (rc)
15909 goto out;
15910 data_length = mqe->un.mb_words[5];
15911 if (data_length == 0)
15912 goto out;
15913 if (data_length > DMP_RGN23_SIZE) {
15914 data_length = 0;
15915 goto out;
15916 }
15917 lpfc_sli_pcimem_bcopy((char *)mp->virt, rgn23_data, data_length);
15918out:
15919 mempool_free(mboxq, phba->mbox_mem_pool);
15920 if (mp) {
15921 lpfc_mbuf_free(phba, mp->virt, mp->phys);
15922 kfree(mp);
15923 }
15924 return data_length;
15925}
15926
15927
15928
15929
15930
15931
15932
15933
15934
15935void
15936lpfc_sli_read_link_ste(struct lpfc_hba *phba)
15937{
15938 uint8_t *rgn23_data = NULL;
15939 uint32_t if_type, data_size, sub_tlv_len, tlv_offset;
15940 uint32_t offset = 0;
15941
15942
15943 rgn23_data = kzalloc(DMP_RGN23_SIZE, GFP_KERNEL);
15944 if (!rgn23_data)
15945 goto out;
15946
15947 if (phba->sli_rev < LPFC_SLI_REV4)
15948 data_size = lpfc_sli_get_config_region23(phba, rgn23_data);
15949 else {
15950 if_type = bf_get(lpfc_sli_intf_if_type,
15951 &phba->sli4_hba.sli_intf);
15952 if (if_type == LPFC_SLI_INTF_IF_TYPE_0)
15953 goto out;
15954 data_size = lpfc_sli4_get_config_region23(phba, rgn23_data);
15955 }
15956
15957 if (!data_size)
15958 goto out;
15959
15960
15961 if (memcmp(&rgn23_data[offset], LPFC_REGION23_SIGNATURE, 4)) {
15962 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
15963 "2619 Config region 23 has bad signature\n");
15964 goto out;
15965 }
15966 offset += 4;
15967
15968
15969 if (rgn23_data[offset] != LPFC_REGION23_VERSION) {
15970 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
15971 "2620 Config region 23 has bad version\n");
15972 goto out;
15973 }
15974 offset += 4;
15975
15976
15977 while (offset < data_size) {
15978 if (rgn23_data[offset] == LPFC_REGION23_LAST_REC)
15979 break;
15980
15981
15982
15983
15984 if ((rgn23_data[offset] != DRIVER_SPECIFIC_TYPE) ||
15985 (rgn23_data[offset + 2] != LINUX_DRIVER_ID) ||
15986 (rgn23_data[offset + 3] != 0)) {
15987 offset += rgn23_data[offset + 1] * 4 + 4;
15988 continue;
15989 }
15990
15991
15992 sub_tlv_len = rgn23_data[offset + 1] * 4;
15993 offset += 4;
15994 tlv_offset = 0;
15995
15996
15997
15998
15999 while ((offset < data_size) &&
16000 (tlv_offset < sub_tlv_len)) {
16001 if (rgn23_data[offset] == LPFC_REGION23_LAST_REC) {
16002 offset += 4;
16003 tlv_offset += 4;
16004 break;
16005 }
16006 if (rgn23_data[offset] != PORT_STE_TYPE) {
16007 offset += rgn23_data[offset + 1] * 4 + 4;
16008 tlv_offset += rgn23_data[offset + 1] * 4 + 4;
16009 continue;
16010 }
16011
16012
16013 if (!rgn23_data[offset + 2])
16014 phba->hba_flag |= LINK_DISABLED;
16015
16016 goto out;
16017 }
16018 }
16019
16020out:
16021 kfree(rgn23_data);
16022 return;
16023}
16024
16025
16026
16027
16028
16029
16030
16031
16032
16033
16034
16035
16036
16037
16038
16039
16040
16041
16042
16043
16044int
16045lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list,
16046 uint32_t size, uint32_t *offset)
16047{
16048 struct lpfc_mbx_wr_object *wr_object;
16049 LPFC_MBOXQ_t *mbox;
16050 int rc = 0, i = 0;
16051 uint32_t shdr_status, shdr_add_status;
16052 uint32_t mbox_tmo;
16053 union lpfc_sli4_cfg_shdr *shdr;
16054 struct lpfc_dmabuf *dmabuf;
16055 uint32_t written = 0;
16056
16057 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
16058 if (!mbox)
16059 return -ENOMEM;
16060
16061 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
16062 LPFC_MBOX_OPCODE_WRITE_OBJECT,
16063 sizeof(struct lpfc_mbx_wr_object) -
16064 sizeof(struct lpfc_sli4_cfg_mhdr), LPFC_SLI4_MBX_EMBED);
16065
16066 wr_object = (struct lpfc_mbx_wr_object *)&mbox->u.mqe.un.wr_object;
16067 wr_object->u.request.write_offset = *offset;
16068 sprintf((uint8_t *)wr_object->u.request.object_name, "/");
16069 wr_object->u.request.object_name[0] =
16070 cpu_to_le32(wr_object->u.request.object_name[0]);
16071 bf_set(lpfc_wr_object_eof, &wr_object->u.request, 0);
16072 list_for_each_entry(dmabuf, dmabuf_list, list) {
16073 if (i >= LPFC_MBX_WR_CONFIG_MAX_BDE || written >= size)
16074 break;
16075 wr_object->u.request.bde[i].addrLow = putPaddrLow(dmabuf->phys);
16076 wr_object->u.request.bde[i].addrHigh =
16077 putPaddrHigh(dmabuf->phys);
16078 if (written + SLI4_PAGE_SIZE >= size) {
16079 wr_object->u.request.bde[i].tus.f.bdeSize =
16080 (size - written);
16081 written += (size - written);
16082 bf_set(lpfc_wr_object_eof, &wr_object->u.request, 1);
16083 } else {
16084 wr_object->u.request.bde[i].tus.f.bdeSize =
16085 SLI4_PAGE_SIZE;
16086 written += SLI4_PAGE_SIZE;
16087 }
16088 i++;
16089 }
16090 wr_object->u.request.bde_count = i;
16091 bf_set(lpfc_wr_object_write_length, &wr_object->u.request, written);
16092 if (!phba->sli4_hba.intr_enable)
16093 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
16094 else {
16095 mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
16096 rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
16097 }
16098
16099 shdr = (union lpfc_sli4_cfg_shdr *) &wr_object->header.cfg_shdr;
16100 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
16101 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
16102 if (rc != MBX_TIMEOUT)
16103 mempool_free(mbox, phba->mbox_mem_pool);
16104 if (shdr_status || shdr_add_status || rc) {
16105 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
16106 "3025 Write Object mailbox failed with "
16107 "status x%x add_status x%x, mbx status x%x\n",
16108 shdr_status, shdr_add_status, rc);
16109 rc = -ENXIO;
16110 } else
16111 *offset += wr_object->u.response.actual_write_length;
16112 return rc;
16113}
16114
16115
16116
16117
16118
16119
16120
16121
16122
16123
16124void
16125lpfc_cleanup_pending_mbox(struct lpfc_vport *vport)
16126{
16127 struct lpfc_hba *phba = vport->phba;
16128 LPFC_MBOXQ_t *mb, *nextmb;
16129 struct lpfc_dmabuf *mp;
16130 struct lpfc_nodelist *ndlp;
16131 struct lpfc_nodelist *act_mbx_ndlp = NULL;
16132 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
16133 LIST_HEAD(mbox_cmd_list);
16134 uint8_t restart_loop;
16135
16136
16137 spin_lock_irq(&phba->hbalock);
16138 list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) {
16139 if (mb->vport != vport)
16140 continue;
16141
16142 if ((mb->u.mb.mbxCommand != MBX_REG_LOGIN64) &&
16143 (mb->u.mb.mbxCommand != MBX_REG_VPI))
16144 continue;
16145
16146 list_del(&mb->list);
16147 list_add_tail(&mb->list, &mbox_cmd_list);
16148 }
16149
16150 mb = phba->sli.mbox_active;
16151 if (mb && (mb->vport == vport)) {
16152 if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) ||
16153 (mb->u.mb.mbxCommand == MBX_REG_VPI))
16154 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
16155 if (mb->u.mb.mbxCommand == MBX_REG_LOGIN64) {
16156 act_mbx_ndlp = (struct lpfc_nodelist *)mb->context2;
16157
16158 act_mbx_ndlp = lpfc_nlp_get(act_mbx_ndlp);
16159
16160 mb->mbox_flag |= LPFC_MBX_IMED_UNREG;
16161 }
16162 }
16163
16164 do {
16165 restart_loop = 0;
16166 list_for_each_entry(mb, &phba->sli.mboxq_cmpl, list) {
16167
16168
16169
16170
16171 if ((mb->vport != vport) ||
16172 (mb->mbox_flag & LPFC_MBX_IMED_UNREG))
16173 continue;
16174
16175 if ((mb->u.mb.mbxCommand != MBX_REG_LOGIN64) &&
16176 (mb->u.mb.mbxCommand != MBX_REG_VPI))
16177 continue;
16178
16179 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
16180 if (mb->u.mb.mbxCommand == MBX_REG_LOGIN64) {
16181 ndlp = (struct lpfc_nodelist *)mb->context2;
16182
16183 mb->mbox_flag |= LPFC_MBX_IMED_UNREG;
16184 restart_loop = 1;
16185 spin_unlock_irq(&phba->hbalock);
16186 spin_lock(shost->host_lock);
16187 ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL;
16188 spin_unlock(shost->host_lock);
16189 spin_lock_irq(&phba->hbalock);
16190 break;
16191 }
16192 }
16193 } while (restart_loop);
16194
16195 spin_unlock_irq(&phba->hbalock);
16196
16197
16198 while (!list_empty(&mbox_cmd_list)) {
16199 list_remove_head(&mbox_cmd_list, mb, LPFC_MBOXQ_t, list);
16200 if (mb->u.mb.mbxCommand == MBX_REG_LOGIN64) {
16201 mp = (struct lpfc_dmabuf *) (mb->context1);
16202 if (mp) {
16203 __lpfc_mbuf_free(phba, mp->virt, mp->phys);
16204 kfree(mp);
16205 }
16206 ndlp = (struct lpfc_nodelist *) mb->context2;
16207 mb->context2 = NULL;
16208 if (ndlp) {
16209 spin_lock(shost->host_lock);
16210 ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL;
16211 spin_unlock(shost->host_lock);
16212 lpfc_nlp_put(ndlp);
16213 }
16214 }
16215 mempool_free(mb, phba->mbox_mem_pool);
16216 }
16217
16218
16219 if (act_mbx_ndlp) {
16220 spin_lock(shost->host_lock);
16221 act_mbx_ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL;
16222 spin_unlock(shost->host_lock);
16223 lpfc_nlp_put(act_mbx_ndlp);
16224 }
16225}
16226
16227
16228
16229
16230
16231
16232
16233
16234
16235
16236
16237
16238uint32_t
16239lpfc_drain_txq(struct lpfc_hba *phba)
16240{
16241 LIST_HEAD(completions);
16242 struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
16243 struct lpfc_iocbq *piocbq = 0;
16244 unsigned long iflags = 0;
16245 char *fail_msg = NULL;
16246 struct lpfc_sglq *sglq;
16247 union lpfc_wqe wqe;
16248
16249 spin_lock_irqsave(&phba->hbalock, iflags);
16250 if (pring->txq_cnt > pring->txq_max)
16251 pring->txq_max = pring->txq_cnt;
16252
16253 spin_unlock_irqrestore(&phba->hbalock, iflags);
16254
16255 while (pring->txq_cnt) {
16256 spin_lock_irqsave(&phba->hbalock, iflags);
16257
16258 piocbq = lpfc_sli_ringtx_get(phba, pring);
16259 if (!piocbq) {
16260 spin_unlock_irqrestore(&phba->hbalock, iflags);
16261 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
16262 "2823 txq empty and txq_cnt is %d\n ",
16263 pring->txq_cnt);
16264 break;
16265 }
16266 sglq = __lpfc_sli_get_sglq(phba, piocbq);
16267 if (!sglq) {
16268 __lpfc_sli_ringtx_put(phba, pring, piocbq);
16269 spin_unlock_irqrestore(&phba->hbalock, iflags);
16270 break;
16271 }
16272
16273
16274
16275
16276 piocbq->sli4_lxritag = sglq->sli4_lxritag;
16277 piocbq->sli4_xritag = sglq->sli4_xritag;
16278 if (NO_XRI == lpfc_sli4_bpl2sgl(phba, piocbq, sglq))
16279 fail_msg = "to convert bpl to sgl";
16280 else if (lpfc_sli4_iocb2wqe(phba, piocbq, &wqe))
16281 fail_msg = "to convert iocb to wqe";
16282 else if (lpfc_sli4_wq_put(phba->sli4_hba.els_wq, &wqe))
16283 fail_msg = " - Wq is full";
16284 else
16285 lpfc_sli_ringtxcmpl_put(phba, pring, piocbq);
16286
16287 if (fail_msg) {
16288
16289 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
16290 "2822 IOCB failed %s iotag 0x%x "
16291 "xri 0x%x\n",
16292 fail_msg,
16293 piocbq->iotag, piocbq->sli4_xritag);
16294 list_add_tail(&piocbq->list, &completions);
16295 }
16296 spin_unlock_irqrestore(&phba->hbalock, iflags);
16297 }
16298
16299
16300 lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
16301 IOERR_SLI_ABORTED);
16302
16303 return pring->txq_cnt;
16304}
16305