Merge tag 'mfd-next-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd
[linux-2.6-microblaze.git] / drivers / scsi / lpfc / lpfc_bsg.c
1 /*******************************************************************
2  * This file is part of the Emulex Linux Device Driver for         *
3  * Fibre Channel Host Bus Adapters.                                *
4  * Copyright (C) 2017-2020 Broadcom. All Rights Reserved. The term *
5  * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.     *
6  * Copyright (C) 2009-2015 Emulex.  All rights reserved.           *
7  * EMULEX and SLI are trademarks of Emulex.                        *
8  * www.broadcom.com                                                *
9  *                                                                 *
10  * This program is free software; you can redistribute it and/or   *
11  * modify it under the terms of version 2 of the GNU General       *
12  * Public License as published by the Free Software Foundation.    *
13  * This program is distributed in the hope that it will be useful. *
14  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
15  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
16  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
17  * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
18  * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
19  * more details, a copy of which can be found in the file COPYING  *
20  * included with this package.                                     *
21  *******************************************************************/
22
23 #include <linux/interrupt.h>
24 #include <linux/mempool.h>
25 #include <linux/pci.h>
26 #include <linux/slab.h>
27 #include <linux/delay.h>
28 #include <linux/list.h>
29 #include <linux/bsg-lib.h>
30 #include <linux/vmalloc.h>
31
32 #include <scsi/scsi.h>
33 #include <scsi/scsi_host.h>
34 #include <scsi/scsi_transport_fc.h>
35 #include <scsi/scsi_bsg_fc.h>
36 #include <scsi/fc/fc_fs.h>
37
38 #include "lpfc_hw4.h"
39 #include "lpfc_hw.h"
40 #include "lpfc_sli.h"
41 #include "lpfc_sli4.h"
42 #include "lpfc_nl.h"
43 #include "lpfc_bsg.h"
44 #include "lpfc_disc.h"
45 #include "lpfc_scsi.h"
46 #include "lpfc.h"
47 #include "lpfc_logmsg.h"
48 #include "lpfc_crtn.h"
49 #include "lpfc_debugfs.h"
50 #include "lpfc_vport.h"
51 #include "lpfc_version.h"
52
53 struct lpfc_bsg_event {
54         struct list_head node;
55         struct kref kref;
56         wait_queue_head_t wq;
57
58         /* Event type and waiter identifiers */
59         uint32_t type_mask;
60         uint32_t req_id;
61         uint32_t reg_id;
62
63         /* next two flags are here for the auto-delete logic */
64         unsigned long wait_time_stamp;
65         int waiting;
66
67         /* seen and not seen events */
68         struct list_head events_to_get;
69         struct list_head events_to_see;
70
71         /* driver data associated with the job */
72         void *dd_data;
73 };
74
75 struct lpfc_bsg_iocb {
76         struct lpfc_iocbq *cmdiocbq;
77         struct lpfc_dmabuf *rmp;
78         struct lpfc_nodelist *ndlp;
79 };
80
81 struct lpfc_bsg_mbox {
82         LPFC_MBOXQ_t *pmboxq;
83         MAILBOX_t *mb;
84         struct lpfc_dmabuf *dmabuffers; /* for BIU diags */
85         uint8_t *ext; /* extended mailbox data */
86         uint32_t mbOffset; /* from app */
87         uint32_t inExtWLen; /* from app */
88         uint32_t outExtWLen; /* from app */
89 };
90
91 #define MENLO_DID 0x0000FC0E
92
93 struct lpfc_bsg_menlo {
94         struct lpfc_iocbq *cmdiocbq;
95         struct lpfc_dmabuf *rmp;
96 };
97
98 #define TYPE_EVT        1
99 #define TYPE_IOCB       2
100 #define TYPE_MBOX       3
101 #define TYPE_MENLO      4
102 struct bsg_job_data {
103         uint32_t type;
104         struct bsg_job *set_job; /* job waiting for this iocb to finish */
105         union {
106                 struct lpfc_bsg_event *evt;
107                 struct lpfc_bsg_iocb iocb;
108                 struct lpfc_bsg_mbox mbox;
109                 struct lpfc_bsg_menlo menlo;
110         } context_un;
111 };
112
113 struct event_data {
114         struct list_head node;
115         uint32_t type;
116         uint32_t immed_dat;
117         void *data;
118         uint32_t len;
119 };
120
121 #define BUF_SZ_4K 4096
122 #define SLI_CT_ELX_LOOPBACK 0x10
123
124 enum ELX_LOOPBACK_CMD {
125         ELX_LOOPBACK_XRI_SETUP,
126         ELX_LOOPBACK_DATA,
127 };
128
129 #define ELX_LOOPBACK_HEADER_SZ \
130         (size_t)(&((struct lpfc_sli_ct_request *)NULL)->un)
131
132 struct lpfc_dmabufext {
133         struct lpfc_dmabuf dma;
134         uint32_t size;
135         uint32_t flag;
136 };
137
138 static void
139 lpfc_free_bsg_buffers(struct lpfc_hba *phba, struct lpfc_dmabuf *mlist)
140 {
141         struct lpfc_dmabuf *mlast, *next_mlast;
142
143         if (mlist) {
144                 list_for_each_entry_safe(mlast, next_mlast, &mlist->list,
145                                          list) {
146                         lpfc_mbuf_free(phba, mlast->virt, mlast->phys);
147                         list_del(&mlast->list);
148                         kfree(mlast);
149                 }
150                 lpfc_mbuf_free(phba, mlist->virt, mlist->phys);
151                 kfree(mlist);
152         }
153         return;
154 }
155
156 static struct lpfc_dmabuf *
157 lpfc_alloc_bsg_buffers(struct lpfc_hba *phba, unsigned int size,
158                        int outbound_buffers, struct ulp_bde64 *bpl,
159                        int *bpl_entries)
160 {
161         struct lpfc_dmabuf *mlist = NULL;
162         struct lpfc_dmabuf *mp;
163         unsigned int bytes_left = size;
164
165         /* Verify we can support the size specified */
166         if (!size || (size > (*bpl_entries * LPFC_BPL_SIZE)))
167                 return NULL;
168
169         /* Determine the number of dma buffers to allocate */
170         *bpl_entries = (size % LPFC_BPL_SIZE ? size/LPFC_BPL_SIZE + 1 :
171                         size/LPFC_BPL_SIZE);
172
173         /* Allocate dma buffer and place in BPL passed */
174         while (bytes_left) {
175                 /* Allocate dma buffer  */
176                 mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
177                 if (!mp) {
178                         if (mlist)
179                                 lpfc_free_bsg_buffers(phba, mlist);
180                         return NULL;
181                 }
182
183                 INIT_LIST_HEAD(&mp->list);
184                 mp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(mp->phys));
185
186                 if (!mp->virt) {
187                         kfree(mp);
188                         if (mlist)
189                                 lpfc_free_bsg_buffers(phba, mlist);
190                         return NULL;
191                 }
192
193                 /* Queue it to a linked list */
194                 if (!mlist)
195                         mlist = mp;
196                 else
197                         list_add_tail(&mp->list, &mlist->list);
198
199                 /* Add buffer to buffer pointer list */
200                 if (outbound_buffers)
201                         bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
202                 else
203                         bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I;
204                 bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys));
205                 bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys));
206                 bpl->tus.f.bdeSize = (uint16_t)
207                         (bytes_left >= LPFC_BPL_SIZE ? LPFC_BPL_SIZE :
208                          bytes_left);
209                 bytes_left -= bpl->tus.f.bdeSize;
210                 bpl->tus.w = le32_to_cpu(bpl->tus.w);
211                 bpl++;
212         }
213         return mlist;
214 }
215
216 static unsigned int
217 lpfc_bsg_copy_data(struct lpfc_dmabuf *dma_buffers,
218                    struct bsg_buffer *bsg_buffers,
219                    unsigned int bytes_to_transfer, int to_buffers)
220 {
221
222         struct lpfc_dmabuf *mp;
223         unsigned int transfer_bytes, bytes_copied = 0;
224         unsigned int sg_offset, dma_offset;
225         unsigned char *dma_address, *sg_address;
226         LIST_HEAD(temp_list);
227         struct sg_mapping_iter miter;
228         unsigned long flags;
229         unsigned int sg_flags = SG_MITER_ATOMIC;
230         bool sg_valid;
231
232         list_splice_init(&dma_buffers->list, &temp_list);
233         list_add(&dma_buffers->list, &temp_list);
234         sg_offset = 0;
235         if (to_buffers)
236                 sg_flags |= SG_MITER_FROM_SG;
237         else
238                 sg_flags |= SG_MITER_TO_SG;
239         sg_miter_start(&miter, bsg_buffers->sg_list, bsg_buffers->sg_cnt,
240                        sg_flags);
241         local_irq_save(flags);
242         sg_valid = sg_miter_next(&miter);
243         list_for_each_entry(mp, &temp_list, list) {
244                 dma_offset = 0;
245                 while (bytes_to_transfer && sg_valid &&
246                        (dma_offset < LPFC_BPL_SIZE)) {
247                         dma_address = mp->virt + dma_offset;
248                         if (sg_offset) {
249                                 /* Continue previous partial transfer of sg */
250                                 sg_address = miter.addr + sg_offset;
251                                 transfer_bytes = miter.length - sg_offset;
252                         } else {
253                                 sg_address = miter.addr;
254                                 transfer_bytes = miter.length;
255                         }
256                         if (bytes_to_transfer < transfer_bytes)
257                                 transfer_bytes = bytes_to_transfer;
258                         if (transfer_bytes > (LPFC_BPL_SIZE - dma_offset))
259                                 transfer_bytes = LPFC_BPL_SIZE - dma_offset;
260                         if (to_buffers)
261                                 memcpy(dma_address, sg_address, transfer_bytes);
262                         else
263                                 memcpy(sg_address, dma_address, transfer_bytes);
264                         dma_offset += transfer_bytes;
265                         sg_offset += transfer_bytes;
266                         bytes_to_transfer -= transfer_bytes;
267                         bytes_copied += transfer_bytes;
268                         if (sg_offset >= miter.length) {
269                                 sg_offset = 0;
270                                 sg_valid = sg_miter_next(&miter);
271                         }
272                 }
273         }
274         sg_miter_stop(&miter);
275         local_irq_restore(flags);
276         list_del_init(&dma_buffers->list);
277         list_splice(&temp_list, &dma_buffers->list);
278         return bytes_copied;
279 }
280
281 /**
282  * lpfc_bsg_send_mgmt_cmd_cmp - lpfc_bsg_send_mgmt_cmd's completion handler
283  * @phba: Pointer to HBA context object.
284  * @cmdiocbq: Pointer to command iocb.
285  * @rspiocbq: Pointer to response iocb.
286  *
287  * This function is the completion handler for iocbs issued using
288  * lpfc_bsg_send_mgmt_cmd function. This function is called by the
289  * ring event handler function without any lock held. This function
290  * can be called from both worker thread context and interrupt
291  * context. This function also can be called from another thread which
292  * cleans up the SLI layer objects.
293  * This function copies the contents of the response iocb to the
294  * response iocb memory object provided by the caller of
295  * lpfc_sli_issue_iocb_wait and then wakes up the thread which
296  * sleeps for the iocb completion.
297  **/
298 static void
299 lpfc_bsg_send_mgmt_cmd_cmp(struct lpfc_hba *phba,
300                         struct lpfc_iocbq *cmdiocbq,
301                         struct lpfc_iocbq *rspiocbq)
302 {
303         struct bsg_job_data *dd_data;
304         struct bsg_job *job;
305         struct fc_bsg_reply *bsg_reply;
306         IOCB_t *rsp;
307         struct lpfc_dmabuf *bmp, *cmp, *rmp;
308         struct lpfc_nodelist *ndlp;
309         struct lpfc_bsg_iocb *iocb;
310         unsigned long flags;
311         unsigned int rsp_size;
312         int rc = 0;
313
314         dd_data = cmdiocbq->context1;
315
316         /* Determine if job has been aborted */
317         spin_lock_irqsave(&phba->ct_ev_lock, flags);
318         job = dd_data->set_job;
319         if (job) {
320                 bsg_reply = job->reply;
321                 /* Prevent timeout handling from trying to abort job */
322                 job->dd_data = NULL;
323         }
324         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
325
326         /* Close the timeout handler abort window */
327         spin_lock_irqsave(&phba->hbalock, flags);
328         cmdiocbq->iocb_flag &= ~LPFC_IO_CMD_OUTSTANDING;
329         spin_unlock_irqrestore(&phba->hbalock, flags);
330
331         iocb = &dd_data->context_un.iocb;
332         ndlp = iocb->cmdiocbq->context_un.ndlp;
333         rmp = iocb->rmp;
334         cmp = cmdiocbq->context2;
335         bmp = cmdiocbq->context3;
336         rsp = &rspiocbq->iocb;
337
338         /* Copy the completed data or set the error status */
339
340         if (job) {
341                 if (rsp->ulpStatus) {
342                         if (rsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
343                                 switch (rsp->un.ulpWord[4] & IOERR_PARAM_MASK) {
344                                 case IOERR_SEQUENCE_TIMEOUT:
345                                         rc = -ETIMEDOUT;
346                                         break;
347                                 case IOERR_INVALID_RPI:
348                                         rc = -EFAULT;
349                                         break;
350                                 default:
351                                         rc = -EACCES;
352                                         break;
353                                 }
354                         } else {
355                                 rc = -EACCES;
356                         }
357                 } else {
358                         rsp_size = rsp->un.genreq64.bdl.bdeSize;
359                         bsg_reply->reply_payload_rcv_len =
360                                 lpfc_bsg_copy_data(rmp, &job->reply_payload,
361                                                    rsp_size, 0);
362                 }
363         }
364
365         lpfc_free_bsg_buffers(phba, cmp);
366         lpfc_free_bsg_buffers(phba, rmp);
367         lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
368         kfree(bmp);
369         lpfc_nlp_put(ndlp);
370         lpfc_sli_release_iocbq(phba, cmdiocbq);
371         kfree(dd_data);
372
373         /* Complete the job if the job is still active */
374
375         if (job) {
376                 bsg_reply->result = rc;
377                 bsg_job_done(job, bsg_reply->result,
378                                bsg_reply->reply_payload_rcv_len);
379         }
380         return;
381 }
382
383 /**
384  * lpfc_bsg_send_mgmt_cmd - send a CT command from a bsg request
385  * @job: fc_bsg_job to handle
386  **/
387 static int
388 lpfc_bsg_send_mgmt_cmd(struct bsg_job *job)
389 {
390         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
391         struct lpfc_hba *phba = vport->phba;
392         struct lpfc_rport_data *rdata = fc_bsg_to_rport(job)->dd_data;
393         struct lpfc_nodelist *ndlp = rdata->pnode;
394         struct fc_bsg_reply *bsg_reply = job->reply;
395         struct ulp_bde64 *bpl = NULL;
396         uint32_t timeout;
397         struct lpfc_iocbq *cmdiocbq = NULL;
398         IOCB_t *cmd;
399         struct lpfc_dmabuf *bmp = NULL, *cmp = NULL, *rmp = NULL;
400         int request_nseg;
401         int reply_nseg;
402         struct bsg_job_data *dd_data;
403         unsigned long flags;
404         uint32_t creg_val;
405         int rc = 0;
406         int iocb_stat;
407
408         /* in case no data is transferred */
409         bsg_reply->reply_payload_rcv_len = 0;
410
411         if (ndlp->nlp_flag & NLP_ELS_SND_MASK)
412                 return -ENODEV;
413
414         /* allocate our bsg tracking structure */
415         dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
416         if (!dd_data) {
417                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
418                                 "2733 Failed allocation of dd_data\n");
419                 rc = -ENOMEM;
420                 goto no_dd_data;
421         }
422
423         cmdiocbq = lpfc_sli_get_iocbq(phba);
424         if (!cmdiocbq) {
425                 rc = -ENOMEM;
426                 goto free_dd;
427         }
428
429         cmd = &cmdiocbq->iocb;
430
431         bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
432         if (!bmp) {
433                 rc = -ENOMEM;
434                 goto free_cmdiocbq;
435         }
436         bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys);
437         if (!bmp->virt) {
438                 rc = -ENOMEM;
439                 goto free_bmp;
440         }
441
442         INIT_LIST_HEAD(&bmp->list);
443
444         bpl = (struct ulp_bde64 *) bmp->virt;
445         request_nseg = LPFC_BPL_SIZE/sizeof(struct ulp_bde64);
446         cmp = lpfc_alloc_bsg_buffers(phba, job->request_payload.payload_len,
447                                      1, bpl, &request_nseg);
448         if (!cmp) {
449                 rc = -ENOMEM;
450                 goto free_bmp;
451         }
452         lpfc_bsg_copy_data(cmp, &job->request_payload,
453                            job->request_payload.payload_len, 1);
454
455         bpl += request_nseg;
456         reply_nseg = LPFC_BPL_SIZE/sizeof(struct ulp_bde64) - request_nseg;
457         rmp = lpfc_alloc_bsg_buffers(phba, job->reply_payload.payload_len, 0,
458                                      bpl, &reply_nseg);
459         if (!rmp) {
460                 rc = -ENOMEM;
461                 goto free_cmp;
462         }
463
464         cmd->un.genreq64.bdl.ulpIoTag32 = 0;
465         cmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys);
466         cmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys);
467         cmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
468         cmd->un.genreq64.bdl.bdeSize =
469                 (request_nseg + reply_nseg) * sizeof(struct ulp_bde64);
470         cmd->ulpCommand = CMD_GEN_REQUEST64_CR;
471         cmd->un.genreq64.w5.hcsw.Fctl = (SI | LA);
472         cmd->un.genreq64.w5.hcsw.Dfctl = 0;
473         cmd->un.genreq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL;
474         cmd->un.genreq64.w5.hcsw.Type = FC_TYPE_CT;
475         cmd->ulpBdeCount = 1;
476         cmd->ulpLe = 1;
477         cmd->ulpClass = CLASS3;
478         cmd->ulpContext = ndlp->nlp_rpi;
479         if (phba->sli_rev == LPFC_SLI_REV4)
480                 cmd->ulpContext = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
481         cmd->ulpOwner = OWN_CHIP;
482         cmdiocbq->vport = phba->pport;
483         cmdiocbq->context3 = bmp;
484         cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
485         timeout = phba->fc_ratov * 2;
486         cmd->ulpTimeout = timeout;
487
488         cmdiocbq->iocb_cmpl = lpfc_bsg_send_mgmt_cmd_cmp;
489         cmdiocbq->context1 = dd_data;
490         cmdiocbq->context2 = cmp;
491         cmdiocbq->context3 = bmp;
492
493         dd_data->type = TYPE_IOCB;
494         dd_data->set_job = job;
495         dd_data->context_un.iocb.cmdiocbq = cmdiocbq;
496         dd_data->context_un.iocb.rmp = rmp;
497         job->dd_data = dd_data;
498
499         if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
500                 if (lpfc_readl(phba->HCregaddr, &creg_val)) {
501                         rc = -EIO ;
502                         goto free_rmp;
503                 }
504                 creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
505                 writel(creg_val, phba->HCregaddr);
506                 readl(phba->HCregaddr); /* flush */
507         }
508
509         cmdiocbq->context_un.ndlp = lpfc_nlp_get(ndlp);
510         if (!cmdiocbq->context_un.ndlp) {
511                 rc = -ENODEV;
512                 goto free_rmp;
513         }
514
515         iocb_stat = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, cmdiocbq, 0);
516         if (iocb_stat == IOCB_SUCCESS) {
517                 spin_lock_irqsave(&phba->hbalock, flags);
518                 /* make sure the I/O had not been completed yet */
519                 if (cmdiocbq->iocb_flag & LPFC_IO_LIBDFC) {
520                         /* open up abort window to timeout handler */
521                         cmdiocbq->iocb_flag |= LPFC_IO_CMD_OUTSTANDING;
522                 }
523                 spin_unlock_irqrestore(&phba->hbalock, flags);
524                 return 0; /* done for now */
525         } else if (iocb_stat == IOCB_BUSY) {
526                 rc = -EAGAIN;
527         } else {
528                 rc = -EIO;
529         }
530
531         /* iocb failed so cleanup */
532         lpfc_nlp_put(ndlp);
533
534 free_rmp:
535         lpfc_free_bsg_buffers(phba, rmp);
536 free_cmp:
537         lpfc_free_bsg_buffers(phba, cmp);
538 free_bmp:
539         if (bmp->virt)
540                 lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
541         kfree(bmp);
542 free_cmdiocbq:
543         lpfc_sli_release_iocbq(phba, cmdiocbq);
544 free_dd:
545         kfree(dd_data);
546 no_dd_data:
547         /* make error code available to userspace */
548         bsg_reply->result = rc;
549         job->dd_data = NULL;
550         return rc;
551 }
552
553 /**
554  * lpfc_bsg_rport_els_cmp - lpfc_bsg_rport_els's completion handler
555  * @phba: Pointer to HBA context object.
556  * @cmdiocbq: Pointer to command iocb.
557  * @rspiocbq: Pointer to response iocb.
558  *
559  * This function is the completion handler for iocbs issued using
560  * lpfc_bsg_rport_els_cmp function. This function is called by the
561  * ring event handler function without any lock held. This function
562  * can be called from both worker thread context and interrupt
563  * context. This function also can be called from other thread which
564  * cleans up the SLI layer objects.
565  * This function copies the contents of the response iocb to the
566  * response iocb memory object provided by the caller of
567  * lpfc_sli_issue_iocb_wait and then wakes up the thread which
568  * sleeps for the iocb completion.
569  **/
570 static void
571 lpfc_bsg_rport_els_cmp(struct lpfc_hba *phba,
572                         struct lpfc_iocbq *cmdiocbq,
573                         struct lpfc_iocbq *rspiocbq)
574 {
575         struct bsg_job_data *dd_data;
576         struct bsg_job *job;
577         struct fc_bsg_reply *bsg_reply;
578         IOCB_t *rsp;
579         struct lpfc_nodelist *ndlp;
580         struct lpfc_dmabuf *pcmd = NULL, *prsp = NULL;
581         struct fc_bsg_ctels_reply *els_reply;
582         uint8_t *rjt_data;
583         unsigned long flags;
584         unsigned int rsp_size;
585         int rc = 0;
586
587         dd_data = cmdiocbq->context1;
588         ndlp = dd_data->context_un.iocb.ndlp;
589         cmdiocbq->context1 = ndlp;
590
591         /* Determine if job has been aborted */
592         spin_lock_irqsave(&phba->ct_ev_lock, flags);
593         job = dd_data->set_job;
594         if (job) {
595                 bsg_reply = job->reply;
596                 /* Prevent timeout handling from trying to abort job  */
597                 job->dd_data = NULL;
598         }
599         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
600
601         /* Close the timeout handler abort window */
602         spin_lock_irqsave(&phba->hbalock, flags);
603         cmdiocbq->iocb_flag &= ~LPFC_IO_CMD_OUTSTANDING;
604         spin_unlock_irqrestore(&phba->hbalock, flags);
605
606         rsp = &rspiocbq->iocb;
607         pcmd = (struct lpfc_dmabuf *)cmdiocbq->context2;
608         prsp = (struct lpfc_dmabuf *)pcmd->list.next;
609
610         /* Copy the completed job data or determine the job status if job is
611          * still active
612          */
613
614         if (job) {
615                 if (rsp->ulpStatus == IOSTAT_SUCCESS) {
616                         rsp_size = rsp->un.elsreq64.bdl.bdeSize;
617                         bsg_reply->reply_payload_rcv_len =
618                                 sg_copy_from_buffer(job->reply_payload.sg_list,
619                                                     job->reply_payload.sg_cnt,
620                                                     prsp->virt,
621                                                     rsp_size);
622                 } else if (rsp->ulpStatus == IOSTAT_LS_RJT) {
623                         bsg_reply->reply_payload_rcv_len =
624                                 sizeof(struct fc_bsg_ctels_reply);
625                         /* LS_RJT data returned in word 4 */
626                         rjt_data = (uint8_t *)&rsp->un.ulpWord[4];
627                         els_reply = &bsg_reply->reply_data.ctels_reply;
628                         els_reply->status = FC_CTELS_STATUS_REJECT;
629                         els_reply->rjt_data.action = rjt_data[3];
630                         els_reply->rjt_data.reason_code = rjt_data[2];
631                         els_reply->rjt_data.reason_explanation = rjt_data[1];
632                         els_reply->rjt_data.vendor_unique = rjt_data[0];
633                 } else {
634                         rc = -EIO;
635                 }
636         }
637
638         lpfc_els_free_iocb(phba, cmdiocbq);
639
640         lpfc_nlp_put(ndlp);
641         kfree(dd_data);
642
643         /* Complete the job if the job is still active */
644
645         if (job) {
646                 bsg_reply->result = rc;
647                 bsg_job_done(job, bsg_reply->result,
648                                bsg_reply->reply_payload_rcv_len);
649         }
650         return;
651 }
652
653 /**
654  * lpfc_bsg_rport_els - send an ELS command from a bsg request
655  * @job: fc_bsg_job to handle
656  **/
657 static int
658 lpfc_bsg_rport_els(struct bsg_job *job)
659 {
660         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
661         struct lpfc_hba *phba = vport->phba;
662         struct lpfc_rport_data *rdata = fc_bsg_to_rport(job)->dd_data;
663         struct lpfc_nodelist *ndlp = rdata->pnode;
664         struct fc_bsg_request *bsg_request = job->request;
665         struct fc_bsg_reply *bsg_reply = job->reply;
666         uint32_t elscmd;
667         uint32_t cmdsize;
668         struct lpfc_iocbq *cmdiocbq;
669         uint16_t rpi = 0;
670         struct bsg_job_data *dd_data;
671         unsigned long flags;
672         uint32_t creg_val;
673         int rc = 0;
674
675         /* in case no data is transferred */
676         bsg_reply->reply_payload_rcv_len = 0;
677
678         /* verify the els command is not greater than the
679          * maximum ELS transfer size.
680          */
681
682         if (job->request_payload.payload_len > FCELSSIZE) {
683                 rc = -EINVAL;
684                 goto no_dd_data;
685         }
686
687         /* allocate our bsg tracking structure */
688         dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
689         if (!dd_data) {
690                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
691                                 "2735 Failed allocation of dd_data\n");
692                 rc = -ENOMEM;
693                 goto no_dd_data;
694         }
695
696         elscmd = bsg_request->rqst_data.r_els.els_code;
697         cmdsize = job->request_payload.payload_len;
698
699         if (!lpfc_nlp_get(ndlp)) {
700                 rc = -ENODEV;
701                 goto free_dd_data;
702         }
703
704         /* We will use the allocated dma buffers by prep els iocb for command
705          * and response to ensure if the job times out and the request is freed,
706          * we won't be dma into memory that is no longer allocated to for the
707          * request.
708          */
709
710         cmdiocbq = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp,
711                                       ndlp->nlp_DID, elscmd);
712         if (!cmdiocbq) {
713                 rc = -EIO;
714                 goto release_ndlp;
715         }
716
717         /* Transfer the request payload to allocated command dma buffer */
718         sg_copy_to_buffer(job->request_payload.sg_list,
719                           job->request_payload.sg_cnt,
720                           ((struct lpfc_dmabuf *)cmdiocbq->context2)->virt,
721                           cmdsize);
722
723         rpi = ndlp->nlp_rpi;
724
725         if (phba->sli_rev == LPFC_SLI_REV4)
726                 cmdiocbq->iocb.ulpContext = phba->sli4_hba.rpi_ids[rpi];
727         else
728                 cmdiocbq->iocb.ulpContext = rpi;
729         cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
730         cmdiocbq->context1 = dd_data;
731         cmdiocbq->context_un.ndlp = ndlp;
732         cmdiocbq->iocb_cmpl = lpfc_bsg_rport_els_cmp;
733         dd_data->type = TYPE_IOCB;
734         dd_data->set_job = job;
735         dd_data->context_un.iocb.cmdiocbq = cmdiocbq;
736         dd_data->context_un.iocb.ndlp = ndlp;
737         dd_data->context_un.iocb.rmp = NULL;
738         job->dd_data = dd_data;
739
740         if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
741                 if (lpfc_readl(phba->HCregaddr, &creg_val)) {
742                         rc = -EIO;
743                         goto linkdown_err;
744                 }
745                 creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
746                 writel(creg_val, phba->HCregaddr);
747                 readl(phba->HCregaddr); /* flush */
748         }
749
750         cmdiocbq->context1 = lpfc_nlp_get(ndlp);
751         if (!cmdiocbq->context1) {
752                 rc = -EIO;
753                 goto linkdown_err;
754         }
755
756         rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, cmdiocbq, 0);
757         if (rc == IOCB_SUCCESS) {
758                 spin_lock_irqsave(&phba->hbalock, flags);
759                 /* make sure the I/O had not been completed/released */
760                 if (cmdiocbq->iocb_flag & LPFC_IO_LIBDFC) {
761                         /* open up abort window to timeout handler */
762                         cmdiocbq->iocb_flag |= LPFC_IO_CMD_OUTSTANDING;
763                 }
764                 spin_unlock_irqrestore(&phba->hbalock, flags);
765                 return 0; /* done for now */
766         } else if (rc == IOCB_BUSY) {
767                 rc = -EAGAIN;
768         } else {
769                 rc = -EIO;
770         }
771
772         /* I/O issue failed.  Cleanup resources. */
773
774 linkdown_err:
775         lpfc_els_free_iocb(phba, cmdiocbq);
776
777 release_ndlp:
778         lpfc_nlp_put(ndlp);
779
780 free_dd_data:
781         kfree(dd_data);
782
783 no_dd_data:
784         /* make error code available to userspace */
785         bsg_reply->result = rc;
786         job->dd_data = NULL;
787         return rc;
788 }
789
790 /**
791  * lpfc_bsg_event_free - frees an allocated event structure
792  * @kref: Pointer to a kref.
793  *
794  * Called from kref_put. Back cast the kref into an event structure address.
795  * Free any events to get, delete associated nodes, free any events to see,
796  * free any data then free the event itself.
797  **/
798 static void
799 lpfc_bsg_event_free(struct kref *kref)
800 {
801         struct lpfc_bsg_event *evt = container_of(kref, struct lpfc_bsg_event,
802                                                   kref);
803         struct event_data *ed;
804
805         list_del(&evt->node);
806
807         while (!list_empty(&evt->events_to_get)) {
808                 ed = list_entry(evt->events_to_get.next, typeof(*ed), node);
809                 list_del(&ed->node);
810                 kfree(ed->data);
811                 kfree(ed);
812         }
813
814         while (!list_empty(&evt->events_to_see)) {
815                 ed = list_entry(evt->events_to_see.next, typeof(*ed), node);
816                 list_del(&ed->node);
817                 kfree(ed->data);
818                 kfree(ed);
819         }
820
821         kfree(evt->dd_data);
822         kfree(evt);
823 }
824
825 /**
826  * lpfc_bsg_event_ref - increments the kref for an event
827  * @evt: Pointer to an event structure.
828  **/
829 static inline void
830 lpfc_bsg_event_ref(struct lpfc_bsg_event *evt)
831 {
832         kref_get(&evt->kref);
833 }
834
835 /**
836  * lpfc_bsg_event_unref - Uses kref_put to free an event structure
837  * @evt: Pointer to an event structure.
838  **/
839 static inline void
840 lpfc_bsg_event_unref(struct lpfc_bsg_event *evt)
841 {
842         kref_put(&evt->kref, lpfc_bsg_event_free);
843 }
844
845 /**
846  * lpfc_bsg_event_new - allocate and initialize a event structure
847  * @ev_mask: Mask of events.
848  * @ev_reg_id: Event reg id.
849  * @ev_req_id: Event request id.
850  **/
851 static struct lpfc_bsg_event *
852 lpfc_bsg_event_new(uint32_t ev_mask, int ev_reg_id, uint32_t ev_req_id)
853 {
854         struct lpfc_bsg_event *evt = kzalloc(sizeof(*evt), GFP_KERNEL);
855
856         if (!evt)
857                 return NULL;
858
859         INIT_LIST_HEAD(&evt->events_to_get);
860         INIT_LIST_HEAD(&evt->events_to_see);
861         evt->type_mask = ev_mask;
862         evt->req_id = ev_req_id;
863         evt->reg_id = ev_reg_id;
864         evt->wait_time_stamp = jiffies;
865         evt->dd_data = NULL;
866         init_waitqueue_head(&evt->wq);
867         kref_init(&evt->kref);
868         return evt;
869 }
870
871 /**
872  * diag_cmd_data_free - Frees an lpfc dma buffer extension
873  * @phba: Pointer to HBA context object.
874  * @mlist: Pointer to an lpfc dma buffer extension.
875  **/
876 static int
877 diag_cmd_data_free(struct lpfc_hba *phba, struct lpfc_dmabufext *mlist)
878 {
879         struct lpfc_dmabufext *mlast;
880         struct pci_dev *pcidev;
881         struct list_head head, *curr, *next;
882
883         if ((!mlist) || (!lpfc_is_link_up(phba) &&
884                 (phba->link_flag & LS_LOOPBACK_MODE))) {
885                 return 0;
886         }
887
888         pcidev = phba->pcidev;
889         list_add_tail(&head, &mlist->dma.list);
890
891         list_for_each_safe(curr, next, &head) {
892                 mlast = list_entry(curr, struct lpfc_dmabufext , dma.list);
893                 if (mlast->dma.virt)
894                         dma_free_coherent(&pcidev->dev,
895                                           mlast->size,
896                                           mlast->dma.virt,
897                                           mlast->dma.phys);
898                 kfree(mlast);
899         }
900         return 0;
901 }
902
903 /*
904  * lpfc_bsg_ct_unsol_event - process an unsolicited CT command
905  *
906  * This function is called when an unsolicited CT command is received.  It
907  * forwards the event to any processes registered to receive CT events.
908  **/
909 int
910 lpfc_bsg_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
911                         struct lpfc_iocbq *piocbq)
912 {
913         uint32_t evt_req_id = 0;
914         uint32_t cmd;
915         struct lpfc_dmabuf *dmabuf = NULL;
916         struct lpfc_bsg_event *evt;
917         struct event_data *evt_dat = NULL;
918         struct lpfc_iocbq *iocbq;
919         size_t offset = 0;
920         struct list_head head;
921         struct ulp_bde64 *bde;
922         dma_addr_t dma_addr;
923         int i;
924         struct lpfc_dmabuf *bdeBuf1 = piocbq->context2;
925         struct lpfc_dmabuf *bdeBuf2 = piocbq->context3;
926         struct lpfc_hbq_entry *hbqe;
927         struct lpfc_sli_ct_request *ct_req;
928         struct bsg_job *job = NULL;
929         struct fc_bsg_reply *bsg_reply;
930         struct bsg_job_data *dd_data = NULL;
931         unsigned long flags;
932         int size = 0;
933
934         INIT_LIST_HEAD(&head);
935         list_add_tail(&head, &piocbq->list);
936
937         ct_req = (struct lpfc_sli_ct_request *)bdeBuf1;
938         evt_req_id = ct_req->FsType;
939         cmd = ct_req->CommandResponse.bits.CmdRsp;
940
941         spin_lock_irqsave(&phba->ct_ev_lock, flags);
942         list_for_each_entry(evt, &phba->ct_ev_waiters, node) {
943                 if (!(evt->type_mask & FC_REG_CT_EVENT) ||
944                         evt->req_id != evt_req_id)
945                         continue;
946
947                 lpfc_bsg_event_ref(evt);
948                 spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
949                 evt_dat = kzalloc(sizeof(*evt_dat), GFP_KERNEL);
950                 if (evt_dat == NULL) {
951                         spin_lock_irqsave(&phba->ct_ev_lock, flags);
952                         lpfc_bsg_event_unref(evt);
953                         lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
954                                         "2614 Memory allocation failed for "
955                                         "CT event\n");
956                         break;
957                 }
958
959                 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
960                         /* take accumulated byte count from the last iocbq */
961                         iocbq = list_entry(head.prev, typeof(*iocbq), list);
962                         evt_dat->len = iocbq->iocb.unsli3.rcvsli3.acc_len;
963                 } else {
964                         list_for_each_entry(iocbq, &head, list) {
965                                 for (i = 0; i < iocbq->iocb.ulpBdeCount; i++)
966                                         evt_dat->len +=
967                                         iocbq->iocb.un.cont64[i].tus.f.bdeSize;
968                         }
969                 }
970
971                 evt_dat->data = kzalloc(evt_dat->len, GFP_KERNEL);
972                 if (evt_dat->data == NULL) {
973                         lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
974                                         "2615 Memory allocation failed for "
975                                         "CT event data, size %d\n",
976                                         evt_dat->len);
977                         kfree(evt_dat);
978                         spin_lock_irqsave(&phba->ct_ev_lock, flags);
979                         lpfc_bsg_event_unref(evt);
980                         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
981                         goto error_ct_unsol_exit;
982                 }
983
984                 list_for_each_entry(iocbq, &head, list) {
985                         size = 0;
986                         if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
987                                 bdeBuf1 = iocbq->context2;
988                                 bdeBuf2 = iocbq->context3;
989                         }
990                         for (i = 0; i < iocbq->iocb.ulpBdeCount; i++) {
991                                 if (phba->sli3_options &
992                                     LPFC_SLI3_HBQ_ENABLED) {
993                                         if (i == 0) {
994                                                 hbqe = (struct lpfc_hbq_entry *)
995                                                   &iocbq->iocb.un.ulpWord[0];
996                                                 size = hbqe->bde.tus.f.bdeSize;
997                                                 dmabuf = bdeBuf1;
998                                         } else if (i == 1) {
999                                                 hbqe = (struct lpfc_hbq_entry *)
1000                                                         &iocbq->iocb.unsli3.
1001                                                         sli3Words[4];
1002                                                 size = hbqe->bde.tus.f.bdeSize;
1003                                                 dmabuf = bdeBuf2;
1004                                         }
1005                                         if ((offset + size) > evt_dat->len)
1006                                                 size = evt_dat->len - offset;
1007                                 } else {
1008                                         size = iocbq->iocb.un.cont64[i].
1009                                                 tus.f.bdeSize;
1010                                         bde = &iocbq->iocb.un.cont64[i];
1011                                         dma_addr = getPaddr(bde->addrHigh,
1012                                                             bde->addrLow);
1013                                         dmabuf = lpfc_sli_ringpostbuf_get(phba,
1014                                                         pring, dma_addr);
1015                                 }
1016                                 if (!dmabuf) {
1017                                         lpfc_printf_log(phba, KERN_ERR,
1018                                                 LOG_LIBDFC, "2616 No dmabuf "
1019                                                 "found for iocbq x%px\n",
1020                                                 iocbq);
1021                                         kfree(evt_dat->data);
1022                                         kfree(evt_dat);
1023                                         spin_lock_irqsave(&phba->ct_ev_lock,
1024                                                 flags);
1025                                         lpfc_bsg_event_unref(evt);
1026                                         spin_unlock_irqrestore(
1027                                                 &phba->ct_ev_lock, flags);
1028                                         goto error_ct_unsol_exit;
1029                                 }
1030                                 memcpy((char *)(evt_dat->data) + offset,
1031                                        dmabuf->virt, size);
1032                                 offset += size;
1033                                 if (evt_req_id != SLI_CT_ELX_LOOPBACK &&
1034                                     !(phba->sli3_options &
1035                                       LPFC_SLI3_HBQ_ENABLED)) {
1036                                         lpfc_sli_ringpostbuf_put(phba, pring,
1037                                                                  dmabuf);
1038                                 } else {
1039                                         switch (cmd) {
1040                                         case ELX_LOOPBACK_DATA:
1041                                                 if (phba->sli_rev <
1042                                                     LPFC_SLI_REV4)
1043                                                         diag_cmd_data_free(phba,
1044                                                         (struct lpfc_dmabufext
1045                                                          *)dmabuf);
1046                                                 break;
1047                                         case ELX_LOOPBACK_XRI_SETUP:
1048                                                 if ((phba->sli_rev ==
1049                                                         LPFC_SLI_REV2) ||
1050                                                         (phba->sli3_options &
1051                                                         LPFC_SLI3_HBQ_ENABLED
1052                                                         )) {
1053                                                         lpfc_in_buf_free(phba,
1054                                                                         dmabuf);
1055                                                 } else {
1056                                                         lpfc_post_buffer(phba,
1057                                                                          pring,
1058                                                                          1);
1059                                                 }
1060                                                 break;
1061                                         default:
1062                                                 if (!(phba->sli3_options &
1063                                                       LPFC_SLI3_HBQ_ENABLED))
1064                                                         lpfc_post_buffer(phba,
1065                                                                          pring,
1066                                                                          1);
1067                                                 break;
1068                                         }
1069                                 }
1070                         }
1071                 }
1072
1073                 spin_lock_irqsave(&phba->ct_ev_lock, flags);
1074                 if (phba->sli_rev == LPFC_SLI_REV4) {
1075                         evt_dat->immed_dat = phba->ctx_idx;
1076                         phba->ctx_idx = (phba->ctx_idx + 1) % LPFC_CT_CTX_MAX;
1077                         /* Provide warning for over-run of the ct_ctx array */
1078                         if (phba->ct_ctx[evt_dat->immed_dat].valid ==
1079                             UNSOL_VALID)
1080                                 lpfc_printf_log(phba, KERN_WARNING, LOG_ELS,
1081                                                 "2717 CT context array entry "
1082                                                 "[%d] over-run: oxid:x%x, "
1083                                                 "sid:x%x\n", phba->ctx_idx,
1084                                                 phba->ct_ctx[
1085                                                     evt_dat->immed_dat].oxid,
1086                                                 phba->ct_ctx[
1087                                                     evt_dat->immed_dat].SID);
1088                         phba->ct_ctx[evt_dat->immed_dat].rxid =
1089                                 piocbq->iocb.ulpContext;
1090                         phba->ct_ctx[evt_dat->immed_dat].oxid =
1091                                 piocbq->iocb.unsli3.rcvsli3.ox_id;
1092                         phba->ct_ctx[evt_dat->immed_dat].SID =
1093                                 piocbq->iocb.un.rcvels.remoteID;
1094                         phba->ct_ctx[evt_dat->immed_dat].valid = UNSOL_VALID;
1095                 } else
1096                         evt_dat->immed_dat = piocbq->iocb.ulpContext;
1097
1098                 evt_dat->type = FC_REG_CT_EVENT;
1099                 list_add(&evt_dat->node, &evt->events_to_see);
1100                 if (evt_req_id == SLI_CT_ELX_LOOPBACK) {
1101                         wake_up_interruptible(&evt->wq);
1102                         lpfc_bsg_event_unref(evt);
1103                         break;
1104                 }
1105
1106                 list_move(evt->events_to_see.prev, &evt->events_to_get);
1107
1108                 dd_data = (struct bsg_job_data *)evt->dd_data;
1109                 job = dd_data->set_job;
1110                 dd_data->set_job = NULL;
1111                 lpfc_bsg_event_unref(evt);
1112                 if (job) {
1113                         bsg_reply = job->reply;
1114                         bsg_reply->reply_payload_rcv_len = size;
1115                         /* make error code available to userspace */
1116                         bsg_reply->result = 0;
1117                         job->dd_data = NULL;
1118                         /* complete the job back to userspace */
1119                         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1120                         bsg_job_done(job, bsg_reply->result,
1121                                        bsg_reply->reply_payload_rcv_len);
1122                         spin_lock_irqsave(&phba->ct_ev_lock, flags);
1123                 }
1124         }
1125         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1126
1127 error_ct_unsol_exit:
1128         if (!list_empty(&head))
1129                 list_del(&head);
1130         if ((phba->sli_rev < LPFC_SLI_REV4) &&
1131             (evt_req_id == SLI_CT_ELX_LOOPBACK))
1132                 return 0;
1133         return 1;
1134 }
1135
1136 /**
1137  * lpfc_bsg_ct_unsol_abort - handler ct abort to management plane
1138  * @phba: Pointer to HBA context object.
1139  * @dmabuf: pointer to a dmabuf that describes the FC sequence
1140  *
1141  * This function handles abort to the CT command toward management plane
1142  * for SLI4 port.
1143  *
1144  * If the pending context of a CT command to management plane present, clears
1145  * such context and returns 1 for handled; otherwise, it returns 0 indicating
1146  * no context exists.
1147  **/
1148 int
1149 lpfc_bsg_ct_unsol_abort(struct lpfc_hba *phba, struct hbq_dmabuf *dmabuf)
1150 {
1151         struct fc_frame_header fc_hdr;
1152         struct fc_frame_header *fc_hdr_ptr = &fc_hdr;
1153         int ctx_idx, handled = 0;
1154         uint16_t oxid, rxid;
1155         uint32_t sid;
1156
1157         memcpy(fc_hdr_ptr, dmabuf->hbuf.virt, sizeof(struct fc_frame_header));
1158         sid = sli4_sid_from_fc_hdr(fc_hdr_ptr);
1159         oxid = be16_to_cpu(fc_hdr_ptr->fh_ox_id);
1160         rxid = be16_to_cpu(fc_hdr_ptr->fh_rx_id);
1161
1162         for (ctx_idx = 0; ctx_idx < LPFC_CT_CTX_MAX; ctx_idx++) {
1163                 if (phba->ct_ctx[ctx_idx].valid != UNSOL_VALID)
1164                         continue;
1165                 if (phba->ct_ctx[ctx_idx].rxid != rxid)
1166                         continue;
1167                 if (phba->ct_ctx[ctx_idx].oxid != oxid)
1168                         continue;
1169                 if (phba->ct_ctx[ctx_idx].SID != sid)
1170                         continue;
1171                 phba->ct_ctx[ctx_idx].valid = UNSOL_INVALID;
1172                 handled = 1;
1173         }
1174         return handled;
1175 }
1176
1177 /**
1178  * lpfc_bsg_hba_set_event - process a SET_EVENT bsg vendor command
1179  * @job: SET_EVENT fc_bsg_job
1180  **/
1181 static int
1182 lpfc_bsg_hba_set_event(struct bsg_job *job)
1183 {
1184         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
1185         struct lpfc_hba *phba = vport->phba;
1186         struct fc_bsg_request *bsg_request = job->request;
1187         struct set_ct_event *event_req;
1188         struct lpfc_bsg_event *evt;
1189         int rc = 0;
1190         struct bsg_job_data *dd_data = NULL;
1191         uint32_t ev_mask;
1192         unsigned long flags;
1193
1194         if (job->request_len <
1195             sizeof(struct fc_bsg_request) + sizeof(struct set_ct_event)) {
1196                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1197                                 "2612 Received SET_CT_EVENT below minimum "
1198                                 "size\n");
1199                 rc = -EINVAL;
1200                 goto job_error;
1201         }
1202
1203         event_req = (struct set_ct_event *)
1204                 bsg_request->rqst_data.h_vendor.vendor_cmd;
1205         ev_mask = ((uint32_t)(unsigned long)event_req->type_mask &
1206                                 FC_REG_EVENT_MASK);
1207         spin_lock_irqsave(&phba->ct_ev_lock, flags);
1208         list_for_each_entry(evt, &phba->ct_ev_waiters, node) {
1209                 if (evt->reg_id == event_req->ev_reg_id) {
1210                         lpfc_bsg_event_ref(evt);
1211                         evt->wait_time_stamp = jiffies;
1212                         dd_data = (struct bsg_job_data *)evt->dd_data;
1213                         break;
1214                 }
1215         }
1216         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1217
1218         if (&evt->node == &phba->ct_ev_waiters) {
1219                 /* no event waiting struct yet - first call */
1220                 dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
1221                 if (dd_data == NULL) {
1222                         lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1223                                         "2734 Failed allocation of dd_data\n");
1224                         rc = -ENOMEM;
1225                         goto job_error;
1226                 }
1227                 evt = lpfc_bsg_event_new(ev_mask, event_req->ev_reg_id,
1228                                         event_req->ev_req_id);
1229                 if (!evt) {
1230                         lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1231                                         "2617 Failed allocation of event "
1232                                         "waiter\n");
1233                         rc = -ENOMEM;
1234                         goto job_error;
1235                 }
1236                 dd_data->type = TYPE_EVT;
1237                 dd_data->set_job = NULL;
1238                 dd_data->context_un.evt = evt;
1239                 evt->dd_data = (void *)dd_data;
1240                 spin_lock_irqsave(&phba->ct_ev_lock, flags);
1241                 list_add(&evt->node, &phba->ct_ev_waiters);
1242                 lpfc_bsg_event_ref(evt);
1243                 evt->wait_time_stamp = jiffies;
1244                 spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1245         }
1246
1247         spin_lock_irqsave(&phba->ct_ev_lock, flags);
1248         evt->waiting = 1;
1249         dd_data->set_job = job; /* for unsolicited command */
1250         job->dd_data = dd_data; /* for fc transport timeout callback*/
1251         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1252         return 0; /* call job done later */
1253
1254 job_error:
1255         kfree(dd_data);
1256         job->dd_data = NULL;
1257         return rc;
1258 }
1259
1260 /**
1261  * lpfc_bsg_hba_get_event - process a GET_EVENT bsg vendor command
1262  * @job: GET_EVENT fc_bsg_job
1263  **/
1264 static int
1265 lpfc_bsg_hba_get_event(struct bsg_job *job)
1266 {
1267         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
1268         struct lpfc_hba *phba = vport->phba;
1269         struct fc_bsg_request *bsg_request = job->request;
1270         struct fc_bsg_reply *bsg_reply = job->reply;
1271         struct get_ct_event *event_req;
1272         struct get_ct_event_reply *event_reply;
1273         struct lpfc_bsg_event *evt, *evt_next;
1274         struct event_data *evt_dat = NULL;
1275         unsigned long flags;
1276         uint32_t rc = 0;
1277
1278         if (job->request_len <
1279             sizeof(struct fc_bsg_request) + sizeof(struct get_ct_event)) {
1280                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1281                                 "2613 Received GET_CT_EVENT request below "
1282                                 "minimum size\n");
1283                 rc = -EINVAL;
1284                 goto job_error;
1285         }
1286
1287         event_req = (struct get_ct_event *)
1288                 bsg_request->rqst_data.h_vendor.vendor_cmd;
1289
1290         event_reply = (struct get_ct_event_reply *)
1291                 bsg_reply->reply_data.vendor_reply.vendor_rsp;
1292         spin_lock_irqsave(&phba->ct_ev_lock, flags);
1293         list_for_each_entry_safe(evt, evt_next, &phba->ct_ev_waiters, node) {
1294                 if (evt->reg_id == event_req->ev_reg_id) {
1295                         if (list_empty(&evt->events_to_get))
1296                                 break;
1297                         lpfc_bsg_event_ref(evt);
1298                         evt->wait_time_stamp = jiffies;
1299                         evt_dat = list_entry(evt->events_to_get.prev,
1300                                              struct event_data, node);
1301                         list_del(&evt_dat->node);
1302                         break;
1303                 }
1304         }
1305         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1306
1307         /* The app may continue to ask for event data until it gets
1308          * an error indicating that there isn't anymore
1309          */
1310         if (evt_dat == NULL) {
1311                 bsg_reply->reply_payload_rcv_len = 0;
1312                 rc = -ENOENT;
1313                 goto job_error;
1314         }
1315
1316         if (evt_dat->len > job->request_payload.payload_len) {
1317                 evt_dat->len = job->request_payload.payload_len;
1318                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1319                                 "2618 Truncated event data at %d "
1320                                 "bytes\n",
1321                                 job->request_payload.payload_len);
1322         }
1323
1324         event_reply->type = evt_dat->type;
1325         event_reply->immed_data = evt_dat->immed_dat;
1326         if (evt_dat->len > 0)
1327                 bsg_reply->reply_payload_rcv_len =
1328                         sg_copy_from_buffer(job->request_payload.sg_list,
1329                                             job->request_payload.sg_cnt,
1330                                             evt_dat->data, evt_dat->len);
1331         else
1332                 bsg_reply->reply_payload_rcv_len = 0;
1333
1334         if (evt_dat) {
1335                 kfree(evt_dat->data);
1336                 kfree(evt_dat);
1337         }
1338
1339         spin_lock_irqsave(&phba->ct_ev_lock, flags);
1340         lpfc_bsg_event_unref(evt);
1341         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1342         job->dd_data = NULL;
1343         bsg_reply->result = 0;
1344         bsg_job_done(job, bsg_reply->result,
1345                        bsg_reply->reply_payload_rcv_len);
1346         return 0;
1347
1348 job_error:
1349         job->dd_data = NULL;
1350         bsg_reply->result = rc;
1351         return rc;
1352 }
1353
1354 /**
1355  * lpfc_issue_ct_rsp_cmp - lpfc_issue_ct_rsp's completion handler
1356  * @phba: Pointer to HBA context object.
1357  * @cmdiocbq: Pointer to command iocb.
1358  * @rspiocbq: Pointer to response iocb.
1359  *
1360  * This function is the completion handler for iocbs issued using
1361  * lpfc_issue_ct_rsp_cmp function. This function is called by the
1362  * ring event handler function without any lock held. This function
1363  * can be called from both worker thread context and interrupt
1364  * context. This function also can be called from other thread which
1365  * cleans up the SLI layer objects.
1366  * This function copy the contents of the response iocb to the
1367  * response iocb memory object provided by the caller of
1368  * lpfc_sli_issue_iocb_wait and then wakes up the thread which
1369  * sleeps for the iocb completion.
1370  **/
1371 static void
1372 lpfc_issue_ct_rsp_cmp(struct lpfc_hba *phba,
1373                         struct lpfc_iocbq *cmdiocbq,
1374                         struct lpfc_iocbq *rspiocbq)
1375 {
1376         struct bsg_job_data *dd_data;
1377         struct bsg_job *job;
1378         struct fc_bsg_reply *bsg_reply;
1379         IOCB_t *rsp;
1380         struct lpfc_dmabuf *bmp, *cmp;
1381         struct lpfc_nodelist *ndlp;
1382         unsigned long flags;
1383         int rc = 0;
1384
1385         dd_data = cmdiocbq->context1;
1386
1387         /* Determine if job has been aborted */
1388         spin_lock_irqsave(&phba->ct_ev_lock, flags);
1389         job = dd_data->set_job;
1390         if (job) {
1391                 /* Prevent timeout handling from trying to abort job  */
1392                 job->dd_data = NULL;
1393         }
1394         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1395
1396         /* Close the timeout handler abort window */
1397         spin_lock_irqsave(&phba->hbalock, flags);
1398         cmdiocbq->iocb_flag &= ~LPFC_IO_CMD_OUTSTANDING;
1399         spin_unlock_irqrestore(&phba->hbalock, flags);
1400
1401         ndlp = dd_data->context_un.iocb.ndlp;
1402         cmp = cmdiocbq->context2;
1403         bmp = cmdiocbq->context3;
1404         rsp = &rspiocbq->iocb;
1405
1406         /* Copy the completed job data or set the error status */
1407
1408         if (job) {
1409                 bsg_reply = job->reply;
1410                 if (rsp->ulpStatus) {
1411                         if (rsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
1412                                 switch (rsp->un.ulpWord[4] & IOERR_PARAM_MASK) {
1413                                 case IOERR_SEQUENCE_TIMEOUT:
1414                                         rc = -ETIMEDOUT;
1415                                         break;
1416                                 case IOERR_INVALID_RPI:
1417                                         rc = -EFAULT;
1418                                         break;
1419                                 default:
1420                                         rc = -EACCES;
1421                                         break;
1422                                 }
1423                         } else {
1424                                 rc = -EACCES;
1425                         }
1426                 } else {
1427                         bsg_reply->reply_payload_rcv_len = 0;
1428                 }
1429         }
1430
1431         lpfc_free_bsg_buffers(phba, cmp);
1432         lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
1433         kfree(bmp);
1434         lpfc_sli_release_iocbq(phba, cmdiocbq);
1435         lpfc_nlp_put(ndlp);
1436         kfree(dd_data);
1437
1438         /* Complete the job if the job is still active */
1439
1440         if (job) {
1441                 bsg_reply->result = rc;
1442                 bsg_job_done(job, bsg_reply->result,
1443                                bsg_reply->reply_payload_rcv_len);
1444         }
1445         return;
1446 }
1447
1448 /**
1449  * lpfc_issue_ct_rsp - issue a ct response
1450  * @phba: Pointer to HBA context object.
1451  * @job: Pointer to the job object.
1452  * @tag: tag index value into the ports context exchange array.
1453  * @cmp: Pointer to a cmp dma buffer descriptor.
1454  * @bmp: Pointer to a bmp dma buffer descriptor.
1455  * @num_entry: Number of enties in the bde.
1456  **/
1457 static int
1458 lpfc_issue_ct_rsp(struct lpfc_hba *phba, struct bsg_job *job, uint32_t tag,
1459                   struct lpfc_dmabuf *cmp, struct lpfc_dmabuf *bmp,
1460                   int num_entry)
1461 {
1462         IOCB_t *icmd;
1463         struct lpfc_iocbq *ctiocb = NULL;
1464         int rc = 0;
1465         struct lpfc_nodelist *ndlp = NULL;
1466         struct bsg_job_data *dd_data;
1467         unsigned long flags;
1468         uint32_t creg_val;
1469
1470         ndlp = lpfc_findnode_did(phba->pport, phba->ct_ctx[tag].SID);
1471         if (!ndlp) {
1472                 lpfc_printf_log(phba, KERN_WARNING, LOG_ELS,
1473                                 "2721 ndlp null for oxid %x SID %x\n",
1474                                 phba->ct_ctx[tag].rxid,
1475                                 phba->ct_ctx[tag].SID);
1476                 return IOCB_ERROR;
1477         }
1478
1479         /* allocate our bsg tracking structure */
1480         dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
1481         if (!dd_data) {
1482                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1483                                 "2736 Failed allocation of dd_data\n");
1484                 rc = -ENOMEM;
1485                 goto no_dd_data;
1486         }
1487
1488         /* Allocate buffer for  command iocb */
1489         ctiocb = lpfc_sli_get_iocbq(phba);
1490         if (!ctiocb) {
1491                 rc = -ENOMEM;
1492                 goto no_ctiocb;
1493         }
1494
1495         icmd = &ctiocb->iocb;
1496         icmd->un.xseq64.bdl.ulpIoTag32 = 0;
1497         icmd->un.xseq64.bdl.addrHigh = putPaddrHigh(bmp->phys);
1498         icmd->un.xseq64.bdl.addrLow = putPaddrLow(bmp->phys);
1499         icmd->un.xseq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
1500         icmd->un.xseq64.bdl.bdeSize = (num_entry * sizeof(struct ulp_bde64));
1501         icmd->un.xseq64.w5.hcsw.Fctl = (LS | LA);
1502         icmd->un.xseq64.w5.hcsw.Dfctl = 0;
1503         icmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_DD_SOL_CTL;
1504         icmd->un.xseq64.w5.hcsw.Type = FC_TYPE_CT;
1505
1506         /* Fill in rest of iocb */
1507         icmd->ulpCommand = CMD_XMIT_SEQUENCE64_CX;
1508         icmd->ulpBdeCount = 1;
1509         icmd->ulpLe = 1;
1510         icmd->ulpClass = CLASS3;
1511         if (phba->sli_rev == LPFC_SLI_REV4) {
1512                 /* Do not issue unsol response if oxid not marked as valid */
1513                 if (phba->ct_ctx[tag].valid != UNSOL_VALID) {
1514                         rc = IOCB_ERROR;
1515                         goto issue_ct_rsp_exit;
1516                 }
1517                 icmd->ulpContext = phba->ct_ctx[tag].rxid;
1518                 icmd->unsli3.rcvsli3.ox_id = phba->ct_ctx[tag].oxid;
1519                 ndlp = lpfc_findnode_did(phba->pport, phba->ct_ctx[tag].SID);
1520                 if (!ndlp) {
1521                         lpfc_printf_log(phba, KERN_WARNING, LOG_ELS,
1522                                  "2721 ndlp null for oxid %x SID %x\n",
1523                                         icmd->ulpContext,
1524                                         phba->ct_ctx[tag].SID);
1525                         rc = IOCB_ERROR;
1526                         goto issue_ct_rsp_exit;
1527                 }
1528
1529                 /* get a refernece count so the ndlp doesn't go away while
1530                  * we respond
1531                  */
1532                 if (!lpfc_nlp_get(ndlp)) {
1533                         rc = IOCB_ERROR;
1534                         goto issue_ct_rsp_exit;
1535                 }
1536
1537                 icmd->un.ulpWord[3] =
1538                                 phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
1539
1540                 /* The exchange is done, mark the entry as invalid */
1541                 phba->ct_ctx[tag].valid = UNSOL_INVALID;
1542         } else
1543                 icmd->ulpContext = (ushort) tag;
1544
1545         icmd->ulpTimeout = phba->fc_ratov * 2;
1546
1547         /* Xmit CT response on exchange <xid> */
1548         lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1549                 "2722 Xmit CT response on exchange x%x Data: x%x x%x x%x\n",
1550                 icmd->ulpContext, icmd->ulpIoTag, tag, phba->link_state);
1551
1552         ctiocb->iocb_flag |= LPFC_IO_LIBDFC;
1553         ctiocb->vport = phba->pport;
1554         ctiocb->context1 = dd_data;
1555         ctiocb->context2 = cmp;
1556         ctiocb->context3 = bmp;
1557         ctiocb->context_un.ndlp = ndlp;
1558         ctiocb->iocb_cmpl = lpfc_issue_ct_rsp_cmp;
1559
1560         dd_data->type = TYPE_IOCB;
1561         dd_data->set_job = job;
1562         dd_data->context_un.iocb.cmdiocbq = ctiocb;
1563         dd_data->context_un.iocb.ndlp = lpfc_nlp_get(ndlp);
1564         if (!dd_data->context_un.iocb.ndlp) {
1565                 rc = -IOCB_ERROR;
1566                 goto issue_ct_rsp_exit;
1567         }
1568         dd_data->context_un.iocb.rmp = NULL;
1569         job->dd_data = dd_data;
1570
1571         if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
1572                 if (lpfc_readl(phba->HCregaddr, &creg_val)) {
1573                         rc = -IOCB_ERROR;
1574                         goto issue_ct_rsp_exit;
1575                 }
1576                 creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
1577                 writel(creg_val, phba->HCregaddr);
1578                 readl(phba->HCregaddr); /* flush */
1579         }
1580
1581         rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, ctiocb, 0);
1582         if (rc == IOCB_SUCCESS) {
1583                 spin_lock_irqsave(&phba->hbalock, flags);
1584                 /* make sure the I/O had not been completed/released */
1585                 if (ctiocb->iocb_flag & LPFC_IO_LIBDFC) {
1586                         /* open up abort window to timeout handler */
1587                         ctiocb->iocb_flag |= LPFC_IO_CMD_OUTSTANDING;
1588                 }
1589                 spin_unlock_irqrestore(&phba->hbalock, flags);
1590                 return 0; /* done for now */
1591         }
1592
1593         /* iocb failed so cleanup */
1594         job->dd_data = NULL;
1595         lpfc_nlp_put(ndlp);
1596
1597 issue_ct_rsp_exit:
1598         lpfc_sli_release_iocbq(phba, ctiocb);
1599 no_ctiocb:
1600         kfree(dd_data);
1601 no_dd_data:
1602         return rc;
1603 }
1604
1605 /**
1606  * lpfc_bsg_send_mgmt_rsp - process a SEND_MGMT_RESP bsg vendor command
1607  * @job: SEND_MGMT_RESP fc_bsg_job
1608  **/
1609 static int
1610 lpfc_bsg_send_mgmt_rsp(struct bsg_job *job)
1611 {
1612         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
1613         struct lpfc_hba *phba = vport->phba;
1614         struct fc_bsg_request *bsg_request = job->request;
1615         struct fc_bsg_reply *bsg_reply = job->reply;
1616         struct send_mgmt_resp *mgmt_resp = (struct send_mgmt_resp *)
1617                 bsg_request->rqst_data.h_vendor.vendor_cmd;
1618         struct ulp_bde64 *bpl;
1619         struct lpfc_dmabuf *bmp = NULL, *cmp = NULL;
1620         int bpl_entries;
1621         uint32_t tag = mgmt_resp->tag;
1622         unsigned long reqbfrcnt =
1623                         (unsigned long)job->request_payload.payload_len;
1624         int rc = 0;
1625
1626         /* in case no data is transferred */
1627         bsg_reply->reply_payload_rcv_len = 0;
1628
1629         if (!reqbfrcnt || (reqbfrcnt > (80 * BUF_SZ_4K))) {
1630                 rc = -ERANGE;
1631                 goto send_mgmt_rsp_exit;
1632         }
1633
1634         bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
1635         if (!bmp) {
1636                 rc = -ENOMEM;
1637                 goto send_mgmt_rsp_exit;
1638         }
1639
1640         bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys);
1641         if (!bmp->virt) {
1642                 rc = -ENOMEM;
1643                 goto send_mgmt_rsp_free_bmp;
1644         }
1645
1646         INIT_LIST_HEAD(&bmp->list);
1647         bpl = (struct ulp_bde64 *) bmp->virt;
1648         bpl_entries = (LPFC_BPL_SIZE/sizeof(struct ulp_bde64));
1649         cmp = lpfc_alloc_bsg_buffers(phba, job->request_payload.payload_len,
1650                                      1, bpl, &bpl_entries);
1651         if (!cmp) {
1652                 rc = -ENOMEM;
1653                 goto send_mgmt_rsp_free_bmp;
1654         }
1655         lpfc_bsg_copy_data(cmp, &job->request_payload,
1656                            job->request_payload.payload_len, 1);
1657
1658         rc = lpfc_issue_ct_rsp(phba, job, tag, cmp, bmp, bpl_entries);
1659
1660         if (rc == IOCB_SUCCESS)
1661                 return 0; /* done for now */
1662
1663         rc = -EACCES;
1664
1665         lpfc_free_bsg_buffers(phba, cmp);
1666
1667 send_mgmt_rsp_free_bmp:
1668         if (bmp->virt)
1669                 lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
1670         kfree(bmp);
1671 send_mgmt_rsp_exit:
1672         /* make error code available to userspace */
1673         bsg_reply->result = rc;
1674         job->dd_data = NULL;
1675         return rc;
1676 }
1677
1678 /**
1679  * lpfc_bsg_diag_mode_enter - process preparing into device diag loopback mode
1680  * @phba: Pointer to HBA context object.
1681  *
1682  * This function is responsible for preparing driver for diag loopback
1683  * on device.
1684  */
1685 static int
1686 lpfc_bsg_diag_mode_enter(struct lpfc_hba *phba)
1687 {
1688         struct lpfc_vport **vports;
1689         struct Scsi_Host *shost;
1690         struct lpfc_sli *psli;
1691         struct lpfc_queue *qp = NULL;
1692         struct lpfc_sli_ring *pring;
1693         int i = 0;
1694
1695         psli = &phba->sli;
1696         if (!psli)
1697                 return -ENODEV;
1698
1699
1700         if ((phba->link_state == LPFC_HBA_ERROR) ||
1701             (psli->sli_flag & LPFC_BLOCK_MGMT_IO) ||
1702             (!(psli->sli_flag & LPFC_SLI_ACTIVE)))
1703                 return -EACCES;
1704
1705         vports = lpfc_create_vport_work_array(phba);
1706         if (vports) {
1707                 for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
1708                         shost = lpfc_shost_from_vport(vports[i]);
1709                         scsi_block_requests(shost);
1710                 }
1711                 lpfc_destroy_vport_work_array(phba, vports);
1712         } else {
1713                 shost = lpfc_shost_from_vport(phba->pport);
1714                 scsi_block_requests(shost);
1715         }
1716
1717         if (phba->sli_rev != LPFC_SLI_REV4) {
1718                 pring = &psli->sli3_ring[LPFC_FCP_RING];
1719                 lpfc_emptyq_wait(phba, &pring->txcmplq, &phba->hbalock);
1720                 return 0;
1721         }
1722         list_for_each_entry(qp, &phba->sli4_hba.lpfc_wq_list, wq_list) {
1723                 pring = qp->pring;
1724                 if (!pring || (pring->ringno != LPFC_FCP_RING))
1725                         continue;
1726                 if (!lpfc_emptyq_wait(phba, &pring->txcmplq,
1727                                       &pring->ring_lock))
1728                         break;
1729         }
1730         return 0;
1731 }
1732
1733 /**
1734  * lpfc_bsg_diag_mode_exit - exit process from device diag loopback mode
1735  * @phba: Pointer to HBA context object.
1736  *
1737  * This function is responsible for driver exit processing of setting up
1738  * diag loopback mode on device.
1739  */
1740 static void
1741 lpfc_bsg_diag_mode_exit(struct lpfc_hba *phba)
1742 {
1743         struct Scsi_Host *shost;
1744         struct lpfc_vport **vports;
1745         int i;
1746
1747         vports = lpfc_create_vport_work_array(phba);
1748         if (vports) {
1749                 for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
1750                         shost = lpfc_shost_from_vport(vports[i]);
1751                         scsi_unblock_requests(shost);
1752                 }
1753                 lpfc_destroy_vport_work_array(phba, vports);
1754         } else {
1755                 shost = lpfc_shost_from_vport(phba->pport);
1756                 scsi_unblock_requests(shost);
1757         }
1758         return;
1759 }
1760
1761 /**
1762  * lpfc_sli3_bsg_diag_loopback_mode - process an sli3 bsg vendor command
1763  * @phba: Pointer to HBA context object.
1764  * @job: LPFC_BSG_VENDOR_DIAG_MODE
1765  *
1766  * This function is responsible for placing an sli3  port into diagnostic
1767  * loopback mode in order to perform a diagnostic loopback test.
1768  * All new scsi requests are blocked, a small delay is used to allow the
1769  * scsi requests to complete then the link is brought down. If the link is
1770  * is placed in loopback mode then scsi requests are again allowed
1771  * so the scsi mid-layer doesn't give up on the port.
1772  * All of this is done in-line.
1773  */
1774 static int
1775 lpfc_sli3_bsg_diag_loopback_mode(struct lpfc_hba *phba, struct bsg_job *job)
1776 {
1777         struct fc_bsg_request *bsg_request = job->request;
1778         struct fc_bsg_reply *bsg_reply = job->reply;
1779         struct diag_mode_set *loopback_mode;
1780         uint32_t link_flags;
1781         uint32_t timeout;
1782         LPFC_MBOXQ_t *pmboxq  = NULL;
1783         int mbxstatus = MBX_SUCCESS;
1784         int i = 0;
1785         int rc = 0;
1786
1787         /* no data to return just the return code */
1788         bsg_reply->reply_payload_rcv_len = 0;
1789
1790         if (job->request_len < sizeof(struct fc_bsg_request) +
1791             sizeof(struct diag_mode_set)) {
1792                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1793                                 "2738 Received DIAG MODE request size:%d "
1794                                 "below the minimum size:%d\n",
1795                                 job->request_len,
1796                                 (int)(sizeof(struct fc_bsg_request) +
1797                                 sizeof(struct diag_mode_set)));
1798                 rc = -EINVAL;
1799                 goto job_error;
1800         }
1801
1802         rc = lpfc_bsg_diag_mode_enter(phba);
1803         if (rc)
1804                 goto job_error;
1805
1806         /* bring the link to diagnostic mode */
1807         loopback_mode = (struct diag_mode_set *)
1808                 bsg_request->rqst_data.h_vendor.vendor_cmd;
1809         link_flags = loopback_mode->type;
1810         timeout = loopback_mode->timeout * 100;
1811
1812         pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1813         if (!pmboxq) {
1814                 rc = -ENOMEM;
1815                 goto loopback_mode_exit;
1816         }
1817         memset((void *)pmboxq, 0, sizeof(LPFC_MBOXQ_t));
1818         pmboxq->u.mb.mbxCommand = MBX_DOWN_LINK;
1819         pmboxq->u.mb.mbxOwner = OWN_HOST;
1820
1821         mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO);
1822
1823         if ((mbxstatus == MBX_SUCCESS) && (pmboxq->u.mb.mbxStatus == 0)) {
1824                 /* wait for link down before proceeding */
1825                 i = 0;
1826                 while (phba->link_state != LPFC_LINK_DOWN) {
1827                         if (i++ > timeout) {
1828                                 rc = -ETIMEDOUT;
1829                                 goto loopback_mode_exit;
1830                         }
1831                         msleep(10);
1832                 }
1833
1834                 memset((void *)pmboxq, 0, sizeof(LPFC_MBOXQ_t));
1835                 if (link_flags == INTERNAL_LOOP_BACK)
1836                         pmboxq->u.mb.un.varInitLnk.link_flags = FLAGS_LOCAL_LB;
1837                 else
1838                         pmboxq->u.mb.un.varInitLnk.link_flags =
1839                                 FLAGS_TOPOLOGY_MODE_LOOP;
1840
1841                 pmboxq->u.mb.mbxCommand = MBX_INIT_LINK;
1842                 pmboxq->u.mb.mbxOwner = OWN_HOST;
1843
1844                 mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq,
1845                                                      LPFC_MBOX_TMO);
1846
1847                 if ((mbxstatus != MBX_SUCCESS) || (pmboxq->u.mb.mbxStatus))
1848                         rc = -ENODEV;
1849                 else {
1850                         spin_lock_irq(&phba->hbalock);
1851                         phba->link_flag |= LS_LOOPBACK_MODE;
1852                         spin_unlock_irq(&phba->hbalock);
1853                         /* wait for the link attention interrupt */
1854                         msleep(100);
1855
1856                         i = 0;
1857                         while (phba->link_state != LPFC_HBA_READY) {
1858                                 if (i++ > timeout) {
1859                                         rc = -ETIMEDOUT;
1860                                         break;
1861                                 }
1862
1863                                 msleep(10);
1864                         }
1865                 }
1866
1867         } else
1868                 rc = -ENODEV;
1869
1870 loopback_mode_exit:
1871         lpfc_bsg_diag_mode_exit(phba);
1872
1873         /*
1874          * Let SLI layer release mboxq if mbox command completed after timeout.
1875          */
1876         if (pmboxq && mbxstatus != MBX_TIMEOUT)
1877                 mempool_free(pmboxq, phba->mbox_mem_pool);
1878
1879 job_error:
1880         /* make error code available to userspace */
1881         bsg_reply->result = rc;
1882         /* complete the job back to userspace if no error */
1883         if (rc == 0)
1884                 bsg_job_done(job, bsg_reply->result,
1885                                bsg_reply->reply_payload_rcv_len);
1886         return rc;
1887 }
1888
1889 /**
1890  * lpfc_sli4_bsg_set_link_diag_state - set sli4 link diag state
1891  * @phba: Pointer to HBA context object.
1892  * @diag: Flag for set link to diag or nomral operation state.
1893  *
1894  * This function is responsible for issuing a sli4 mailbox command for setting
1895  * link to either diag state or normal operation state.
1896  */
1897 static int
1898 lpfc_sli4_bsg_set_link_diag_state(struct lpfc_hba *phba, uint32_t diag)
1899 {
1900         LPFC_MBOXQ_t *pmboxq;
1901         struct lpfc_mbx_set_link_diag_state *link_diag_state;
1902         uint32_t req_len, alloc_len;
1903         int mbxstatus = MBX_SUCCESS, rc;
1904
1905         pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1906         if (!pmboxq)
1907                 return -ENOMEM;
1908
1909         req_len = (sizeof(struct lpfc_mbx_set_link_diag_state) -
1910                    sizeof(struct lpfc_sli4_cfg_mhdr));
1911         alloc_len = lpfc_sli4_config(phba, pmboxq, LPFC_MBOX_SUBSYSTEM_FCOE,
1912                                 LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_STATE,
1913                                 req_len, LPFC_SLI4_MBX_EMBED);
1914         if (alloc_len != req_len) {
1915                 rc = -ENOMEM;
1916                 goto link_diag_state_set_out;
1917         }
1918         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
1919                         "3128 Set link to diagnostic state:x%x (x%x/x%x)\n",
1920                         diag, phba->sli4_hba.lnk_info.lnk_tp,
1921                         phba->sli4_hba.lnk_info.lnk_no);
1922
1923         link_diag_state = &pmboxq->u.mqe.un.link_diag_state;
1924         bf_set(lpfc_mbx_set_diag_state_diag_bit_valid, &link_diag_state->u.req,
1925                LPFC_DIAG_STATE_DIAG_BIT_VALID_CHANGE);
1926         bf_set(lpfc_mbx_set_diag_state_link_num, &link_diag_state->u.req,
1927                phba->sli4_hba.lnk_info.lnk_no);
1928         bf_set(lpfc_mbx_set_diag_state_link_type, &link_diag_state->u.req,
1929                phba->sli4_hba.lnk_info.lnk_tp);
1930         if (diag)
1931                 bf_set(lpfc_mbx_set_diag_state_diag,
1932                        &link_diag_state->u.req, 1);
1933         else
1934                 bf_set(lpfc_mbx_set_diag_state_diag,
1935                        &link_diag_state->u.req, 0);
1936
1937         mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO);
1938
1939         if ((mbxstatus == MBX_SUCCESS) && (pmboxq->u.mb.mbxStatus == 0))
1940                 rc = 0;
1941         else
1942                 rc = -ENODEV;
1943
1944 link_diag_state_set_out:
1945         if (pmboxq && (mbxstatus != MBX_TIMEOUT))
1946                 mempool_free(pmboxq, phba->mbox_mem_pool);
1947
1948         return rc;
1949 }
1950
1951 /**
1952  * lpfc_sli4_bsg_set_loopback_mode - set sli4 internal loopback diagnostic
1953  * @phba: Pointer to HBA context object.
1954  * @mode: loopback mode to set
1955  * @link_no: link number for loopback mode to set
1956  *
1957  * This function is responsible for issuing a sli4 mailbox command for setting
1958  * up loopback diagnostic for a link.
1959  */
1960 static int
1961 lpfc_sli4_bsg_set_loopback_mode(struct lpfc_hba *phba, int mode,
1962                                 uint32_t link_no)
1963 {
1964         LPFC_MBOXQ_t *pmboxq;
1965         uint32_t req_len, alloc_len;
1966         struct lpfc_mbx_set_link_diag_loopback *link_diag_loopback;
1967         int mbxstatus = MBX_SUCCESS, rc = 0;
1968
1969         pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1970         if (!pmboxq)
1971                 return -ENOMEM;
1972         req_len = (sizeof(struct lpfc_mbx_set_link_diag_loopback) -
1973                    sizeof(struct lpfc_sli4_cfg_mhdr));
1974         alloc_len = lpfc_sli4_config(phba, pmboxq, LPFC_MBOX_SUBSYSTEM_FCOE,
1975                                 LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_LOOPBACK,
1976                                 req_len, LPFC_SLI4_MBX_EMBED);
1977         if (alloc_len != req_len) {
1978                 mempool_free(pmboxq, phba->mbox_mem_pool);
1979                 return -ENOMEM;
1980         }
1981         link_diag_loopback = &pmboxq->u.mqe.un.link_diag_loopback;
1982         bf_set(lpfc_mbx_set_diag_state_link_num,
1983                &link_diag_loopback->u.req, link_no);
1984
1985         if (phba->sli4_hba.conf_trunk & (1 << link_no)) {
1986                 bf_set(lpfc_mbx_set_diag_state_link_type,
1987                        &link_diag_loopback->u.req, LPFC_LNK_FC_TRUNKED);
1988         } else {
1989                 bf_set(lpfc_mbx_set_diag_state_link_type,
1990                        &link_diag_loopback->u.req,
1991                        phba->sli4_hba.lnk_info.lnk_tp);
1992         }
1993
1994         bf_set(lpfc_mbx_set_diag_lpbk_type, &link_diag_loopback->u.req,
1995                mode);
1996
1997         mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO);
1998         if ((mbxstatus != MBX_SUCCESS) || (pmboxq->u.mb.mbxStatus)) {
1999                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2000                                 "3127 Failed setup loopback mode mailbox "
2001                                 "command, rc:x%x, status:x%x\n", mbxstatus,
2002                                 pmboxq->u.mb.mbxStatus);
2003                 rc = -ENODEV;
2004         }
2005         if (pmboxq && (mbxstatus != MBX_TIMEOUT))
2006                 mempool_free(pmboxq, phba->mbox_mem_pool);
2007         return rc;
2008 }
2009
2010 /**
2011  * lpfc_sli4_diag_fcport_reg_setup - setup port registrations for diagnostic
2012  * @phba: Pointer to HBA context object.
2013  *
2014  * This function set up SLI4 FC port registrations for diagnostic run, which
2015  * includes all the rpis, vfi, and also vpi.
2016  */
2017 static int
2018 lpfc_sli4_diag_fcport_reg_setup(struct lpfc_hba *phba)
2019 {
2020         int rc;
2021
2022         if (phba->pport->fc_flag & FC_VFI_REGISTERED) {
2023                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2024                                 "3136 Port still had vfi registered: "
2025                                 "mydid:x%x, fcfi:%d, vfi:%d, vpi:%d\n",
2026                                 phba->pport->fc_myDID, phba->fcf.fcfi,
2027                                 phba->sli4_hba.vfi_ids[phba->pport->vfi],
2028                                 phba->vpi_ids[phba->pport->vpi]);
2029                 return -EINVAL;
2030         }
2031         rc = lpfc_issue_reg_vfi(phba->pport);
2032         return rc;
2033 }
2034
2035 /**
2036  * lpfc_sli4_bsg_diag_loopback_mode - process an sli4 bsg vendor command
2037  * @phba: Pointer to HBA context object.
2038  * @job: LPFC_BSG_VENDOR_DIAG_MODE
2039  *
2040  * This function is responsible for placing an sli4 port into diagnostic
2041  * loopback mode in order to perform a diagnostic loopback test.
2042  */
2043 static int
2044 lpfc_sli4_bsg_diag_loopback_mode(struct lpfc_hba *phba, struct bsg_job *job)
2045 {
2046         struct fc_bsg_request *bsg_request = job->request;
2047         struct fc_bsg_reply *bsg_reply = job->reply;
2048         struct diag_mode_set *loopback_mode;
2049         uint32_t link_flags, timeout, link_no;
2050         int i, rc = 0;
2051
2052         /* no data to return just the return code */
2053         bsg_reply->reply_payload_rcv_len = 0;
2054
2055         if (job->request_len < sizeof(struct fc_bsg_request) +
2056             sizeof(struct diag_mode_set)) {
2057                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2058                                 "3011 Received DIAG MODE request size:%d "
2059                                 "below the minimum size:%d\n",
2060                                 job->request_len,
2061                                 (int)(sizeof(struct fc_bsg_request) +
2062                                 sizeof(struct diag_mode_set)));
2063                 rc = -EINVAL;
2064                 goto job_done;
2065         }
2066
2067         loopback_mode = (struct diag_mode_set *)
2068                 bsg_request->rqst_data.h_vendor.vendor_cmd;
2069         link_flags = loopback_mode->type;
2070         timeout = loopback_mode->timeout * 100;
2071
2072         if (loopback_mode->physical_link == -1)
2073                 link_no = phba->sli4_hba.lnk_info.lnk_no;
2074         else
2075                 link_no = loopback_mode->physical_link;
2076
2077         if (link_flags == DISABLE_LOOP_BACK) {
2078                 rc = lpfc_sli4_bsg_set_loopback_mode(phba,
2079                                         LPFC_DIAG_LOOPBACK_TYPE_DISABLE,
2080                                         link_no);
2081                 if (!rc) {
2082                         /* Unset the need disable bit */
2083                         phba->sli4_hba.conf_trunk &= ~((1 << link_no) << 4);
2084                 }
2085                 goto job_done;
2086         } else {
2087                 /* Check if we need to disable the loopback state */
2088                 if (phba->sli4_hba.conf_trunk & ((1 << link_no) << 4)) {
2089                         rc = -EPERM;
2090                         goto job_done;
2091                 }
2092         }
2093
2094         rc = lpfc_bsg_diag_mode_enter(phba);
2095         if (rc)
2096                 goto job_done;
2097
2098         /* indicate we are in loobpack diagnostic mode */
2099         spin_lock_irq(&phba->hbalock);
2100         phba->link_flag |= LS_LOOPBACK_MODE;
2101         spin_unlock_irq(&phba->hbalock);
2102
2103         /* reset port to start frome scratch */
2104         rc = lpfc_selective_reset(phba);
2105         if (rc)
2106                 goto job_done;
2107
2108         /* bring the link to diagnostic mode */
2109         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2110                         "3129 Bring link to diagnostic state.\n");
2111
2112         rc = lpfc_sli4_bsg_set_link_diag_state(phba, 1);
2113         if (rc) {
2114                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2115                                 "3130 Failed to bring link to diagnostic "
2116                                 "state, rc:x%x\n", rc);
2117                 goto loopback_mode_exit;
2118         }
2119
2120         /* wait for link down before proceeding */
2121         i = 0;
2122         while (phba->link_state != LPFC_LINK_DOWN) {
2123                 if (i++ > timeout) {
2124                         rc = -ETIMEDOUT;
2125                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2126                                         "3131 Timeout waiting for link to "
2127                                         "diagnostic mode, timeout:%d ms\n",
2128                                         timeout * 10);
2129                         goto loopback_mode_exit;
2130                 }
2131                 msleep(10);
2132         }
2133
2134         /* set up loopback mode */
2135         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2136                         "3132 Set up loopback mode:x%x\n", link_flags);
2137
2138         switch (link_flags) {
2139         case INTERNAL_LOOP_BACK:
2140                 if (phba->sli4_hba.conf_trunk & (1 << link_no)) {
2141                         rc = lpfc_sli4_bsg_set_loopback_mode(phba,
2142                                         LPFC_DIAG_LOOPBACK_TYPE_INTERNAL,
2143                                         link_no);
2144                 } else {
2145                         /* Trunk is configured, but link is not in this trunk */
2146                         if (phba->sli4_hba.conf_trunk) {
2147                                 rc = -ELNRNG;
2148                                 goto loopback_mode_exit;
2149                         }
2150
2151                         rc = lpfc_sli4_bsg_set_loopback_mode(phba,
2152                                         LPFC_DIAG_LOOPBACK_TYPE_INTERNAL,
2153                                         link_no);
2154                 }
2155
2156                 if (!rc) {
2157                         /* Set the need disable bit */
2158                         phba->sli4_hba.conf_trunk |= (1 << link_no) << 4;
2159                 }
2160
2161                 break;
2162         case EXTERNAL_LOOP_BACK:
2163                 if (phba->sli4_hba.conf_trunk & (1 << link_no)) {
2164                         rc = lpfc_sli4_bsg_set_loopback_mode(phba,
2165                                 LPFC_DIAG_LOOPBACK_TYPE_EXTERNAL_TRUNKED,
2166                                 link_no);
2167                 } else {
2168                         /* Trunk is configured, but link is not in this trunk */
2169                         if (phba->sli4_hba.conf_trunk) {
2170                                 rc = -ELNRNG;
2171                                 goto loopback_mode_exit;
2172                         }
2173
2174                         rc = lpfc_sli4_bsg_set_loopback_mode(phba,
2175                                                 LPFC_DIAG_LOOPBACK_TYPE_SERDES,
2176                                                 link_no);
2177                 }
2178
2179                 if (!rc) {
2180                         /* Set the need disable bit */
2181                         phba->sli4_hba.conf_trunk |= (1 << link_no) << 4;
2182                 }
2183
2184                 break;
2185         default:
2186                 rc = -EINVAL;
2187                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
2188                                 "3141 Loopback mode:x%x not supported\n",
2189                                 link_flags);
2190                 goto loopback_mode_exit;
2191         }
2192
2193         if (!rc) {
2194                 /* wait for the link attention interrupt */
2195                 msleep(100);
2196                 i = 0;
2197                 while (phba->link_state < LPFC_LINK_UP) {
2198                         if (i++ > timeout) {
2199                                 rc = -ETIMEDOUT;
2200                                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2201                                         "3137 Timeout waiting for link up "
2202                                         "in loopback mode, timeout:%d ms\n",
2203                                         timeout * 10);
2204                                 break;
2205                         }
2206                         msleep(10);
2207                 }
2208         }
2209
2210         /* port resource registration setup for loopback diagnostic */
2211         if (!rc) {
2212                 /* set up a none zero myDID for loopback test */
2213                 phba->pport->fc_myDID = 1;
2214                 rc = lpfc_sli4_diag_fcport_reg_setup(phba);
2215         } else
2216                 goto loopback_mode_exit;
2217
2218         if (!rc) {
2219                 /* wait for the port ready */
2220                 msleep(100);
2221                 i = 0;
2222                 while (phba->link_state != LPFC_HBA_READY) {
2223                         if (i++ > timeout) {
2224                                 rc = -ETIMEDOUT;
2225                                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2226                                         "3133 Timeout waiting for port "
2227                                         "loopback mode ready, timeout:%d ms\n",
2228                                         timeout * 10);
2229                                 break;
2230                         }
2231                         msleep(10);
2232                 }
2233         }
2234
2235 loopback_mode_exit:
2236         /* clear loopback diagnostic mode */
2237         if (rc) {
2238                 spin_lock_irq(&phba->hbalock);
2239                 phba->link_flag &= ~LS_LOOPBACK_MODE;
2240                 spin_unlock_irq(&phba->hbalock);
2241         }
2242         lpfc_bsg_diag_mode_exit(phba);
2243
2244 job_done:
2245         /* make error code available to userspace */
2246         bsg_reply->result = rc;
2247         /* complete the job back to userspace if no error */
2248         if (rc == 0)
2249                 bsg_job_done(job, bsg_reply->result,
2250                                bsg_reply->reply_payload_rcv_len);
2251         return rc;
2252 }
2253
2254 /**
2255  * lpfc_bsg_diag_loopback_mode - bsg vendor command for diag loopback mode
2256  * @job: LPFC_BSG_VENDOR_DIAG_MODE
2257  *
2258  * This function is responsible for responding to check and dispatch bsg diag
2259  * command from the user to proper driver action routines.
2260  */
2261 static int
2262 lpfc_bsg_diag_loopback_mode(struct bsg_job *job)
2263 {
2264         struct Scsi_Host *shost;
2265         struct lpfc_vport *vport;
2266         struct lpfc_hba *phba;
2267         int rc;
2268
2269         shost = fc_bsg_to_shost(job);
2270         if (!shost)
2271                 return -ENODEV;
2272         vport = shost_priv(shost);
2273         if (!vport)
2274                 return -ENODEV;
2275         phba = vport->phba;
2276         if (!phba)
2277                 return -ENODEV;
2278
2279         if (phba->sli_rev < LPFC_SLI_REV4)
2280                 rc = lpfc_sli3_bsg_diag_loopback_mode(phba, job);
2281         else if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >=
2282                  LPFC_SLI_INTF_IF_TYPE_2)
2283                 rc = lpfc_sli4_bsg_diag_loopback_mode(phba, job);
2284         else
2285                 rc = -ENODEV;
2286
2287         return rc;
2288 }
2289
2290 /**
2291  * lpfc_sli4_bsg_diag_mode_end - sli4 bsg vendor command for ending diag mode
2292  * @job: LPFC_BSG_VENDOR_DIAG_MODE_END
2293  *
2294  * This function is responsible for responding to check and dispatch bsg diag
2295  * command from the user to proper driver action routines.
2296  */
2297 static int
2298 lpfc_sli4_bsg_diag_mode_end(struct bsg_job *job)
2299 {
2300         struct fc_bsg_request *bsg_request = job->request;
2301         struct fc_bsg_reply *bsg_reply = job->reply;
2302         struct Scsi_Host *shost;
2303         struct lpfc_vport *vport;
2304         struct lpfc_hba *phba;
2305         struct diag_mode_set *loopback_mode_end_cmd;
2306         uint32_t timeout;
2307         int rc, i;
2308
2309         shost = fc_bsg_to_shost(job);
2310         if (!shost)
2311                 return -ENODEV;
2312         vport = shost_priv(shost);
2313         if (!vport)
2314                 return -ENODEV;
2315         phba = vport->phba;
2316         if (!phba)
2317                 return -ENODEV;
2318
2319         if (phba->sli_rev < LPFC_SLI_REV4)
2320                 return -ENODEV;
2321         if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
2322             LPFC_SLI_INTF_IF_TYPE_2)
2323                 return -ENODEV;
2324
2325         /* clear loopback diagnostic mode */
2326         spin_lock_irq(&phba->hbalock);
2327         phba->link_flag &= ~LS_LOOPBACK_MODE;
2328         spin_unlock_irq(&phba->hbalock);
2329         loopback_mode_end_cmd = (struct diag_mode_set *)
2330                         bsg_request->rqst_data.h_vendor.vendor_cmd;
2331         timeout = loopback_mode_end_cmd->timeout * 100;
2332
2333         rc = lpfc_sli4_bsg_set_link_diag_state(phba, 0);
2334         if (rc) {
2335                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2336                                 "3139 Failed to bring link to diagnostic "
2337                                 "state, rc:x%x\n", rc);
2338                 goto loopback_mode_end_exit;
2339         }
2340
2341         /* wait for link down before proceeding */
2342         i = 0;
2343         while (phba->link_state != LPFC_LINK_DOWN) {
2344                 if (i++ > timeout) {
2345                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2346                                         "3140 Timeout waiting for link to "
2347                                         "diagnostic mode_end, timeout:%d ms\n",
2348                                         timeout * 10);
2349                         /* there is nothing much we can do here */
2350                         break;
2351                 }
2352                 msleep(10);
2353         }
2354
2355         /* reset port resource registrations */
2356         rc = lpfc_selective_reset(phba);
2357         phba->pport->fc_myDID = 0;
2358
2359 loopback_mode_end_exit:
2360         /* make return code available to userspace */
2361         bsg_reply->result = rc;
2362         /* complete the job back to userspace if no error */
2363         if (rc == 0)
2364                 bsg_job_done(job, bsg_reply->result,
2365                                bsg_reply->reply_payload_rcv_len);
2366         return rc;
2367 }
2368
2369 /**
2370  * lpfc_sli4_bsg_link_diag_test - sli4 bsg vendor command for diag link test
2371  * @job: LPFC_BSG_VENDOR_DIAG_LINK_TEST
2372  *
2373  * This function is to perform SLI4 diag link test request from the user
2374  * applicaiton.
2375  */
2376 static int
2377 lpfc_sli4_bsg_link_diag_test(struct bsg_job *job)
2378 {
2379         struct fc_bsg_request *bsg_request = job->request;
2380         struct fc_bsg_reply *bsg_reply = job->reply;
2381         struct Scsi_Host *shost;
2382         struct lpfc_vport *vport;
2383         struct lpfc_hba *phba;
2384         LPFC_MBOXQ_t *pmboxq;
2385         struct sli4_link_diag *link_diag_test_cmd;
2386         uint32_t req_len, alloc_len;
2387         struct lpfc_mbx_run_link_diag_test *run_link_diag_test;
2388         union lpfc_sli4_cfg_shdr *shdr;
2389         uint32_t shdr_status, shdr_add_status;
2390         struct diag_status *diag_status_reply;
2391         int mbxstatus, rc = -ENODEV, rc1 = 0;
2392
2393         shost = fc_bsg_to_shost(job);
2394         if (!shost)
2395                 goto job_error;
2396
2397         vport = shost_priv(shost);
2398         if (!vport)
2399                 goto job_error;
2400
2401         phba = vport->phba;
2402         if (!phba)
2403                 goto job_error;
2404
2405
2406         if (phba->sli_rev < LPFC_SLI_REV4)
2407                 goto job_error;
2408
2409         if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
2410             LPFC_SLI_INTF_IF_TYPE_2)
2411                 goto job_error;
2412
2413         if (job->request_len < sizeof(struct fc_bsg_request) +
2414             sizeof(struct sli4_link_diag)) {
2415                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2416                                 "3013 Received LINK DIAG TEST request "
2417                                 " size:%d below the minimum size:%d\n",
2418                                 job->request_len,
2419                                 (int)(sizeof(struct fc_bsg_request) +
2420                                 sizeof(struct sli4_link_diag)));
2421                 rc = -EINVAL;
2422                 goto job_error;
2423         }
2424
2425         rc = lpfc_bsg_diag_mode_enter(phba);
2426         if (rc)
2427                 goto job_error;
2428
2429         link_diag_test_cmd = (struct sli4_link_diag *)
2430                          bsg_request->rqst_data.h_vendor.vendor_cmd;
2431
2432         rc = lpfc_sli4_bsg_set_link_diag_state(phba, 1);
2433
2434         if (rc)
2435                 goto job_error;
2436
2437         pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
2438         if (!pmboxq)
2439                 goto link_diag_test_exit;
2440
2441         req_len = (sizeof(struct lpfc_mbx_set_link_diag_state) -
2442                    sizeof(struct lpfc_sli4_cfg_mhdr));
2443         alloc_len = lpfc_sli4_config(phba, pmboxq, LPFC_MBOX_SUBSYSTEM_FCOE,
2444                                      LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_STATE,
2445                                      req_len, LPFC_SLI4_MBX_EMBED);
2446         if (alloc_len != req_len) {
2447                 rc = -ENOMEM;
2448                 goto link_diag_test_exit;
2449         }
2450
2451         run_link_diag_test = &pmboxq->u.mqe.un.link_diag_test;
2452         bf_set(lpfc_mbx_run_diag_test_link_num, &run_link_diag_test->u.req,
2453                phba->sli4_hba.lnk_info.lnk_no);
2454         bf_set(lpfc_mbx_run_diag_test_link_type, &run_link_diag_test->u.req,
2455                phba->sli4_hba.lnk_info.lnk_tp);
2456         bf_set(lpfc_mbx_run_diag_test_test_id, &run_link_diag_test->u.req,
2457                link_diag_test_cmd->test_id);
2458         bf_set(lpfc_mbx_run_diag_test_loops, &run_link_diag_test->u.req,
2459                link_diag_test_cmd->loops);
2460         bf_set(lpfc_mbx_run_diag_test_test_ver, &run_link_diag_test->u.req,
2461                link_diag_test_cmd->test_version);
2462         bf_set(lpfc_mbx_run_diag_test_err_act, &run_link_diag_test->u.req,
2463                link_diag_test_cmd->error_action);
2464
2465         mbxstatus = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
2466
2467         shdr = (union lpfc_sli4_cfg_shdr *)
2468                 &pmboxq->u.mqe.un.sli4_config.header.cfg_shdr;
2469         shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
2470         shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
2471         if (shdr_status || shdr_add_status || mbxstatus) {
2472                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
2473                                 "3010 Run link diag test mailbox failed with "
2474                                 "mbx_status x%x status x%x, add_status x%x\n",
2475                                 mbxstatus, shdr_status, shdr_add_status);
2476         }
2477
2478         diag_status_reply = (struct diag_status *)
2479                             bsg_reply->reply_data.vendor_reply.vendor_rsp;
2480
2481         if (job->reply_len < sizeof(*bsg_reply) + sizeof(*diag_status_reply)) {
2482                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2483                                 "3012 Received Run link diag test reply "
2484                                 "below minimum size (%d): reply_len:%d\n",
2485                                 (int)(sizeof(*bsg_reply) +
2486                                 sizeof(*diag_status_reply)),
2487                                 job->reply_len);
2488                 rc = -EINVAL;
2489                 goto job_error;
2490         }
2491
2492         diag_status_reply->mbox_status = mbxstatus;
2493         diag_status_reply->shdr_status = shdr_status;
2494         diag_status_reply->shdr_add_status = shdr_add_status;
2495
2496 link_diag_test_exit:
2497         rc1 = lpfc_sli4_bsg_set_link_diag_state(phba, 0);
2498
2499         if (pmboxq)
2500                 mempool_free(pmboxq, phba->mbox_mem_pool);
2501
2502         lpfc_bsg_diag_mode_exit(phba);
2503
2504 job_error:
2505         /* make error code available to userspace */
2506         if (rc1 && !rc)
2507                 rc = rc1;
2508         bsg_reply->result = rc;
2509         /* complete the job back to userspace if no error */
2510         if (rc == 0)
2511                 bsg_job_done(job, bsg_reply->result,
2512                                bsg_reply->reply_payload_rcv_len);
2513         return rc;
2514 }
2515
2516 /**
2517  * lpfcdiag_loop_self_reg - obtains a remote port login id
2518  * @phba: Pointer to HBA context object
2519  * @rpi: Pointer to a remote port login id
2520  *
2521  * This function obtains a remote port login id so the diag loopback test
2522  * can send and receive its own unsolicited CT command.
2523  **/
2524 static int lpfcdiag_loop_self_reg(struct lpfc_hba *phba, uint16_t *rpi)
2525 {
2526         LPFC_MBOXQ_t *mbox;
2527         struct lpfc_dmabuf *dmabuff;
2528         int status;
2529
2530         mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
2531         if (!mbox)
2532                 return -ENOMEM;
2533
2534         if (phba->sli_rev < LPFC_SLI_REV4)
2535                 status = lpfc_reg_rpi(phba, 0, phba->pport->fc_myDID,
2536                                 (uint8_t *)&phba->pport->fc_sparam,
2537                                 mbox, *rpi);
2538         else {
2539                 *rpi = lpfc_sli4_alloc_rpi(phba);
2540                 if (*rpi == LPFC_RPI_ALLOC_ERROR) {
2541                         mempool_free(mbox, phba->mbox_mem_pool);
2542                         return -EBUSY;
2543                 }
2544                 status = lpfc_reg_rpi(phba, phba->pport->vpi,
2545                                 phba->pport->fc_myDID,
2546                                 (uint8_t *)&phba->pport->fc_sparam,
2547                                 mbox, *rpi);
2548         }
2549
2550         if (status) {
2551                 mempool_free(mbox, phba->mbox_mem_pool);
2552                 if (phba->sli_rev == LPFC_SLI_REV4)
2553                         lpfc_sli4_free_rpi(phba, *rpi);
2554                 return -ENOMEM;
2555         }
2556
2557         dmabuff = (struct lpfc_dmabuf *)mbox->ctx_buf;
2558         mbox->ctx_buf = NULL;
2559         mbox->ctx_ndlp = NULL;
2560         status = lpfc_sli_issue_mbox_wait(phba, mbox, LPFC_MBOX_TMO);
2561
2562         if ((status != MBX_SUCCESS) || (mbox->u.mb.mbxStatus)) {
2563                 lpfc_mbuf_free(phba, dmabuff->virt, dmabuff->phys);
2564                 kfree(dmabuff);
2565                 if (status != MBX_TIMEOUT)
2566                         mempool_free(mbox, phba->mbox_mem_pool);
2567                 if (phba->sli_rev == LPFC_SLI_REV4)
2568                         lpfc_sli4_free_rpi(phba, *rpi);
2569                 return -ENODEV;
2570         }
2571
2572         if (phba->sli_rev < LPFC_SLI_REV4)
2573                 *rpi = mbox->u.mb.un.varWords[0];
2574
2575         lpfc_mbuf_free(phba, dmabuff->virt, dmabuff->phys);
2576         kfree(dmabuff);
2577         mempool_free(mbox, phba->mbox_mem_pool);
2578         return 0;
2579 }
2580
2581 /**
2582  * lpfcdiag_loop_self_unreg - unregs from the rpi
2583  * @phba: Pointer to HBA context object
2584  * @rpi: Remote port login id
2585  *
2586  * This function unregisters the rpi obtained in lpfcdiag_loop_self_reg
2587  **/
2588 static int lpfcdiag_loop_self_unreg(struct lpfc_hba *phba, uint16_t rpi)
2589 {
2590         LPFC_MBOXQ_t *mbox;
2591         int status;
2592
2593         /* Allocate mboxq structure */
2594         mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
2595         if (mbox == NULL)
2596                 return -ENOMEM;
2597
2598         if (phba->sli_rev < LPFC_SLI_REV4)
2599                 lpfc_unreg_login(phba, 0, rpi, mbox);
2600         else
2601                 lpfc_unreg_login(phba, phba->pport->vpi,
2602                                  phba->sli4_hba.rpi_ids[rpi], mbox);
2603
2604         status = lpfc_sli_issue_mbox_wait(phba, mbox, LPFC_MBOX_TMO);
2605
2606         if ((status != MBX_SUCCESS) || (mbox->u.mb.mbxStatus)) {
2607                 if (status != MBX_TIMEOUT)
2608                         mempool_free(mbox, phba->mbox_mem_pool);
2609                 return -EIO;
2610         }
2611         mempool_free(mbox, phba->mbox_mem_pool);
2612         if (phba->sli_rev == LPFC_SLI_REV4)
2613                 lpfc_sli4_free_rpi(phba, rpi);
2614         return 0;
2615 }
2616
2617 /**
2618  * lpfcdiag_loop_get_xri - obtains the transmit and receive ids
2619  * @phba: Pointer to HBA context object
2620  * @rpi: Remote port login id
2621  * @txxri: Pointer to transmit exchange id
2622  * @rxxri: Pointer to response exchabge id
2623  *
2624  * This function obtains the transmit and receive ids required to send
2625  * an unsolicited ct command with a payload. A special lpfc FsType and CmdRsp
2626  * flags are used to the unsolicted response handler is able to process
2627  * the ct command sent on the same port.
2628  **/
2629 static int lpfcdiag_loop_get_xri(struct lpfc_hba *phba, uint16_t rpi,
2630                          uint16_t *txxri, uint16_t * rxxri)
2631 {
2632         struct lpfc_bsg_event *evt;
2633         struct lpfc_iocbq *cmdiocbq, *rspiocbq;
2634         IOCB_t *cmd, *rsp;
2635         struct lpfc_dmabuf *dmabuf;
2636         struct ulp_bde64 *bpl = NULL;
2637         struct lpfc_sli_ct_request *ctreq = NULL;
2638         int ret_val = 0;
2639         int time_left;
2640         int iocb_stat = IOCB_SUCCESS;
2641         unsigned long flags;
2642
2643         *txxri = 0;
2644         *rxxri = 0;
2645         evt = lpfc_bsg_event_new(FC_REG_CT_EVENT, current->pid,
2646                                 SLI_CT_ELX_LOOPBACK);
2647         if (!evt)
2648                 return -ENOMEM;
2649
2650         spin_lock_irqsave(&phba->ct_ev_lock, flags);
2651         list_add(&evt->node, &phba->ct_ev_waiters);
2652         lpfc_bsg_event_ref(evt);
2653         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
2654
2655         cmdiocbq = lpfc_sli_get_iocbq(phba);
2656         rspiocbq = lpfc_sli_get_iocbq(phba);
2657
2658         dmabuf = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
2659         if (dmabuf) {
2660                 dmabuf->virt = lpfc_mbuf_alloc(phba, 0, &dmabuf->phys);
2661                 if (dmabuf->virt) {
2662                         INIT_LIST_HEAD(&dmabuf->list);
2663                         bpl = (struct ulp_bde64 *) dmabuf->virt;
2664                         memset(bpl, 0, sizeof(*bpl));
2665                         ctreq = (struct lpfc_sli_ct_request *)(bpl + 1);
2666                         bpl->addrHigh =
2667                                 le32_to_cpu(putPaddrHigh(dmabuf->phys +
2668                                         sizeof(*bpl)));
2669                         bpl->addrLow =
2670                                 le32_to_cpu(putPaddrLow(dmabuf->phys +
2671                                         sizeof(*bpl)));
2672                         bpl->tus.f.bdeFlags = 0;
2673                         bpl->tus.f.bdeSize = ELX_LOOPBACK_HEADER_SZ;
2674                         bpl->tus.w = le32_to_cpu(bpl->tus.w);
2675                 }
2676         }
2677
2678         if (cmdiocbq == NULL || rspiocbq == NULL ||
2679             dmabuf == NULL || bpl == NULL || ctreq == NULL ||
2680                 dmabuf->virt == NULL) {
2681                 ret_val = -ENOMEM;
2682                 goto err_get_xri_exit;
2683         }
2684
2685         cmd = &cmdiocbq->iocb;
2686         rsp = &rspiocbq->iocb;
2687
2688         memset(ctreq, 0, ELX_LOOPBACK_HEADER_SZ);
2689
2690         ctreq->RevisionId.bits.Revision = SLI_CT_REVISION;
2691         ctreq->RevisionId.bits.InId = 0;
2692         ctreq->FsType = SLI_CT_ELX_LOOPBACK;
2693         ctreq->FsSubType = 0;
2694         ctreq->CommandResponse.bits.CmdRsp = ELX_LOOPBACK_XRI_SETUP;
2695         ctreq->CommandResponse.bits.Size = 0;
2696
2697
2698         cmd->un.xseq64.bdl.addrHigh = putPaddrHigh(dmabuf->phys);
2699         cmd->un.xseq64.bdl.addrLow = putPaddrLow(dmabuf->phys);
2700         cmd->un.xseq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
2701         cmd->un.xseq64.bdl.bdeSize = sizeof(*bpl);
2702
2703         cmd->un.xseq64.w5.hcsw.Fctl = LA;
2704         cmd->un.xseq64.w5.hcsw.Dfctl = 0;
2705         cmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL;
2706         cmd->un.xseq64.w5.hcsw.Type = FC_TYPE_CT;
2707
2708         cmd->ulpCommand = CMD_XMIT_SEQUENCE64_CR;
2709         cmd->ulpBdeCount = 1;
2710         cmd->ulpLe = 1;
2711         cmd->ulpClass = CLASS3;
2712         cmd->ulpContext = rpi;
2713
2714         cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
2715         cmdiocbq->vport = phba->pport;
2716         cmdiocbq->iocb_cmpl = NULL;
2717
2718         iocb_stat = lpfc_sli_issue_iocb_wait(phba, LPFC_ELS_RING, cmdiocbq,
2719                                 rspiocbq,
2720                                 (phba->fc_ratov * 2)
2721                                 + LPFC_DRVR_TIMEOUT);
2722         if ((iocb_stat != IOCB_SUCCESS) || (rsp->ulpStatus != IOSTAT_SUCCESS)) {
2723                 ret_val = -EIO;
2724                 goto err_get_xri_exit;
2725         }
2726         *txxri =  rsp->ulpContext;
2727
2728         evt->waiting = 1;
2729         evt->wait_time_stamp = jiffies;
2730         time_left = wait_event_interruptible_timeout(
2731                 evt->wq, !list_empty(&evt->events_to_see),
2732                 msecs_to_jiffies(1000 *
2733                         ((phba->fc_ratov * 2) + LPFC_DRVR_TIMEOUT)));
2734         if (list_empty(&evt->events_to_see))
2735                 ret_val = (time_left) ? -EINTR : -ETIMEDOUT;
2736         else {
2737                 spin_lock_irqsave(&phba->ct_ev_lock, flags);
2738                 list_move(evt->events_to_see.prev, &evt->events_to_get);
2739                 spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
2740                 *rxxri = (list_entry(evt->events_to_get.prev,
2741                                      typeof(struct event_data),
2742                                      node))->immed_dat;
2743         }
2744         evt->waiting = 0;
2745
2746 err_get_xri_exit:
2747         spin_lock_irqsave(&phba->ct_ev_lock, flags);
2748         lpfc_bsg_event_unref(evt); /* release ref */
2749         lpfc_bsg_event_unref(evt); /* delete */
2750         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
2751
2752         if (dmabuf) {
2753                 if (dmabuf->virt)
2754                         lpfc_mbuf_free(phba, dmabuf->virt, dmabuf->phys);
2755                 kfree(dmabuf);
2756         }
2757
2758         if (cmdiocbq && (iocb_stat != IOCB_TIMEDOUT))
2759                 lpfc_sli_release_iocbq(phba, cmdiocbq);
2760         if (rspiocbq)
2761                 lpfc_sli_release_iocbq(phba, rspiocbq);
2762         return ret_val;
2763 }
2764
2765 /**
2766  * lpfc_bsg_dma_page_alloc - allocate a bsg mbox page sized dma buffers
2767  * @phba: Pointer to HBA context object
2768  *
2769  * This function allocates BSG_MBOX_SIZE (4KB) page size dma buffer and
2770  * returns the pointer to the buffer.
2771  **/
2772 static struct lpfc_dmabuf *
2773 lpfc_bsg_dma_page_alloc(struct lpfc_hba *phba)
2774 {
2775         struct lpfc_dmabuf *dmabuf;
2776         struct pci_dev *pcidev = phba->pcidev;
2777
2778         /* allocate dma buffer struct */
2779         dmabuf = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
2780         if (!dmabuf)
2781                 return NULL;
2782
2783         INIT_LIST_HEAD(&dmabuf->list);
2784
2785         /* now, allocate dma buffer */
2786         dmabuf->virt = dma_alloc_coherent(&pcidev->dev, BSG_MBOX_SIZE,
2787                                           &(dmabuf->phys), GFP_KERNEL);
2788
2789         if (!dmabuf->virt) {
2790                 kfree(dmabuf);
2791                 return NULL;
2792         }
2793
2794         return dmabuf;
2795 }
2796
2797 /**
2798  * lpfc_bsg_dma_page_free - free a bsg mbox page sized dma buffer
2799  * @phba: Pointer to HBA context object.
2800  * @dmabuf: Pointer to the bsg mbox page sized dma buffer descriptor.
2801  *
2802  * This routine just simply frees a dma buffer and its associated buffer
2803  * descriptor referred by @dmabuf.
2804  **/
2805 static void
2806 lpfc_bsg_dma_page_free(struct lpfc_hba *phba, struct lpfc_dmabuf *dmabuf)
2807 {
2808         struct pci_dev *pcidev = phba->pcidev;
2809
2810         if (!dmabuf)
2811                 return;
2812
2813         if (dmabuf->virt)
2814                 dma_free_coherent(&pcidev->dev, BSG_MBOX_SIZE,
2815                                   dmabuf->virt, dmabuf->phys);
2816         kfree(dmabuf);
2817         return;
2818 }
2819
2820 /**
2821  * lpfc_bsg_dma_page_list_free - free a list of bsg mbox page sized dma buffers
2822  * @phba: Pointer to HBA context object.
2823  * @dmabuf_list: Pointer to a list of bsg mbox page sized dma buffer descs.
2824  *
2825  * This routine just simply frees all dma buffers and their associated buffer
2826  * descriptors referred by @dmabuf_list.
2827  **/
2828 static void
2829 lpfc_bsg_dma_page_list_free(struct lpfc_hba *phba,
2830                             struct list_head *dmabuf_list)
2831 {
2832         struct lpfc_dmabuf *dmabuf, *next_dmabuf;
2833
2834         if (list_empty(dmabuf_list))
2835                 return;
2836
2837         list_for_each_entry_safe(dmabuf, next_dmabuf, dmabuf_list, list) {
2838                 list_del_init(&dmabuf->list);
2839                 lpfc_bsg_dma_page_free(phba, dmabuf);
2840         }
2841         return;
2842 }
2843
2844 /**
2845  * diag_cmd_data_alloc - fills in a bde struct with dma buffers
2846  * @phba: Pointer to HBA context object
2847  * @bpl: Pointer to 64 bit bde structure
2848  * @size: Number of bytes to process
2849  * @nocopydata: Flag to copy user data into the allocated buffer
2850  *
2851  * This function allocates page size buffers and populates an lpfc_dmabufext.
2852  * If allowed the user data pointed to with indataptr is copied into the kernel
2853  * memory. The chained list of page size buffers is returned.
2854  **/
2855 static struct lpfc_dmabufext *
2856 diag_cmd_data_alloc(struct lpfc_hba *phba,
2857                    struct ulp_bde64 *bpl, uint32_t size,
2858                    int nocopydata)
2859 {
2860         struct lpfc_dmabufext *mlist = NULL;
2861         struct lpfc_dmabufext *dmp;
2862         int cnt, offset = 0, i = 0;
2863         struct pci_dev *pcidev;
2864
2865         pcidev = phba->pcidev;
2866
2867         while (size) {
2868                 /* We get chunks of 4K */
2869                 if (size > BUF_SZ_4K)
2870                         cnt = BUF_SZ_4K;
2871                 else
2872                         cnt = size;
2873
2874                 /* allocate struct lpfc_dmabufext buffer header */
2875                 dmp = kmalloc(sizeof(struct lpfc_dmabufext), GFP_KERNEL);
2876                 if (!dmp)
2877                         goto out;
2878
2879                 INIT_LIST_HEAD(&dmp->dma.list);
2880
2881                 /* Queue it to a linked list */
2882                 if (mlist)
2883                         list_add_tail(&dmp->dma.list, &mlist->dma.list);
2884                 else
2885                         mlist = dmp;
2886
2887                 /* allocate buffer */
2888                 dmp->dma.virt = dma_alloc_coherent(&pcidev->dev,
2889                                                    cnt,
2890                                                    &(dmp->dma.phys),
2891                                                    GFP_KERNEL);
2892
2893                 if (!dmp->dma.virt)
2894                         goto out;
2895
2896                 dmp->size = cnt;
2897
2898                 if (nocopydata) {
2899                         bpl->tus.f.bdeFlags = 0;
2900                 } else {
2901                         memset((uint8_t *)dmp->dma.virt, 0, cnt);
2902                         bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I;
2903                 }
2904
2905                 /* build buffer ptr list for IOCB */
2906                 bpl->addrLow = le32_to_cpu(putPaddrLow(dmp->dma.phys));
2907                 bpl->addrHigh = le32_to_cpu(putPaddrHigh(dmp->dma.phys));
2908                 bpl->tus.f.bdeSize = (ushort) cnt;
2909                 bpl->tus.w = le32_to_cpu(bpl->tus.w);
2910                 bpl++;
2911
2912                 i++;
2913                 offset += cnt;
2914                 size -= cnt;
2915         }
2916
2917         if (mlist) {
2918                 mlist->flag = i;
2919                 return mlist;
2920         }
2921 out:
2922         diag_cmd_data_free(phba, mlist);
2923         return NULL;
2924 }
2925
2926 /**
2927  * lpfcdiag_loop_post_rxbufs - post the receive buffers for an unsol CT cmd
2928  * @phba: Pointer to HBA context object
2929  * @rxxri: Receive exchange id
2930  * @len: Number of data bytes
2931  *
2932  * This function allocates and posts a data buffer of sufficient size to receive
2933  * an unsolicted CT command.
2934  **/
2935 static int lpfcdiag_loop_post_rxbufs(struct lpfc_hba *phba, uint16_t rxxri,
2936                              size_t len)
2937 {
2938         struct lpfc_sli_ring *pring;
2939         struct lpfc_iocbq *cmdiocbq;
2940         IOCB_t *cmd = NULL;
2941         struct list_head head, *curr, *next;
2942         struct lpfc_dmabuf *rxbmp;
2943         struct lpfc_dmabuf *dmp;
2944         struct lpfc_dmabuf *mp[2] = {NULL, NULL};
2945         struct ulp_bde64 *rxbpl = NULL;
2946         uint32_t num_bde;
2947         struct lpfc_dmabufext *rxbuffer = NULL;
2948         int ret_val = 0;
2949         int iocb_stat;
2950         int i = 0;
2951
2952         pring = lpfc_phba_elsring(phba);
2953
2954         cmdiocbq = lpfc_sli_get_iocbq(phba);
2955         rxbmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
2956         if (rxbmp != NULL) {
2957                 rxbmp->virt = lpfc_mbuf_alloc(phba, 0, &rxbmp->phys);
2958                 if (rxbmp->virt) {
2959                         INIT_LIST_HEAD(&rxbmp->list);
2960                         rxbpl = (struct ulp_bde64 *) rxbmp->virt;
2961                         rxbuffer = diag_cmd_data_alloc(phba, rxbpl, len, 0);
2962                 }
2963         }
2964
2965         if (!cmdiocbq || !rxbmp || !rxbpl || !rxbuffer || !pring) {
2966                 ret_val = -ENOMEM;
2967                 goto err_post_rxbufs_exit;
2968         }
2969
2970         /* Queue buffers for the receive exchange */
2971         num_bde = (uint32_t)rxbuffer->flag;
2972         dmp = &rxbuffer->dma;
2973
2974         cmd = &cmdiocbq->iocb;
2975         i = 0;
2976
2977         INIT_LIST_HEAD(&head);
2978         list_add_tail(&head, &dmp->list);
2979         list_for_each_safe(curr, next, &head) {
2980                 mp[i] = list_entry(curr, struct lpfc_dmabuf, list);
2981                 list_del(curr);
2982
2983                 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
2984                         mp[i]->buffer_tag = lpfc_sli_get_buffer_tag(phba);
2985                         cmd->un.quexri64cx.buff.bde.addrHigh =
2986                                 putPaddrHigh(mp[i]->phys);
2987                         cmd->un.quexri64cx.buff.bde.addrLow =
2988                                 putPaddrLow(mp[i]->phys);
2989                         cmd->un.quexri64cx.buff.bde.tus.f.bdeSize =
2990                                 ((struct lpfc_dmabufext *)mp[i])->size;
2991                         cmd->un.quexri64cx.buff.buffer_tag = mp[i]->buffer_tag;
2992                         cmd->ulpCommand = CMD_QUE_XRI64_CX;
2993                         cmd->ulpPU = 0;
2994                         cmd->ulpLe = 1;
2995                         cmd->ulpBdeCount = 1;
2996                         cmd->unsli3.que_xri64cx_ext_words.ebde_count = 0;
2997
2998                 } else {
2999                         cmd->un.cont64[i].addrHigh = putPaddrHigh(mp[i]->phys);
3000                         cmd->un.cont64[i].addrLow = putPaddrLow(mp[i]->phys);
3001                         cmd->un.cont64[i].tus.f.bdeSize =
3002                                 ((struct lpfc_dmabufext *)mp[i])->size;
3003                         cmd->ulpBdeCount = ++i;
3004
3005                         if ((--num_bde > 0) && (i < 2))
3006                                 continue;
3007
3008                         cmd->ulpCommand = CMD_QUE_XRI_BUF64_CX;
3009                         cmd->ulpLe = 1;
3010                 }
3011
3012                 cmd->ulpClass = CLASS3;
3013                 cmd->ulpContext = rxxri;
3014
3015                 iocb_stat = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, cmdiocbq,
3016                                                 0);
3017                 if (iocb_stat == IOCB_ERROR) {
3018                         diag_cmd_data_free(phba,
3019                                 (struct lpfc_dmabufext *)mp[0]);
3020                         if (mp[1])
3021                                 diag_cmd_data_free(phba,
3022                                           (struct lpfc_dmabufext *)mp[1]);
3023                         dmp = list_entry(next, struct lpfc_dmabuf, list);
3024                         ret_val = -EIO;
3025                         goto err_post_rxbufs_exit;
3026                 }
3027
3028                 lpfc_sli_ringpostbuf_put(phba, pring, mp[0]);
3029                 if (mp[1]) {
3030                         lpfc_sli_ringpostbuf_put(phba, pring, mp[1]);
3031                         mp[1] = NULL;
3032                 }
3033
3034                 /* The iocb was freed by lpfc_sli_issue_iocb */
3035                 cmdiocbq = lpfc_sli_get_iocbq(phba);
3036                 if (!cmdiocbq) {
3037                         dmp = list_entry(next, struct lpfc_dmabuf, list);
3038                         ret_val = -EIO;
3039                         goto err_post_rxbufs_exit;
3040                 }
3041
3042                 cmd = &cmdiocbq->iocb;
3043                 i = 0;
3044         }
3045         list_del(&head);
3046
3047 err_post_rxbufs_exit:
3048
3049         if (rxbmp) {
3050                 if (rxbmp->virt)
3051                         lpfc_mbuf_free(phba, rxbmp->virt, rxbmp->phys);
3052                 kfree(rxbmp);
3053         }
3054
3055         if (cmdiocbq)
3056                 lpfc_sli_release_iocbq(phba, cmdiocbq);
3057         return ret_val;
3058 }
3059
3060 /**
3061  * lpfc_bsg_diag_loopback_run - run loopback on a port by issue ct cmd to itself
3062  * @job: LPFC_BSG_VENDOR_DIAG_TEST fc_bsg_job
3063  *
3064  * This function receives a user data buffer to be transmitted and received on
3065  * the same port, the link must be up and in loopback mode prior
3066  * to being called.
3067  * 1. A kernel buffer is allocated to copy the user data into.
3068  * 2. The port registers with "itself".
3069  * 3. The transmit and receive exchange ids are obtained.
3070  * 4. The receive exchange id is posted.
3071  * 5. A new els loopback event is created.
3072  * 6. The command and response iocbs are allocated.
3073  * 7. The cmd iocb FsType is set to elx loopback and the CmdRsp to looppback.
3074  *
3075  * This function is meant to be called n times while the port is in loopback
3076  * so it is the apps responsibility to issue a reset to take the port out
3077  * of loopback mode.
3078  **/
3079 static int
3080 lpfc_bsg_diag_loopback_run(struct bsg_job *job)
3081 {
3082         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
3083         struct fc_bsg_reply *bsg_reply = job->reply;
3084         struct lpfc_hba *phba = vport->phba;
3085         struct lpfc_bsg_event *evt;
3086         struct event_data *evdat;
3087         struct lpfc_sli *psli = &phba->sli;
3088         uint32_t size;
3089         uint32_t full_size;
3090         size_t segment_len = 0, segment_offset = 0, current_offset = 0;
3091         uint16_t rpi = 0;
3092         struct lpfc_iocbq *cmdiocbq, *rspiocbq = NULL;
3093         IOCB_t *cmd, *rsp = NULL;
3094         struct lpfc_sli_ct_request *ctreq;
3095         struct lpfc_dmabuf *txbmp;
3096         struct ulp_bde64 *txbpl = NULL;
3097         struct lpfc_dmabufext *txbuffer = NULL;
3098         struct list_head head;
3099         struct lpfc_dmabuf  *curr;
3100         uint16_t txxri = 0, rxxri;
3101         uint32_t num_bde;
3102         uint8_t *ptr = NULL, *rx_databuf = NULL;
3103         int rc = 0;
3104         int time_left;
3105         int iocb_stat = IOCB_SUCCESS;
3106         unsigned long flags;
3107         void *dataout = NULL;
3108         uint32_t total_mem;
3109
3110         /* in case no data is returned return just the return code */
3111         bsg_reply->reply_payload_rcv_len = 0;
3112
3113         if (job->request_len <
3114             sizeof(struct fc_bsg_request) + sizeof(struct diag_mode_test)) {
3115                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
3116                                 "2739 Received DIAG TEST request below minimum "
3117                                 "size\n");
3118                 rc = -EINVAL;
3119                 goto loopback_test_exit;
3120         }
3121
3122         if (job->request_payload.payload_len !=
3123                 job->reply_payload.payload_len) {
3124                 rc = -EINVAL;
3125                 goto loopback_test_exit;
3126         }
3127
3128         if ((phba->link_state == LPFC_HBA_ERROR) ||
3129             (psli->sli_flag & LPFC_BLOCK_MGMT_IO) ||
3130             (!(psli->sli_flag & LPFC_SLI_ACTIVE))) {
3131                 rc = -EACCES;
3132                 goto loopback_test_exit;
3133         }
3134
3135         if (!lpfc_is_link_up(phba) || !(phba->link_flag & LS_LOOPBACK_MODE)) {
3136                 rc = -EACCES;
3137                 goto loopback_test_exit;
3138         }
3139
3140         size = job->request_payload.payload_len;
3141         full_size = size + ELX_LOOPBACK_HEADER_SZ; /* plus the header */
3142
3143         if ((size == 0) || (size > 80 * BUF_SZ_4K)) {
3144                 rc = -ERANGE;
3145                 goto loopback_test_exit;
3146         }
3147
3148         if (full_size >= BUF_SZ_4K) {
3149                 /*
3150                  * Allocate memory for ioctl data. If buffer is bigger than 64k,
3151                  * then we allocate 64k and re-use that buffer over and over to
3152                  * xfer the whole block. This is because Linux kernel has a
3153                  * problem allocating more than 120k of kernel space memory. Saw
3154                  * problem with GET_FCPTARGETMAPPING...
3155                  */
3156                 if (size <= (64 * 1024))
3157                         total_mem = full_size;
3158                 else
3159                         total_mem = 64 * 1024;
3160         } else
3161                 /* Allocate memory for ioctl data */
3162                 total_mem = BUF_SZ_4K;
3163
3164         dataout = kmalloc(total_mem, GFP_KERNEL);
3165         if (dataout == NULL) {
3166                 rc = -ENOMEM;
3167                 goto loopback_test_exit;
3168         }
3169
3170         ptr = dataout;
3171         ptr += ELX_LOOPBACK_HEADER_SZ;
3172         sg_copy_to_buffer(job->request_payload.sg_list,
3173                                 job->request_payload.sg_cnt,
3174                                 ptr, size);
3175         rc = lpfcdiag_loop_self_reg(phba, &rpi);
3176         if (rc)
3177                 goto loopback_test_exit;
3178
3179         if (phba->sli_rev < LPFC_SLI_REV4) {
3180                 rc = lpfcdiag_loop_get_xri(phba, rpi, &txxri, &rxxri);
3181                 if (rc) {
3182                         lpfcdiag_loop_self_unreg(phba, rpi);
3183                         goto loopback_test_exit;
3184                 }
3185
3186                 rc = lpfcdiag_loop_post_rxbufs(phba, rxxri, full_size);
3187                 if (rc) {
3188                         lpfcdiag_loop_self_unreg(phba, rpi);
3189                         goto loopback_test_exit;
3190                 }
3191         }
3192         evt = lpfc_bsg_event_new(FC_REG_CT_EVENT, current->pid,
3193                                 SLI_CT_ELX_LOOPBACK);
3194         if (!evt) {
3195                 lpfcdiag_loop_self_unreg(phba, rpi);
3196                 rc = -ENOMEM;
3197                 goto loopback_test_exit;
3198         }
3199
3200         spin_lock_irqsave(&phba->ct_ev_lock, flags);
3201         list_add(&evt->node, &phba->ct_ev_waiters);
3202         lpfc_bsg_event_ref(evt);
3203         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
3204
3205         cmdiocbq = lpfc_sli_get_iocbq(phba);
3206         if (phba->sli_rev < LPFC_SLI_REV4)
3207                 rspiocbq = lpfc_sli_get_iocbq(phba);
3208         txbmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
3209
3210         if (txbmp) {
3211                 txbmp->virt = lpfc_mbuf_alloc(phba, 0, &txbmp->phys);
3212                 if (txbmp->virt) {
3213                         INIT_LIST_HEAD(&txbmp->list);
3214                         txbpl = (struct ulp_bde64 *) txbmp->virt;
3215                         txbuffer = diag_cmd_data_alloc(phba,
3216                                                         txbpl, full_size, 0);
3217                 }
3218         }
3219
3220         if (!cmdiocbq || !txbmp || !txbpl || !txbuffer || !txbmp->virt) {
3221                 rc = -ENOMEM;
3222                 goto err_loopback_test_exit;
3223         }
3224         if ((phba->sli_rev < LPFC_SLI_REV4) && !rspiocbq) {
3225                 rc = -ENOMEM;
3226                 goto err_loopback_test_exit;
3227         }
3228
3229         cmd = &cmdiocbq->iocb;
3230         if (phba->sli_rev < LPFC_SLI_REV4)
3231                 rsp = &rspiocbq->iocb;
3232
3233         INIT_LIST_HEAD(&head);
3234         list_add_tail(&head, &txbuffer->dma.list);
3235         list_for_each_entry(curr, &head, list) {
3236                 segment_len = ((struct lpfc_dmabufext *)curr)->size;
3237                 if (current_offset == 0) {
3238                         ctreq = curr->virt;
3239                         memset(ctreq, 0, ELX_LOOPBACK_HEADER_SZ);
3240                         ctreq->RevisionId.bits.Revision = SLI_CT_REVISION;
3241                         ctreq->RevisionId.bits.InId = 0;
3242                         ctreq->FsType = SLI_CT_ELX_LOOPBACK;
3243                         ctreq->FsSubType = 0;
3244                         ctreq->CommandResponse.bits.CmdRsp = ELX_LOOPBACK_DATA;
3245                         ctreq->CommandResponse.bits.Size   = size;
3246                         segment_offset = ELX_LOOPBACK_HEADER_SZ;
3247                 } else
3248                         segment_offset = 0;
3249
3250                 BUG_ON(segment_offset >= segment_len);
3251                 memcpy(curr->virt + segment_offset,
3252                         ptr + current_offset,
3253                         segment_len - segment_offset);
3254
3255                 current_offset += segment_len - segment_offset;
3256                 BUG_ON(current_offset > size);
3257         }
3258         list_del(&head);
3259
3260         /* Build the XMIT_SEQUENCE iocb */
3261         num_bde = (uint32_t)txbuffer->flag;
3262
3263         cmd->un.xseq64.bdl.addrHigh = putPaddrHigh(txbmp->phys);
3264         cmd->un.xseq64.bdl.addrLow = putPaddrLow(txbmp->phys);
3265         cmd->un.xseq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
3266         cmd->un.xseq64.bdl.bdeSize = (num_bde * sizeof(struct ulp_bde64));
3267
3268         cmd->un.xseq64.w5.hcsw.Fctl = (LS | LA);
3269         cmd->un.xseq64.w5.hcsw.Dfctl = 0;
3270         cmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL;
3271         cmd->un.xseq64.w5.hcsw.Type = FC_TYPE_CT;
3272
3273         cmd->ulpCommand = CMD_XMIT_SEQUENCE64_CX;
3274         cmd->ulpBdeCount = 1;
3275         cmd->ulpLe = 1;
3276         cmd->ulpClass = CLASS3;
3277
3278         if (phba->sli_rev < LPFC_SLI_REV4) {
3279                 cmd->ulpContext = txxri;
3280         } else {
3281                 cmd->un.xseq64.bdl.ulpIoTag32 = 0;
3282                 cmd->un.ulpWord[3] = phba->sli4_hba.rpi_ids[rpi];
3283                 cmdiocbq->context3 = txbmp;
3284                 cmdiocbq->sli4_xritag = NO_XRI;
3285                 cmd->unsli3.rcvsli3.ox_id = 0xffff;
3286         }
3287         cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
3288         cmdiocbq->iocb_flag |= LPFC_IO_LOOPBACK;
3289         cmdiocbq->vport = phba->pport;
3290         cmdiocbq->iocb_cmpl = NULL;
3291         iocb_stat = lpfc_sli_issue_iocb_wait(phba, LPFC_ELS_RING, cmdiocbq,
3292                                              rspiocbq, (phba->fc_ratov * 2) +
3293                                              LPFC_DRVR_TIMEOUT);
3294
3295         if ((iocb_stat != IOCB_SUCCESS) ||
3296             ((phba->sli_rev < LPFC_SLI_REV4) &&
3297              (rsp->ulpStatus != IOSTAT_SUCCESS))) {
3298                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3299                                 "3126 Failed loopback test issue iocb: "
3300                                 "iocb_stat:x%x\n", iocb_stat);
3301                 rc = -EIO;
3302                 goto err_loopback_test_exit;
3303         }
3304
3305         evt->waiting = 1;
3306         time_left = wait_event_interruptible_timeout(
3307                 evt->wq, !list_empty(&evt->events_to_see),
3308                 msecs_to_jiffies(1000 *
3309                         ((phba->fc_ratov * 2) + LPFC_DRVR_TIMEOUT)));
3310         evt->waiting = 0;
3311         if (list_empty(&evt->events_to_see)) {
3312                 rc = (time_left) ? -EINTR : -ETIMEDOUT;
3313                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3314                                 "3125 Not receiving unsolicited event, "
3315                                 "rc:x%x\n", rc);
3316         } else {
3317                 spin_lock_irqsave(&phba->ct_ev_lock, flags);
3318                 list_move(evt->events_to_see.prev, &evt->events_to_get);
3319                 evdat = list_entry(evt->events_to_get.prev,
3320                                    typeof(*evdat), node);
3321                 spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
3322                 rx_databuf = evdat->data;
3323                 if (evdat->len != full_size) {
3324                         lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3325                                 "1603 Loopback test did not receive expected "
3326                                 "data length. actual length 0x%x expected "
3327                                 "length 0x%x\n",
3328                                 evdat->len, full_size);
3329                         rc = -EIO;
3330                 } else if (rx_databuf == NULL)
3331                         rc = -EIO;
3332                 else {
3333                         rc = IOCB_SUCCESS;
3334                         /* skip over elx loopback header */
3335                         rx_databuf += ELX_LOOPBACK_HEADER_SZ;
3336                         bsg_reply->reply_payload_rcv_len =
3337                                 sg_copy_from_buffer(job->reply_payload.sg_list,
3338                                                     job->reply_payload.sg_cnt,
3339                                                     rx_databuf, size);
3340                         bsg_reply->reply_payload_rcv_len = size;
3341                 }
3342         }
3343
3344 err_loopback_test_exit:
3345         lpfcdiag_loop_self_unreg(phba, rpi);
3346
3347         spin_lock_irqsave(&phba->ct_ev_lock, flags);
3348         lpfc_bsg_event_unref(evt); /* release ref */
3349         lpfc_bsg_event_unref(evt); /* delete */
3350         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
3351
3352         if ((cmdiocbq != NULL) && (iocb_stat != IOCB_TIMEDOUT))
3353                 lpfc_sli_release_iocbq(phba, cmdiocbq);
3354
3355         if (rspiocbq != NULL)
3356                 lpfc_sli_release_iocbq(phba, rspiocbq);
3357
3358         if (txbmp != NULL) {
3359                 if (txbpl != NULL) {
3360                         if (txbuffer != NULL)
3361                                 diag_cmd_data_free(phba, txbuffer);
3362                         lpfc_mbuf_free(phba, txbmp->virt, txbmp->phys);
3363                 }
3364                 kfree(txbmp);
3365         }
3366
3367 loopback_test_exit:
3368         kfree(dataout);
3369         /* make error code available to userspace */
3370         bsg_reply->result = rc;
3371         job->dd_data = NULL;
3372         /* complete the job back to userspace if no error */
3373         if (rc == IOCB_SUCCESS)
3374                 bsg_job_done(job, bsg_reply->result,
3375                                bsg_reply->reply_payload_rcv_len);
3376         return rc;
3377 }
3378
3379 /**
3380  * lpfc_bsg_get_dfc_rev - process a GET_DFC_REV bsg vendor command
3381  * @job: GET_DFC_REV fc_bsg_job
3382  **/
3383 static int
3384 lpfc_bsg_get_dfc_rev(struct bsg_job *job)
3385 {
3386         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
3387         struct fc_bsg_reply *bsg_reply = job->reply;
3388         struct lpfc_hba *phba = vport->phba;
3389         struct get_mgmt_rev_reply *event_reply;
3390         int rc = 0;
3391
3392         if (job->request_len <
3393             sizeof(struct fc_bsg_request) + sizeof(struct get_mgmt_rev)) {
3394                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
3395                                 "2740 Received GET_DFC_REV request below "
3396                                 "minimum size\n");
3397                 rc = -EINVAL;
3398                 goto job_error;
3399         }
3400
3401         event_reply = (struct get_mgmt_rev_reply *)
3402                 bsg_reply->reply_data.vendor_reply.vendor_rsp;
3403
3404         if (job->reply_len < sizeof(*bsg_reply) + sizeof(*event_reply)) {
3405                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
3406                                 "2741 Received GET_DFC_REV reply below "
3407                                 "minimum size\n");
3408                 rc = -EINVAL;
3409                 goto job_error;
3410         }
3411
3412         event_reply->info.a_Major = MANAGEMENT_MAJOR_REV;
3413         event_reply->info.a_Minor = MANAGEMENT_MINOR_REV;
3414 job_error:
3415         bsg_reply->result = rc;
3416         if (rc == 0)
3417                 bsg_job_done(job, bsg_reply->result,
3418                                bsg_reply->reply_payload_rcv_len);
3419         return rc;
3420 }
3421
3422 /**
3423  * lpfc_bsg_issue_mbox_cmpl - lpfc_bsg_issue_mbox mbox completion handler
3424  * @phba: Pointer to HBA context object.
3425  * @pmboxq: Pointer to mailbox command.
3426  *
3427  * This is completion handler function for mailbox commands issued from
3428  * lpfc_bsg_issue_mbox function. This function is called by the
3429  * mailbox event handler function with no lock held. This function
3430  * will wake up thread waiting on the wait queue pointed by context1
3431  * of the mailbox.
3432  **/
3433 static void
3434 lpfc_bsg_issue_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
3435 {
3436         struct bsg_job_data *dd_data;
3437         struct fc_bsg_reply *bsg_reply;
3438         struct bsg_job *job;
3439         uint32_t size;
3440         unsigned long flags;
3441         uint8_t *pmb, *pmb_buf;
3442
3443         dd_data = pmboxq->ctx_ndlp;
3444
3445         /*
3446          * The outgoing buffer is readily referred from the dma buffer,
3447          * just need to get header part from mailboxq structure.
3448          */
3449         pmb = (uint8_t *)&pmboxq->u.mb;
3450         pmb_buf = (uint8_t *)dd_data->context_un.mbox.mb;
3451         memcpy(pmb_buf, pmb, sizeof(MAILBOX_t));
3452
3453         /* Determine if job has been aborted */
3454
3455         spin_lock_irqsave(&phba->ct_ev_lock, flags);
3456         job = dd_data->set_job;
3457         if (job) {
3458                 /* Prevent timeout handling from trying to abort job  */
3459                 job->dd_data = NULL;
3460         }
3461         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
3462
3463         /* Copy the mailbox data to the job if it is still active */
3464
3465         if (job) {
3466                 bsg_reply = job->reply;
3467                 size = job->reply_payload.payload_len;
3468                 bsg_reply->reply_payload_rcv_len =
3469                         sg_copy_from_buffer(job->reply_payload.sg_list,
3470                                             job->reply_payload.sg_cnt,
3471                                             pmb_buf, size);
3472         }
3473
3474         dd_data->set_job = NULL;
3475         mempool_free(dd_data->context_un.mbox.pmboxq, phba->mbox_mem_pool);
3476         lpfc_bsg_dma_page_free(phba, dd_data->context_un.mbox.dmabuffers);
3477         kfree(dd_data);
3478
3479         /* Complete the job if the job is still active */
3480
3481         if (job) {
3482                 bsg_reply->result = 0;
3483                 bsg_job_done(job, bsg_reply->result,
3484                                bsg_reply->reply_payload_rcv_len);
3485         }
3486         return;
3487 }
3488
3489 /**
3490  * lpfc_bsg_check_cmd_access - test for a supported mailbox command
3491  * @phba: Pointer to HBA context object.
3492  * @mb: Pointer to a mailbox object.
3493  * @vport: Pointer to a vport object.
3494  *
3495  * Some commands require the port to be offline, some may not be called from
3496  * the application.
3497  **/
3498 static int lpfc_bsg_check_cmd_access(struct lpfc_hba *phba,
3499         MAILBOX_t *mb, struct lpfc_vport *vport)
3500 {
3501         /* return negative error values for bsg job */
3502         switch (mb->mbxCommand) {
3503         /* Offline only */
3504         case MBX_INIT_LINK:
3505         case MBX_DOWN_LINK:
3506         case MBX_CONFIG_LINK:
3507         case MBX_CONFIG_RING:
3508         case MBX_RESET_RING:
3509         case MBX_UNREG_LOGIN:
3510         case MBX_CLEAR_LA:
3511         case MBX_DUMP_CONTEXT:
3512         case MBX_RUN_DIAGS:
3513         case MBX_RESTART:
3514         case MBX_SET_MASK:
3515                 if (!(vport->fc_flag & FC_OFFLINE_MODE)) {
3516                         lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
3517                                 "2743 Command 0x%x is illegal in on-line "
3518                                 "state\n",
3519                                 mb->mbxCommand);
3520                         return -EPERM;
3521                 }
3522                 break;
3523         case MBX_WRITE_NV:
3524         case MBX_WRITE_VPARMS:
3525         case MBX_LOAD_SM:
3526         case MBX_READ_NV:
3527         case MBX_READ_CONFIG:
3528         case MBX_READ_RCONFIG:
3529         case MBX_READ_STATUS:
3530         case MBX_READ_XRI:
3531         case MBX_READ_REV:
3532         case MBX_READ_LNK_STAT:
3533         case MBX_DUMP_MEMORY:
3534         case MBX_DOWN_LOAD:
3535         case MBX_UPDATE_CFG:
3536         case MBX_KILL_BOARD:
3537         case MBX_READ_TOPOLOGY:
3538         case MBX_LOAD_AREA:
3539         case MBX_LOAD_EXP_ROM:
3540         case MBX_BEACON:
3541         case MBX_DEL_LD_ENTRY:
3542         case MBX_SET_DEBUG:
3543         case MBX_WRITE_WWN:
3544         case MBX_SLI4_CONFIG:
3545         case MBX_READ_EVENT_LOG:
3546         case MBX_READ_EVENT_LOG_STATUS:
3547         case MBX_WRITE_EVENT_LOG:
3548         case MBX_PORT_CAPABILITIES:
3549         case MBX_PORT_IOV_CONTROL:
3550         case MBX_RUN_BIU_DIAG64:
3551                 break;
3552         case MBX_SET_VARIABLE:
3553                 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
3554                         "1226 mbox: set_variable 0x%x, 0x%x\n",
3555                         mb->un.varWords[0],
3556                         mb->un.varWords[1]);
3557                 if ((mb->un.varWords[0] == SETVAR_MLOMNT)
3558                         && (mb->un.varWords[1] == 1)) {
3559                         phba->wait_4_mlo_maint_flg = 1;
3560                 } else if (mb->un.varWords[0] == SETVAR_MLORST) {
3561                         spin_lock_irq(&phba->hbalock);
3562                         phba->link_flag &= ~LS_LOOPBACK_MODE;
3563                         spin_unlock_irq(&phba->hbalock);
3564                         phba->fc_topology = LPFC_TOPOLOGY_PT_PT;
3565                 }
3566                 break;
3567         case MBX_READ_SPARM64:
3568         case MBX_REG_LOGIN:
3569         case MBX_REG_LOGIN64:
3570         case MBX_CONFIG_PORT:
3571         case MBX_RUN_BIU_DIAG:
3572         default:
3573                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
3574                         "2742 Unknown Command 0x%x\n",
3575                         mb->mbxCommand);
3576                 return -EPERM;
3577         }
3578
3579         return 0; /* ok */
3580 }
3581
3582 /**
3583  * lpfc_bsg_mbox_ext_cleanup - clean up context of multi-buffer mbox session
3584  * @phba: Pointer to HBA context object.
3585  *
3586  * This is routine clean up and reset BSG handling of multi-buffer mbox
3587  * command session.
3588  **/
3589 static void
3590 lpfc_bsg_mbox_ext_session_reset(struct lpfc_hba *phba)
3591 {
3592         if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_IDLE)
3593                 return;
3594
3595         /* free all memory, including dma buffers */
3596         lpfc_bsg_dma_page_list_free(phba,
3597                                     &phba->mbox_ext_buf_ctx.ext_dmabuf_list);
3598         lpfc_bsg_dma_page_free(phba, phba->mbox_ext_buf_ctx.mbx_dmabuf);
3599         /* multi-buffer write mailbox command pass-through complete */
3600         memset((char *)&phba->mbox_ext_buf_ctx, 0,
3601                sizeof(struct lpfc_mbox_ext_buf_ctx));
3602         INIT_LIST_HEAD(&phba->mbox_ext_buf_ctx.ext_dmabuf_list);
3603
3604         return;
3605 }
3606
3607 /**
3608  * lpfc_bsg_issue_mbox_ext_handle_job - job handler for multi-buffer mbox cmpl
3609  * @phba: Pointer to HBA context object.
3610  * @pmboxq: Pointer to mailbox command.
3611  *
3612  * This is routine handles BSG job for mailbox commands completions with
3613  * multiple external buffers.
3614  **/
3615 static struct bsg_job *
3616 lpfc_bsg_issue_mbox_ext_handle_job(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
3617 {
3618         struct bsg_job_data *dd_data;
3619         struct bsg_job *job;
3620         struct fc_bsg_reply *bsg_reply;
3621         uint8_t *pmb, *pmb_buf;
3622         unsigned long flags;
3623         uint32_t size;
3624         int rc = 0;
3625         struct lpfc_dmabuf *dmabuf;
3626         struct lpfc_sli_config_mbox *sli_cfg_mbx;
3627         uint8_t *pmbx;
3628
3629         dd_data = pmboxq->ctx_buf;
3630
3631         /* Determine if job has been aborted */
3632         spin_lock_irqsave(&phba->ct_ev_lock, flags);
3633         job = dd_data->set_job;
3634         if (job) {
3635                 bsg_reply = job->reply;
3636                 /* Prevent timeout handling from trying to abort job  */
3637                 job->dd_data = NULL;
3638         }
3639         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
3640
3641         /*
3642          * The outgoing buffer is readily referred from the dma buffer,
3643          * just need to get header part from mailboxq structure.
3644          */
3645
3646         pmb = (uint8_t *)&pmboxq->u.mb;
3647         pmb_buf = (uint8_t *)dd_data->context_un.mbox.mb;
3648         /* Copy the byte swapped response mailbox back to the user */
3649         memcpy(pmb_buf, pmb, sizeof(MAILBOX_t));
3650         /* if there is any non-embedded extended data copy that too */
3651         dmabuf = phba->mbox_ext_buf_ctx.mbx_dmabuf;
3652         sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt;
3653         if (!bsg_bf_get(lpfc_mbox_hdr_emb,
3654             &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr)) {
3655                 pmbx = (uint8_t *)dmabuf->virt;
3656                 /* byte swap the extended data following the mailbox command */
3657                 lpfc_sli_pcimem_bcopy(&pmbx[sizeof(MAILBOX_t)],
3658                         &pmbx[sizeof(MAILBOX_t)],
3659                         sli_cfg_mbx->un.sli_config_emb0_subsys.mse[0].buf_len);
3660         }
3661
3662         /* Complete the job if the job is still active */
3663
3664         if (job) {
3665                 size = job->reply_payload.payload_len;
3666                 bsg_reply->reply_payload_rcv_len =
3667                         sg_copy_from_buffer(job->reply_payload.sg_list,
3668                                             job->reply_payload.sg_cnt,
3669                                             pmb_buf, size);
3670
3671                 /* result for successful */
3672                 bsg_reply->result = 0;
3673
3674                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3675                                 "2937 SLI_CONFIG ext-buffer mailbox command "
3676                                 "(x%x/x%x) complete bsg job done, bsize:%d\n",
3677                                 phba->mbox_ext_buf_ctx.nembType,
3678                                 phba->mbox_ext_buf_ctx.mboxType, size);
3679                 lpfc_idiag_mbxacc_dump_bsg_mbox(phba,
3680                                         phba->mbox_ext_buf_ctx.nembType,
3681                                         phba->mbox_ext_buf_ctx.mboxType,
3682                                         dma_ebuf, sta_pos_addr,
3683                                         phba->mbox_ext_buf_ctx.mbx_dmabuf, 0);
3684         } else {
3685                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3686                                 "2938 SLI_CONFIG ext-buffer mailbox "
3687                                 "command (x%x/x%x) failure, rc:x%x\n",
3688                                 phba->mbox_ext_buf_ctx.nembType,
3689                                 phba->mbox_ext_buf_ctx.mboxType, rc);
3690         }
3691
3692
3693         /* state change */
3694         phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_DONE;
3695         kfree(dd_data);
3696         return job;
3697 }
3698
3699 /**
3700  * lpfc_bsg_issue_read_mbox_ext_cmpl - compl handler for multi-buffer read mbox
3701  * @phba: Pointer to HBA context object.
3702  * @pmboxq: Pointer to mailbox command.
3703  *
3704  * This is completion handler function for mailbox read commands with multiple
3705  * external buffers.
3706  **/
3707 static void
3708 lpfc_bsg_issue_read_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
3709 {
3710         struct bsg_job *job;
3711         struct fc_bsg_reply *bsg_reply;
3712
3713         job = lpfc_bsg_issue_mbox_ext_handle_job(phba, pmboxq);
3714
3715         /* handle the BSG job with mailbox command */
3716         if (!job)
3717                 pmboxq->u.mb.mbxStatus = MBXERR_ERROR;
3718
3719         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3720                         "2939 SLI_CONFIG ext-buffer rd mailbox command "
3721                         "complete, ctxState:x%x, mbxStatus:x%x\n",
3722                         phba->mbox_ext_buf_ctx.state, pmboxq->u.mb.mbxStatus);
3723
3724         if (pmboxq->u.mb.mbxStatus || phba->mbox_ext_buf_ctx.numBuf == 1)
3725                 lpfc_bsg_mbox_ext_session_reset(phba);
3726
3727         /* free base driver mailbox structure memory */
3728         mempool_free(pmboxq, phba->mbox_mem_pool);
3729
3730         /* if the job is still active, call job done */
3731         if (job) {
3732                 bsg_reply = job->reply;
3733                 bsg_job_done(job, bsg_reply->result,
3734                                bsg_reply->reply_payload_rcv_len);
3735         }
3736         return;
3737 }
3738
3739 /**
3740  * lpfc_bsg_issue_write_mbox_ext_cmpl - cmpl handler for multi-buffer write mbox
3741  * @phba: Pointer to HBA context object.
3742  * @pmboxq: Pointer to mailbox command.
3743  *
3744  * This is completion handler function for mailbox write commands with multiple
3745  * external buffers.
3746  **/
3747 static void
3748 lpfc_bsg_issue_write_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
3749 {
3750         struct bsg_job *job;
3751         struct fc_bsg_reply *bsg_reply;
3752
3753         job = lpfc_bsg_issue_mbox_ext_handle_job(phba, pmboxq);
3754
3755         /* handle the BSG job with the mailbox command */
3756         if (!job)
3757                 pmboxq->u.mb.mbxStatus = MBXERR_ERROR;
3758
3759         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3760                         "2940 SLI_CONFIG ext-buffer wr mailbox command "
3761                         "complete, ctxState:x%x, mbxStatus:x%x\n",
3762                         phba->mbox_ext_buf_ctx.state, pmboxq->u.mb.mbxStatus);
3763
3764         /* free all memory, including dma buffers */
3765         mempool_free(pmboxq, phba->mbox_mem_pool);
3766         lpfc_bsg_mbox_ext_session_reset(phba);
3767
3768         /* if the job is still active, call job done */
3769         if (job) {
3770                 bsg_reply = job->reply;
3771                 bsg_job_done(job, bsg_reply->result,
3772                                bsg_reply->reply_payload_rcv_len);
3773         }
3774
3775         return;
3776 }
3777
3778 static void
3779 lpfc_bsg_sli_cfg_dma_desc_setup(struct lpfc_hba *phba, enum nemb_type nemb_tp,
3780                                 uint32_t index, struct lpfc_dmabuf *mbx_dmabuf,
3781                                 struct lpfc_dmabuf *ext_dmabuf)
3782 {
3783         struct lpfc_sli_config_mbox *sli_cfg_mbx;
3784
3785         /* pointer to the start of mailbox command */
3786         sli_cfg_mbx = (struct lpfc_sli_config_mbox *)mbx_dmabuf->virt;
3787
3788         if (nemb_tp == nemb_mse) {
3789                 if (index == 0) {
3790                         sli_cfg_mbx->un.sli_config_emb0_subsys.
3791                                 mse[index].pa_hi =
3792                                 putPaddrHigh(mbx_dmabuf->phys +
3793                                              sizeof(MAILBOX_t));
3794                         sli_cfg_mbx->un.sli_config_emb0_subsys.
3795                                 mse[index].pa_lo =
3796                                 putPaddrLow(mbx_dmabuf->phys +
3797                                             sizeof(MAILBOX_t));
3798                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3799                                         "2943 SLI_CONFIG(mse)[%d], "
3800                                         "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3801                                         index,
3802                                         sli_cfg_mbx->un.sli_config_emb0_subsys.
3803                                         mse[index].buf_len,
3804                                         sli_cfg_mbx->un.sli_config_emb0_subsys.
3805                                         mse[index].pa_hi,
3806                                         sli_cfg_mbx->un.sli_config_emb0_subsys.
3807                                         mse[index].pa_lo);
3808                 } else {
3809                         sli_cfg_mbx->un.sli_config_emb0_subsys.
3810                                 mse[index].pa_hi =
3811                                 putPaddrHigh(ext_dmabuf->phys);
3812                         sli_cfg_mbx->un.sli_config_emb0_subsys.
3813                                 mse[index].pa_lo =
3814                                 putPaddrLow(ext_dmabuf->phys);
3815                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3816                                         "2944 SLI_CONFIG(mse)[%d], "
3817                                         "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3818                                         index,
3819                                         sli_cfg_mbx->un.sli_config_emb0_subsys.
3820                                         mse[index].buf_len,
3821                                         sli_cfg_mbx->un.sli_config_emb0_subsys.
3822                                         mse[index].pa_hi,
3823                                         sli_cfg_mbx->un.sli_config_emb0_subsys.
3824                                         mse[index].pa_lo);
3825                 }
3826         } else {
3827                 if (index == 0) {
3828                         sli_cfg_mbx->un.sli_config_emb1_subsys.
3829                                 hbd[index].pa_hi =
3830                                 putPaddrHigh(mbx_dmabuf->phys +
3831                                              sizeof(MAILBOX_t));
3832                         sli_cfg_mbx->un.sli_config_emb1_subsys.
3833                                 hbd[index].pa_lo =
3834                                 putPaddrLow(mbx_dmabuf->phys +
3835                                             sizeof(MAILBOX_t));
3836                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3837                                         "3007 SLI_CONFIG(hbd)[%d], "
3838                                         "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3839                                 index,
3840                                 bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
3841                                 &sli_cfg_mbx->un.
3842                                 sli_config_emb1_subsys.hbd[index]),
3843                                 sli_cfg_mbx->un.sli_config_emb1_subsys.
3844                                 hbd[index].pa_hi,
3845                                 sli_cfg_mbx->un.sli_config_emb1_subsys.
3846                                 hbd[index].pa_lo);
3847
3848                 } else {
3849                         sli_cfg_mbx->un.sli_config_emb1_subsys.
3850                                 hbd[index].pa_hi =
3851                                 putPaddrHigh(ext_dmabuf->phys);
3852                         sli_cfg_mbx->un.sli_config_emb1_subsys.
3853                                 hbd[index].pa_lo =
3854                                 putPaddrLow(ext_dmabuf->phys);
3855                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3856                                         "3008 SLI_CONFIG(hbd)[%d], "
3857                                         "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3858                                 index,
3859                                 bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
3860                                 &sli_cfg_mbx->un.
3861                                 sli_config_emb1_subsys.hbd[index]),
3862                                 sli_cfg_mbx->un.sli_config_emb1_subsys.
3863                                 hbd[index].pa_hi,
3864                                 sli_cfg_mbx->un.sli_config_emb1_subsys.
3865                                 hbd[index].pa_lo);
3866                 }
3867         }
3868         return;
3869 }
3870
3871 /**
3872  * lpfc_bsg_sli_cfg_mse_read_cmd_ext - sli_config non-embedded mailbox cmd read
3873  * @phba: Pointer to HBA context object.
3874  * @job: Pointer to the job object.
3875  * @nemb_tp: Enumerate of non-embedded mailbox command type.
3876  * @dmabuf: Pointer to a DMA buffer descriptor.
3877  *
3878  * This routine performs SLI_CONFIG (0x9B) read mailbox command operation with
3879  * non-embedded external bufffers.
3880  **/
3881 static int
3882 lpfc_bsg_sli_cfg_read_cmd_ext(struct lpfc_hba *phba, struct bsg_job *job,
3883                               enum nemb_type nemb_tp,
3884                               struct lpfc_dmabuf *dmabuf)
3885 {
3886         struct fc_bsg_request *bsg_request = job->request;
3887         struct lpfc_sli_config_mbox *sli_cfg_mbx;
3888         struct dfc_mbox_req *mbox_req;
3889         struct lpfc_dmabuf *curr_dmabuf, *next_dmabuf;
3890         uint32_t ext_buf_cnt, ext_buf_index;
3891         struct lpfc_dmabuf *ext_dmabuf = NULL;
3892         struct bsg_job_data *dd_data = NULL;
3893         LPFC_MBOXQ_t *pmboxq = NULL;
3894         MAILBOX_t *pmb;
3895         uint8_t *pmbx;
3896         int rc, i;
3897
3898         mbox_req =
3899            (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd;
3900
3901         /* pointer to the start of mailbox command */
3902         sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt;
3903
3904         if (nemb_tp == nemb_mse) {
3905                 ext_buf_cnt = bsg_bf_get(lpfc_mbox_hdr_mse_cnt,
3906                         &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr);
3907                 if (ext_buf_cnt > LPFC_MBX_SLI_CONFIG_MAX_MSE) {
3908                         lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3909                                         "2945 Handled SLI_CONFIG(mse) rd, "
3910                                         "ext_buf_cnt(%d) out of range(%d)\n",
3911                                         ext_buf_cnt,
3912                                         LPFC_MBX_SLI_CONFIG_MAX_MSE);
3913                         rc = -ERANGE;
3914                         goto job_error;
3915                 }
3916                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3917                                 "2941 Handled SLI_CONFIG(mse) rd, "
3918                                 "ext_buf_cnt:%d\n", ext_buf_cnt);
3919         } else {
3920                 /* sanity check on interface type for support */
3921                 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
3922                     LPFC_SLI_INTF_IF_TYPE_2) {
3923                         rc = -ENODEV;
3924                         goto job_error;
3925                 }
3926                 /* nemb_tp == nemb_hbd */
3927                 ext_buf_cnt = sli_cfg_mbx->un.sli_config_emb1_subsys.hbd_count;
3928                 if (ext_buf_cnt > LPFC_MBX_SLI_CONFIG_MAX_HBD) {
3929                         lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3930                                         "2946 Handled SLI_CONFIG(hbd) rd, "
3931                                         "ext_buf_cnt(%d) out of range(%d)\n",
3932                                         ext_buf_cnt,
3933                                         LPFC_MBX_SLI_CONFIG_MAX_HBD);
3934                         rc = -ERANGE;
3935                         goto job_error;
3936                 }
3937                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3938                                 "2942 Handled SLI_CONFIG(hbd) rd, "
3939                                 "ext_buf_cnt:%d\n", ext_buf_cnt);
3940         }
3941
3942         /* before dma descriptor setup */
3943         lpfc_idiag_mbxacc_dump_bsg_mbox(phba, nemb_tp, mbox_rd, dma_mbox,
3944                                         sta_pre_addr, dmabuf, ext_buf_cnt);
3945
3946         /* reject non-embedded mailbox command with none external buffer */
3947         if (ext_buf_cnt == 0) {
3948                 rc = -EPERM;
3949                 goto job_error;
3950         } else if (ext_buf_cnt > 1) {
3951                 /* additional external read buffers */
3952                 for (i = 1; i < ext_buf_cnt; i++) {
3953                         ext_dmabuf = lpfc_bsg_dma_page_alloc(phba);
3954                         if (!ext_dmabuf) {
3955                                 rc = -ENOMEM;
3956                                 goto job_error;
3957                         }
3958                         list_add_tail(&ext_dmabuf->list,
3959                                       &phba->mbox_ext_buf_ctx.ext_dmabuf_list);
3960                 }
3961         }
3962
3963         /* bsg tracking structure */
3964         dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
3965         if (!dd_data) {
3966                 rc = -ENOMEM;
3967                 goto job_error;
3968         }
3969
3970         /* mailbox command structure for base driver */
3971         pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
3972         if (!pmboxq) {
3973                 rc = -ENOMEM;
3974                 goto job_error;
3975         }
3976         memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
3977
3978         /* for the first external buffer */
3979         lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp, 0, dmabuf, dmabuf);
3980
3981         /* for the rest of external buffer descriptors if any */
3982         if (ext_buf_cnt > 1) {
3983                 ext_buf_index = 1;
3984                 list_for_each_entry_safe(curr_dmabuf, next_dmabuf,
3985                                 &phba->mbox_ext_buf_ctx.ext_dmabuf_list, list) {
3986                         lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp,
3987                                                 ext_buf_index, dmabuf,
3988                                                 curr_dmabuf);
3989                         ext_buf_index++;
3990                 }
3991         }
3992
3993         /* after dma descriptor setup */
3994         lpfc_idiag_mbxacc_dump_bsg_mbox(phba, nemb_tp, mbox_rd, dma_mbox,
3995                                         sta_pos_addr, dmabuf, ext_buf_cnt);
3996
3997         /* construct base driver mbox command */
3998         pmb = &pmboxq->u.mb;
3999         pmbx = (uint8_t *)dmabuf->virt;
4000         memcpy(pmb, pmbx, sizeof(*pmb));
4001         pmb->mbxOwner = OWN_HOST;
4002         pmboxq->vport = phba->pport;
4003
4004         /* multi-buffer handling context */
4005         phba->mbox_ext_buf_ctx.nembType = nemb_tp;
4006         phba->mbox_ext_buf_ctx.mboxType = mbox_rd;
4007         phba->mbox_ext_buf_ctx.numBuf = ext_buf_cnt;
4008         phba->mbox_ext_buf_ctx.mbxTag = mbox_req->extMboxTag;
4009         phba->mbox_ext_buf_ctx.seqNum = mbox_req->extSeqNum;
4010         phba->mbox_ext_buf_ctx.mbx_dmabuf = dmabuf;
4011
4012         /* callback for multi-buffer read mailbox command */
4013         pmboxq->mbox_cmpl = lpfc_bsg_issue_read_mbox_ext_cmpl;
4014
4015         /* context fields to callback function */
4016         pmboxq->ctx_buf = dd_data;
4017         dd_data->type = TYPE_MBOX;
4018         dd_data->set_job = job;
4019         dd_data->context_un.mbox.pmboxq = pmboxq;
4020         dd_data->context_un.mbox.mb = (MAILBOX_t *)pmbx;
4021         job->dd_data = dd_data;
4022
4023         /* state change */
4024         phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_PORT;
4025
4026         /*
4027          * Non-embedded mailbox subcommand data gets byte swapped here because
4028          * the lower level driver code only does the first 64 mailbox words.
4029          */
4030         if ((!bsg_bf_get(lpfc_mbox_hdr_emb,
4031             &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr)) &&
4032                 (nemb_tp == nemb_mse))
4033                 lpfc_sli_pcimem_bcopy(&pmbx[sizeof(MAILBOX_t)],
4034                         &pmbx[sizeof(MAILBOX_t)],
4035                                 sli_cfg_mbx->un.sli_config_emb0_subsys.
4036                                         mse[0].buf_len);
4037
4038         rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
4039         if ((rc == MBX_SUCCESS) || (rc == MBX_BUSY)) {
4040                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4041                                 "2947 Issued SLI_CONFIG ext-buffer "
4042                                 "mailbox command, rc:x%x\n", rc);
4043                 return SLI_CONFIG_HANDLED;
4044         }
4045         lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4046                         "2948 Failed to issue SLI_CONFIG ext-buffer "
4047                         "mailbox command, rc:x%x\n", rc);
4048         rc = -EPIPE;
4049
4050 job_error:
4051         if (pmboxq)
4052                 mempool_free(pmboxq, phba->mbox_mem_pool);
4053         lpfc_bsg_dma_page_list_free(phba,
4054                                     &phba->mbox_ext_buf_ctx.ext_dmabuf_list);
4055         kfree(dd_data);
4056         phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_IDLE;
4057         return rc;
4058 }
4059
4060 /**
4061  * lpfc_bsg_sli_cfg_write_cmd_ext - sli_config non-embedded mailbox cmd write
4062  * @phba: Pointer to HBA context object.
4063  * @job: Pointer to the job object.
4064  * @nemb_tp: Enumerate of non-embedded mailbox command type.
4065  * @dmabuf: Pointer to a DMA buffer descriptor.
4066  *
4067  * This routine performs SLI_CONFIG (0x9B) write mailbox command operation with
4068  * non-embedded external bufffers.
4069  **/
4070 static int
4071 lpfc_bsg_sli_cfg_write_cmd_ext(struct lpfc_hba *phba, struct bsg_job *job,
4072                                enum nemb_type nemb_tp,
4073                                struct lpfc_dmabuf *dmabuf)
4074 {
4075         struct fc_bsg_request *bsg_request = job->request;
4076         struct fc_bsg_reply *bsg_reply = job->reply;
4077         struct dfc_mbox_req *mbox_req;
4078         struct lpfc_sli_config_mbox *sli_cfg_mbx;
4079         uint32_t ext_buf_cnt;
4080         struct bsg_job_data *dd_data = NULL;
4081         LPFC_MBOXQ_t *pmboxq = NULL;
4082         MAILBOX_t *pmb;
4083         uint8_t *mbx;
4084         int rc = SLI_CONFIG_NOT_HANDLED, i;
4085
4086         mbox_req =
4087            (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd;
4088
4089         /* pointer to the start of mailbox command */
4090         sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt;
4091
4092         if (nemb_tp == nemb_mse) {
4093                 ext_buf_cnt = bsg_bf_get(lpfc_mbox_hdr_mse_cnt,
4094                         &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr);
4095                 if (ext_buf_cnt > LPFC_MBX_SLI_CONFIG_MAX_MSE) {
4096                         lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4097                                         "2953 Failed SLI_CONFIG(mse) wr, "
4098                                         "ext_buf_cnt(%d) out of range(%d)\n",
4099                                         ext_buf_cnt,
4100                                         LPFC_MBX_SLI_CONFIG_MAX_MSE);
4101                         return -ERANGE;
4102                 }
4103                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4104                                 "2949 Handled SLI_CONFIG(mse) wr, "
4105                                 "ext_buf_cnt:%d\n", ext_buf_cnt);
4106         } else {
4107                 /* sanity check on interface type for support */
4108                 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
4109                     LPFC_SLI_INTF_IF_TYPE_2)
4110                         return -ENODEV;
4111                 /* nemb_tp == nemb_hbd */
4112                 ext_buf_cnt = sli_cfg_mbx->un.sli_config_emb1_subsys.hbd_count;
4113                 if (ext_buf_cnt > LPFC_MBX_SLI_CONFIG_MAX_HBD) {
4114                         lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4115                                         "2954 Failed SLI_CONFIG(hbd) wr, "
4116                                         "ext_buf_cnt(%d) out of range(%d)\n",
4117                                         ext_buf_cnt,
4118                                         LPFC_MBX_SLI_CONFIG_MAX_HBD);
4119                         return -ERANGE;
4120                 }
4121                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4122                                 "2950 Handled SLI_CONFIG(hbd) wr, "
4123                                 "ext_buf_cnt:%d\n", ext_buf_cnt);
4124         }
4125
4126         /* before dma buffer descriptor setup */
4127         lpfc_idiag_mbxacc_dump_bsg_mbox(phba, nemb_tp, mbox_wr, dma_mbox,
4128                                         sta_pre_addr, dmabuf, ext_buf_cnt);
4129
4130         if (ext_buf_cnt == 0)
4131                 return -EPERM;
4132
4133         /* for the first external buffer */
4134         lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp, 0, dmabuf, dmabuf);
4135
4136         /* after dma descriptor setup */
4137         lpfc_idiag_mbxacc_dump_bsg_mbox(phba, nemb_tp, mbox_wr, dma_mbox,
4138                                         sta_pos_addr, dmabuf, ext_buf_cnt);
4139
4140         /* log for looking forward */
4141         for (i = 1; i < ext_buf_cnt; i++) {
4142                 if (nemb_tp == nemb_mse)
4143                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4144                                 "2951 SLI_CONFIG(mse), buf[%d]-length:%d\n",
4145                                 i, sli_cfg_mbx->un.sli_config_emb0_subsys.
4146                                 mse[i].buf_len);
4147                 else
4148                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4149                                 "2952 SLI_CONFIG(hbd), buf[%d]-length:%d\n",
4150                                 i, bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
4151                                 &sli_cfg_mbx->un.sli_config_emb1_subsys.
4152                                 hbd[i]));
4153         }
4154
4155         /* multi-buffer handling context */
4156         phba->mbox_ext_buf_ctx.nembType = nemb_tp;
4157         phba->mbox_ext_buf_ctx.mboxType = mbox_wr;
4158         phba->mbox_ext_buf_ctx.numBuf = ext_buf_cnt;
4159         phba->mbox_ext_buf_ctx.mbxTag = mbox_req->extMboxTag;
4160         phba->mbox_ext_buf_ctx.seqNum = mbox_req->extSeqNum;
4161         phba->mbox_ext_buf_ctx.mbx_dmabuf = dmabuf;
4162
4163         if (ext_buf_cnt == 1) {
4164                 /* bsg tracking structure */
4165                 dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
4166                 if (!dd_data) {
4167                         rc = -ENOMEM;
4168                         goto job_error;
4169                 }
4170
4171                 /* mailbox command structure for base driver */
4172                 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4173                 if (!pmboxq) {
4174                         rc = -ENOMEM;
4175                         goto job_error;
4176                 }
4177                 memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
4178                 pmb = &pmboxq->u.mb;
4179                 mbx = (uint8_t *)dmabuf->virt;
4180                 memcpy(pmb, mbx, sizeof(*pmb));
4181                 pmb->mbxOwner = OWN_HOST;
4182                 pmboxq->vport = phba->pport;
4183
4184                 /* callback for multi-buffer read mailbox command */
4185                 pmboxq->mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl;
4186
4187                 /* context fields to callback function */
4188                 pmboxq->ctx_buf = dd_data;
4189                 dd_data->type = TYPE_MBOX;
4190                 dd_data->set_job = job;
4191                 dd_data->context_un.mbox.pmboxq = pmboxq;
4192                 dd_data->context_un.mbox.mb = (MAILBOX_t *)mbx;
4193                 job->dd_data = dd_data;
4194
4195                 /* state change */
4196
4197                 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_PORT;
4198                 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
4199                 if ((rc == MBX_SUCCESS) || (rc == MBX_BUSY)) {
4200                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4201                                         "2955 Issued SLI_CONFIG ext-buffer "
4202                                         "mailbox command, rc:x%x\n", rc);
4203                         return SLI_CONFIG_HANDLED;
4204                 }
4205                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4206                                 "2956 Failed to issue SLI_CONFIG ext-buffer "
4207                                 "mailbox command, rc:x%x\n", rc);
4208                 rc = -EPIPE;
4209                 goto job_error;
4210         }
4211
4212         /* wait for additoinal external buffers */
4213
4214         bsg_reply->result = 0;
4215         bsg_job_done(job, bsg_reply->result,
4216                        bsg_reply->reply_payload_rcv_len);
4217         return SLI_CONFIG_HANDLED;
4218
4219 job_error:
4220         if (pmboxq)
4221                 mempool_free(pmboxq, phba->mbox_mem_pool);
4222         kfree(dd_data);
4223
4224         return rc;
4225 }
4226
4227 /**
4228  * lpfc_bsg_handle_sli_cfg_mbox - handle sli-cfg mailbox cmd with ext buffer
4229  * @phba: Pointer to HBA context object.
4230  * @job: Pointer to the job object.
4231  * @dmabuf: Pointer to a DMA buffer descriptor.
4232  *
4233  * This routine handles SLI_CONFIG (0x9B) mailbox command with non-embedded
4234  * external bufffers, including both 0x9B with non-embedded MSEs and 0x9B
4235  * with embedded sussystem 0x1 and opcodes with external HBDs.
4236  **/
4237 static int
4238 lpfc_bsg_handle_sli_cfg_mbox(struct lpfc_hba *phba, struct bsg_job *job,
4239                              struct lpfc_dmabuf *dmabuf)
4240 {
4241         struct lpfc_sli_config_mbox *sli_cfg_mbx;
4242         uint32_t subsys;
4243         uint32_t opcode;
4244         int rc = SLI_CONFIG_NOT_HANDLED;
4245
4246         /* state change on new multi-buffer pass-through mailbox command */
4247         phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_HOST;
4248
4249         sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt;
4250
4251         if (!bsg_bf_get(lpfc_mbox_hdr_emb,
4252             &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr)) {
4253                 subsys = bsg_bf_get(lpfc_emb0_subcmnd_subsys,
4254                                     &sli_cfg_mbx->un.sli_config_emb0_subsys);
4255                 opcode = bsg_bf_get(lpfc_emb0_subcmnd_opcode,
4256                                     &sli_cfg_mbx->un.sli_config_emb0_subsys);
4257                 if (subsys == SLI_CONFIG_SUBSYS_FCOE) {
4258                         switch (opcode) {
4259                         case FCOE_OPCODE_READ_FCF:
4260                         case FCOE_OPCODE_GET_DPORT_RESULTS:
4261                                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4262                                                 "2957 Handled SLI_CONFIG "
4263                                                 "subsys_fcoe, opcode:x%x\n",
4264                                                 opcode);
4265                                 rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job,
4266                                                         nemb_mse, dmabuf);
4267                                 break;
4268                         case FCOE_OPCODE_ADD_FCF:
4269                         case FCOE_OPCODE_SET_DPORT_MODE:
4270                         case LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_STATE:
4271                                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4272                                                 "2958 Handled SLI_CONFIG "
4273                                                 "subsys_fcoe, opcode:x%x\n",
4274                                                 opcode);
4275                                 rc = lpfc_bsg_sli_cfg_write_cmd_ext(phba, job,
4276                                                         nemb_mse, dmabuf);
4277                                 break;
4278                         default:
4279                                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4280                                                 "2959 Reject SLI_CONFIG "
4281                                                 "subsys_fcoe, opcode:x%x\n",
4282                                                 opcode);
4283                                 rc = -EPERM;
4284                                 break;
4285                         }
4286                 } else if (subsys == SLI_CONFIG_SUBSYS_COMN) {
4287                         switch (opcode) {
4288                         case COMN_OPCODE_GET_CNTL_ADDL_ATTRIBUTES:
4289                         case COMN_OPCODE_GET_CNTL_ATTRIBUTES:
4290                         case COMN_OPCODE_GET_PROFILE_CONFIG:
4291                         case COMN_OPCODE_SET_FEATURES:
4292                                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4293                                                 "3106 Handled SLI_CONFIG "
4294                                                 "subsys_comn, opcode:x%x\n",
4295                                                 opcode);
4296                                 rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job,
4297                                                         nemb_mse, dmabuf);
4298                                 break;
4299                         default:
4300                                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4301                                                 "3107 Reject SLI_CONFIG "
4302                                                 "subsys_comn, opcode:x%x\n",
4303                                                 opcode);
4304                                 rc = -EPERM;
4305                                 break;
4306                         }
4307                 } else {
4308                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4309                                         "2977 Reject SLI_CONFIG "
4310                                         "subsys:x%d, opcode:x%x\n",
4311                                         subsys, opcode);
4312                         rc = -EPERM;
4313                 }
4314         } else {
4315                 subsys = bsg_bf_get(lpfc_emb1_subcmnd_subsys,
4316                                     &sli_cfg_mbx->un.sli_config_emb1_subsys);
4317                 opcode = bsg_bf_get(lpfc_emb1_subcmnd_opcode,
4318                                     &sli_cfg_mbx->un.sli_config_emb1_subsys);
4319                 if (subsys == SLI_CONFIG_SUBSYS_COMN) {
4320                         switch (opcode) {
4321                         case COMN_OPCODE_READ_OBJECT:
4322                         case COMN_OPCODE_READ_OBJECT_LIST:
4323                                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4324                                                 "2960 Handled SLI_CONFIG "
4325                                                 "subsys_comn, opcode:x%x\n",
4326                                                 opcode);
4327                                 rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job,
4328                                                         nemb_hbd, dmabuf);
4329                                 break;
4330                         case COMN_OPCODE_WRITE_OBJECT:
4331                                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4332                                                 "2961 Handled SLI_CONFIG "
4333                                                 "subsys_comn, opcode:x%x\n",
4334                                                 opcode);
4335                                 rc = lpfc_bsg_sli_cfg_write_cmd_ext(phba, job,
4336                                                         nemb_hbd, dmabuf);
4337                                 break;
4338                         default:
4339                                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4340                                                 "2962 Not handled SLI_CONFIG "
4341                                                 "subsys_comn, opcode:x%x\n",
4342                                                 opcode);
4343                                 rc = SLI_CONFIG_NOT_HANDLED;
4344                                 break;
4345                         }
4346                 } else {
4347                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4348                                         "2978 Not handled SLI_CONFIG "
4349                                         "subsys:x%d, opcode:x%x\n",
4350                                         subsys, opcode);
4351                         rc = SLI_CONFIG_NOT_HANDLED;
4352                 }
4353         }
4354
4355         /* state reset on not handled new multi-buffer mailbox command */
4356         if (rc != SLI_CONFIG_HANDLED)
4357                 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_IDLE;
4358
4359         return rc;
4360 }
4361
4362 /**
4363  * lpfc_bsg_mbox_ext_abort_req - request to abort mbox command with ext buffers
4364  * @phba: Pointer to HBA context object.
4365  *
4366  * This routine is for requesting to abort a pass-through mailbox command with
4367  * multiple external buffers due to error condition.
4368  **/
4369 static void
4370 lpfc_bsg_mbox_ext_abort(struct lpfc_hba *phba)
4371 {
4372         if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_PORT)
4373                 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_ABTS;
4374         else
4375                 lpfc_bsg_mbox_ext_session_reset(phba);
4376         return;
4377 }
4378
4379 /**
4380  * lpfc_bsg_read_ebuf_get - get the next mailbox read external buffer
4381  * @phba: Pointer to HBA context object.
4382  * @job: Pointer to the job object.
4383  *
4384  * This routine extracts the next mailbox read external buffer back to
4385  * user space through BSG.
4386  **/
4387 static int
4388 lpfc_bsg_read_ebuf_get(struct lpfc_hba *phba, struct bsg_job *job)
4389 {
4390         struct fc_bsg_reply *bsg_reply = job->reply;
4391         struct lpfc_sli_config_mbox *sli_cfg_mbx;
4392         struct lpfc_dmabuf *dmabuf;
4393         uint8_t *pbuf;
4394         uint32_t size;
4395         uint32_t index;
4396
4397         index = phba->mbox_ext_buf_ctx.seqNum;
4398         phba->mbox_ext_buf_ctx.seqNum++;
4399
4400         sli_cfg_mbx = (struct lpfc_sli_config_mbox *)
4401                         phba->mbox_ext_buf_ctx.mbx_dmabuf->virt;
4402
4403         if (phba->mbox_ext_buf_ctx.nembType == nemb_mse) {
4404                 size = bsg_bf_get(lpfc_mbox_sli_config_mse_len,
4405                         &sli_cfg_mbx->un.sli_config_emb0_subsys.mse[index]);
4406                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4407                                 "2963 SLI_CONFIG (mse) ext-buffer rd get "
4408                                 "buffer[%d], size:%d\n", index, size);
4409         } else {
4410                 size = bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
4411                         &sli_cfg_mbx->un.sli_config_emb1_subsys.hbd[index]);
4412                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4413                                 "2964 SLI_CONFIG (hbd) ext-buffer rd get "
4414                                 "buffer[%d], size:%d\n", index, size);
4415         }
4416         if (list_empty(&phba->mbox_ext_buf_ctx.ext_dmabuf_list))
4417                 return -EPIPE;
4418         dmabuf = list_first_entry(&phba->mbox_ext_buf_ctx.ext_dmabuf_list,
4419                                   struct lpfc_dmabuf, list);
4420         list_del_init(&dmabuf->list);
4421
4422         /* after dma buffer descriptor setup */
4423         lpfc_idiag_mbxacc_dump_bsg_mbox(phba, phba->mbox_ext_buf_ctx.nembType,
4424                                         mbox_rd, dma_ebuf, sta_pos_addr,
4425                                         dmabuf, index);
4426
4427         pbuf = (uint8_t *)dmabuf->virt;
4428         bsg_reply->reply_payload_rcv_len =
4429                 sg_copy_from_buffer(job->reply_payload.sg_list,
4430                                     job->reply_payload.sg_cnt,
4431                                     pbuf, size);
4432
4433         lpfc_bsg_dma_page_free(phba, dmabuf);
4434
4435         if (phba->mbox_ext_buf_ctx.seqNum == phba->mbox_ext_buf_ctx.numBuf) {
4436                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4437                                 "2965 SLI_CONFIG (hbd) ext-buffer rd mbox "
4438                                 "command session done\n");
4439                 lpfc_bsg_mbox_ext_session_reset(phba);
4440         }
4441
4442         bsg_reply->result = 0;
4443         bsg_job_done(job, bsg_reply->result,
4444                        bsg_reply->reply_payload_rcv_len);
4445
4446         return SLI_CONFIG_HANDLED;
4447 }
4448
4449 /**
4450  * lpfc_bsg_write_ebuf_set - set the next mailbox write external buffer
4451  * @phba: Pointer to HBA context object.
4452  * @job: Pointer to the job object.
4453  * @dmabuf: Pointer to a DMA buffer descriptor.
4454  *
4455  * This routine sets up the next mailbox read external buffer obtained
4456  * from user space through BSG.
4457  **/
4458 static int
4459 lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job,
4460                         struct lpfc_dmabuf *dmabuf)
4461 {
4462         struct fc_bsg_reply *bsg_reply = job->reply;
4463         struct bsg_job_data *dd_data = NULL;
4464         LPFC_MBOXQ_t *pmboxq = NULL;
4465         MAILBOX_t *pmb;
4466         enum nemb_type nemb_tp;
4467         uint8_t *pbuf;
4468         uint32_t size;
4469         uint32_t index;
4470         int rc;
4471
4472         index = phba->mbox_ext_buf_ctx.seqNum;
4473         phba->mbox_ext_buf_ctx.seqNum++;
4474         nemb_tp = phba->mbox_ext_buf_ctx.nembType;
4475
4476         pbuf = (uint8_t *)dmabuf->virt;
4477         size = job->request_payload.payload_len;
4478         sg_copy_to_buffer(job->request_payload.sg_list,
4479                           job->request_payload.sg_cnt,
4480                           pbuf, size);
4481
4482         if (phba->mbox_ext_buf_ctx.nembType == nemb_mse) {
4483                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4484                                 "2966 SLI_CONFIG (mse) ext-buffer wr set "
4485                                 "buffer[%d], size:%d\n",
4486                                 phba->mbox_ext_buf_ctx.seqNum, size);
4487
4488         } else {
4489                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4490                                 "2967 SLI_CONFIG (hbd) ext-buffer wr set "
4491                                 "buffer[%d], size:%d\n",
4492                                 phba->mbox_ext_buf_ctx.seqNum, size);
4493
4494         }
4495
4496         /* set up external buffer descriptor and add to external buffer list */
4497         lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp, index,
4498                                         phba->mbox_ext_buf_ctx.mbx_dmabuf,
4499                                         dmabuf);
4500         list_add_tail(&dmabuf->list, &phba->mbox_ext_buf_ctx.ext_dmabuf_list);
4501
4502         /* after write dma buffer */
4503         lpfc_idiag_mbxacc_dump_bsg_mbox(phba, phba->mbox_ext_buf_ctx.nembType,
4504                                         mbox_wr, dma_ebuf, sta_pos_addr,
4505                                         dmabuf, index);
4506
4507         if (phba->mbox_ext_buf_ctx.seqNum == phba->mbox_ext_buf_ctx.numBuf) {
4508                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4509                                 "2968 SLI_CONFIG ext-buffer wr all %d "
4510                                 "ebuffers received\n",
4511                                 phba->mbox_ext_buf_ctx.numBuf);
4512
4513                 dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
4514                 if (!dd_data) {
4515                         rc = -ENOMEM;
4516                         goto job_error;
4517                 }
4518
4519                 /* mailbox command structure for base driver */
4520                 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4521                 if (!pmboxq) {
4522                         rc = -ENOMEM;
4523                         goto job_error;
4524                 }
4525                 memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
4526                 pbuf = (uint8_t *)phba->mbox_ext_buf_ctx.mbx_dmabuf->virt;
4527                 pmb = &pmboxq->u.mb;
4528                 memcpy(pmb, pbuf, sizeof(*pmb));
4529                 pmb->mbxOwner = OWN_HOST;
4530                 pmboxq->vport = phba->pport;
4531
4532                 /* callback for multi-buffer write mailbox command */
4533                 pmboxq->mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl;
4534
4535                 /* context fields to callback function */
4536                 pmboxq->ctx_buf = dd_data;
4537                 dd_data->type = TYPE_MBOX;
4538                 dd_data->set_job = job;
4539                 dd_data->context_un.mbox.pmboxq = pmboxq;
4540                 dd_data->context_un.mbox.mb = (MAILBOX_t *)pbuf;
4541                 job->dd_data = dd_data;
4542
4543                 /* state change */
4544                 phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_PORT;
4545
4546                 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
4547                 if ((rc == MBX_SUCCESS) || (rc == MBX_BUSY)) {
4548                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4549                                         "2969 Issued SLI_CONFIG ext-buffer "
4550                                         "mailbox command, rc:x%x\n", rc);
4551                         return SLI_CONFIG_HANDLED;
4552                 }
4553                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4554                                 "2970 Failed to issue SLI_CONFIG ext-buffer "
4555                                 "mailbox command, rc:x%x\n", rc);
4556                 rc = -EPIPE;
4557                 goto job_error;
4558         }
4559
4560         /* wait for additoinal external buffers */
4561         bsg_reply->result = 0;
4562         bsg_job_done(job, bsg_reply->result,
4563                        bsg_reply->reply_payload_rcv_len);
4564         return SLI_CONFIG_HANDLED;
4565
4566 job_error:
4567         if (pmboxq)
4568                 mempool_free(pmboxq, phba->mbox_mem_pool);
4569         lpfc_bsg_dma_page_free(phba, dmabuf);
4570         kfree(dd_data);
4571
4572         return rc;
4573 }
4574
4575 /**
4576  * lpfc_bsg_handle_sli_cfg_ebuf - handle ext buffer with sli-cfg mailbox cmd
4577  * @phba: Pointer to HBA context object.
4578  * @job: Pointer to the job object.
4579  * @dmabuf: Pointer to a DMA buffer descriptor.
4580  *
4581  * This routine handles the external buffer with SLI_CONFIG (0x9B) mailbox
4582  * command with multiple non-embedded external buffers.
4583  **/
4584 static int
4585 lpfc_bsg_handle_sli_cfg_ebuf(struct lpfc_hba *phba, struct bsg_job *job,
4586                              struct lpfc_dmabuf *dmabuf)
4587 {
4588         int rc;
4589
4590         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4591                         "2971 SLI_CONFIG buffer (type:x%x)\n",
4592                         phba->mbox_ext_buf_ctx.mboxType);
4593
4594         if (phba->mbox_ext_buf_ctx.mboxType == mbox_rd) {
4595                 if (phba->mbox_ext_buf_ctx.state != LPFC_BSG_MBOX_DONE) {
4596                         lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4597                                         "2972 SLI_CONFIG rd buffer state "
4598                                         "mismatch:x%x\n",
4599                                         phba->mbox_ext_buf_ctx.state);
4600                         lpfc_bsg_mbox_ext_abort(phba);
4601                         return -EPIPE;
4602                 }
4603                 rc = lpfc_bsg_read_ebuf_get(phba, job);
4604                 if (rc == SLI_CONFIG_HANDLED)
4605                         lpfc_bsg_dma_page_free(phba, dmabuf);
4606         } else { /* phba->mbox_ext_buf_ctx.mboxType == mbox_wr */
4607                 if (phba->mbox_ext_buf_ctx.state != LPFC_BSG_MBOX_HOST) {
4608                         lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4609                                         "2973 SLI_CONFIG wr buffer state "
4610                                         "mismatch:x%x\n",
4611                                         phba->mbox_ext_buf_ctx.state);
4612                         lpfc_bsg_mbox_ext_abort(phba);
4613                         return -EPIPE;
4614                 }
4615                 rc = lpfc_bsg_write_ebuf_set(phba, job, dmabuf);
4616         }
4617         return rc;
4618 }
4619
4620 /**
4621  * lpfc_bsg_handle_sli_cfg_ext - handle sli-cfg mailbox with external buffer
4622  * @phba: Pointer to HBA context object.
4623  * @job: Pointer to the job object.
4624  * @dmabuf: Pointer to a DMA buffer descriptor.
4625  *
4626  * This routine checkes and handles non-embedded multi-buffer SLI_CONFIG
4627  * (0x9B) mailbox commands and external buffers.
4628  **/
4629 static int
4630 lpfc_bsg_handle_sli_cfg_ext(struct lpfc_hba *phba, struct bsg_job *job,
4631                             struct lpfc_dmabuf *dmabuf)
4632 {
4633         struct fc_bsg_request *bsg_request = job->request;
4634         struct dfc_mbox_req *mbox_req;
4635         int rc = SLI_CONFIG_NOT_HANDLED;
4636
4637         mbox_req =
4638            (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd;
4639
4640         /* mbox command with/without single external buffer */
4641         if (mbox_req->extMboxTag == 0 && mbox_req->extSeqNum == 0)
4642                 return rc;
4643
4644         /* mbox command and first external buffer */
4645         if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_IDLE) {
4646                 if (mbox_req->extSeqNum == 1) {
4647                         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4648                                         "2974 SLI_CONFIG mailbox: tag:%d, "
4649                                         "seq:%d\n", mbox_req->extMboxTag,
4650                                         mbox_req->extSeqNum);
4651                         rc = lpfc_bsg_handle_sli_cfg_mbox(phba, job, dmabuf);
4652                         return rc;
4653                 } else
4654                         goto sli_cfg_ext_error;
4655         }
4656
4657         /*
4658          * handle additional external buffers
4659          */
4660
4661         /* check broken pipe conditions */
4662         if (mbox_req->extMboxTag != phba->mbox_ext_buf_ctx.mbxTag)
4663                 goto sli_cfg_ext_error;
4664         if (mbox_req->extSeqNum > phba->mbox_ext_buf_ctx.numBuf)
4665                 goto sli_cfg_ext_error;
4666         if (mbox_req->extSeqNum != phba->mbox_ext_buf_ctx.seqNum + 1)
4667                 goto sli_cfg_ext_error;
4668
4669         lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4670                         "2975 SLI_CONFIG mailbox external buffer: "
4671                         "extSta:x%x, tag:%d, seq:%d\n",
4672                         phba->mbox_ext_buf_ctx.state, mbox_req->extMboxTag,
4673                         mbox_req->extSeqNum);
4674         rc = lpfc_bsg_handle_sli_cfg_ebuf(phba, job, dmabuf);
4675         return rc;
4676
4677 sli_cfg_ext_error:
4678         /* all other cases, broken pipe */
4679         lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4680                         "2976 SLI_CONFIG mailbox broken pipe: "
4681                         "ctxSta:x%x, ctxNumBuf:%d "
4682                         "ctxTag:%d, ctxSeq:%d, tag:%d, seq:%d\n",
4683                         phba->mbox_ext_buf_ctx.state,
4684                         phba->mbox_ext_buf_ctx.numBuf,
4685                         phba->mbox_ext_buf_ctx.mbxTag,
4686                         phba->mbox_ext_buf_ctx.seqNum,
4687                         mbox_req->extMboxTag, mbox_req->extSeqNum);
4688
4689         lpfc_bsg_mbox_ext_session_reset(phba);
4690
4691         return -EPIPE;
4692 }
4693
4694 /**
4695  * lpfc_bsg_issue_mbox - issues a mailbox command on behalf of an app
4696  * @phba: Pointer to HBA context object.
4697  * @job: Pointer to the job object.
4698  * @vport: Pointer to a vport object.
4699  *
4700  * Allocate a tracking object, mailbox command memory, get a mailbox
4701  * from the mailbox pool, copy the caller mailbox command.
4702  *
4703  * If offline and the sli is active we need to poll for the command (port is
4704  * being reset) and com-plete the job, otherwise issue the mailbox command and
4705  * let our completion handler finish the command.
4706  **/
4707 static int
4708 lpfc_bsg_issue_mbox(struct lpfc_hba *phba, struct bsg_job *job,
4709         struct lpfc_vport *vport)
4710 {
4711         struct fc_bsg_request *bsg_request = job->request;
4712         struct fc_bsg_reply *bsg_reply = job->reply;
4713         LPFC_MBOXQ_t *pmboxq = NULL; /* internal mailbox queue */
4714         MAILBOX_t *pmb; /* shortcut to the pmboxq mailbox */
4715         /* a 4k buffer to hold the mb and extended data from/to the bsg */
4716         uint8_t *pmbx = NULL;
4717         struct bsg_job_data *dd_data = NULL; /* bsg data tracking structure */
4718         struct lpfc_dmabuf *dmabuf = NULL;
4719         struct dfc_mbox_req *mbox_req;
4720         struct READ_EVENT_LOG_VAR *rdEventLog;
4721         uint32_t transmit_length, receive_length, mode;
4722         struct lpfc_mbx_sli4_config *sli4_config;
4723         struct lpfc_mbx_nembed_cmd *nembed_sge;
4724         struct ulp_bde64 *bde;
4725         uint8_t *ext = NULL;
4726         int rc = 0;
4727         uint8_t *from;
4728         uint32_t size;
4729
4730         /* in case no data is transferred */
4731         bsg_reply->reply_payload_rcv_len = 0;
4732
4733         /* sanity check to protect driver */
4734         if (job->reply_payload.payload_len > BSG_MBOX_SIZE ||
4735             job->request_payload.payload_len > BSG_MBOX_SIZE) {
4736                 rc = -ERANGE;
4737                 goto job_done;
4738         }
4739
4740         /*
4741          * Don't allow mailbox commands to be sent when blocked or when in
4742          * the middle of discovery
4743          */
4744         if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) {
4745                 rc = -EAGAIN;
4746                 goto job_done;
4747         }
4748
4749         mbox_req =
4750             (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd;
4751
4752         /* check if requested extended data lengths are valid */
4753         if ((mbox_req->inExtWLen > BSG_MBOX_SIZE/sizeof(uint32_t)) ||
4754             (mbox_req->outExtWLen > BSG_MBOX_SIZE/sizeof(uint32_t))) {
4755                 rc = -ERANGE;
4756                 goto job_done;
4757         }
4758
4759         dmabuf = lpfc_bsg_dma_page_alloc(phba);
4760         if (!dmabuf || !dmabuf->virt) {
4761                 rc = -ENOMEM;
4762                 goto job_done;
4763         }
4764
4765         /* Get the mailbox command or external buffer from BSG */
4766         pmbx = (uint8_t *)dmabuf->virt;
4767         size = job->request_payload.payload_len;
4768         sg_copy_to_buffer(job->request_payload.sg_list,
4769                           job->request_payload.sg_cnt, pmbx, size);
4770
4771         /* Handle possible SLI_CONFIG with non-embedded payloads */
4772         if (phba->sli_rev == LPFC_SLI_REV4) {
4773                 rc = lpfc_bsg_handle_sli_cfg_ext(phba, job, dmabuf);
4774                 if (rc == SLI_CONFIG_HANDLED)
4775                         goto job_cont;
4776                 if (rc)
4777                         goto job_done;
4778                 /* SLI_CONFIG_NOT_HANDLED for other mailbox commands */
4779         }
4780
4781         rc = lpfc_bsg_check_cmd_access(phba, (MAILBOX_t *)pmbx, vport);
4782         if (rc != 0)
4783                 goto job_done; /* must be negative */
4784
4785         /* allocate our bsg tracking structure */
4786         dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
4787         if (!dd_data) {
4788                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
4789                                 "2727 Failed allocation of dd_data\n");
4790                 rc = -ENOMEM;
4791                 goto job_done;
4792         }
4793
4794         pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4795         if (!pmboxq) {
4796                 rc = -ENOMEM;
4797                 goto job_done;
4798         }
4799         memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
4800
4801         pmb = &pmboxq->u.mb;
4802         memcpy(pmb, pmbx, sizeof(*pmb));
4803         pmb->mbxOwner = OWN_HOST;
4804         pmboxq->vport = vport;
4805
4806         /* If HBA encountered an error attention, allow only DUMP
4807          * or RESTART mailbox commands until the HBA is restarted.
4808          */
4809         if (phba->pport->stopped &&
4810             pmb->mbxCommand != MBX_DUMP_MEMORY &&
4811             pmb->mbxCommand != MBX_RESTART &&
4812             pmb->mbxCommand != MBX_WRITE_VPARMS &&
4813             pmb->mbxCommand != MBX_WRITE_WWN)
4814                 lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX,
4815                                 "2797 mbox: Issued mailbox cmd "
4816                                 "0x%x while in stopped state.\n",
4817                                 pmb->mbxCommand);
4818
4819         /* extended mailbox commands will need an extended buffer */
4820         if (mbox_req->inExtWLen || mbox_req->outExtWLen) {
4821                 from = pmbx;
4822                 ext = from + sizeof(MAILBOX_t);
4823                 pmboxq->ctx_buf = ext;
4824                 pmboxq->in_ext_byte_len =
4825                         mbox_req->inExtWLen * sizeof(uint32_t);
4826                 pmboxq->out_ext_byte_len =
4827                         mbox_req->outExtWLen * sizeof(uint32_t);
4828                 pmboxq->mbox_offset_word = mbox_req->mbOffset;
4829         }
4830
4831         /* biu diag will need a kernel buffer to transfer the data
4832          * allocate our own buffer and setup the mailbox command to
4833          * use ours
4834          */
4835         if (pmb->mbxCommand == MBX_RUN_BIU_DIAG64) {
4836                 transmit_length = pmb->un.varWords[1];
4837                 receive_length = pmb->un.varWords[4];
4838                 /* transmit length cannot be greater than receive length or
4839                  * mailbox extension size
4840                  */
4841                 if ((transmit_length > receive_length) ||
4842                         (transmit_length > BSG_MBOX_SIZE - sizeof(MAILBOX_t))) {
4843                         rc = -ERANGE;
4844                         goto job_done;
4845                 }
4846                 pmb->un.varBIUdiag.un.s2.xmit_bde64.addrHigh =
4847                         putPaddrHigh(dmabuf->phys + sizeof(MAILBOX_t));
4848                 pmb->un.varBIUdiag.un.s2.xmit_bde64.addrLow =
4849                         putPaddrLow(dmabuf->phys + sizeof(MAILBOX_t));
4850
4851                 pmb->un.varBIUdiag.un.s2.rcv_bde64.addrHigh =
4852                         putPaddrHigh(dmabuf->phys + sizeof(MAILBOX_t)
4853                           + pmb->un.varBIUdiag.un.s2.xmit_bde64.tus.f.bdeSize);
4854                 pmb->un.varBIUdiag.un.s2.rcv_bde64.addrLow =
4855                         putPaddrLow(dmabuf->phys + sizeof(MAILBOX_t)
4856                           + pmb->un.varBIUdiag.un.s2.xmit_bde64.tus.f.bdeSize);
4857         } else if (pmb->mbxCommand == MBX_READ_EVENT_LOG) {
4858                 rdEventLog = &pmb->un.varRdEventLog;
4859                 receive_length = rdEventLog->rcv_bde64.tus.f.bdeSize;
4860                 mode = bf_get(lpfc_event_log, rdEventLog);
4861
4862                 /* receive length cannot be greater than mailbox
4863                  * extension size
4864                  */
4865                 if (receive_length > BSG_MBOX_SIZE - sizeof(MAILBOX_t)) {
4866                         rc = -ERANGE;
4867                         goto job_done;
4868                 }
4869
4870                 /* mode zero uses a bde like biu diags command */
4871                 if (mode == 0) {
4872                         pmb->un.varWords[3] = putPaddrLow(dmabuf->phys
4873                                                         + sizeof(MAILBOX_t));
4874                         pmb->un.varWords[4] = putPaddrHigh(dmabuf->phys
4875                                                         + sizeof(MAILBOX_t));
4876                 }
4877         } else if (phba->sli_rev == LPFC_SLI_REV4) {
4878                 /* Let type 4 (well known data) through because the data is
4879                  * returned in varwords[4-8]
4880                  * otherwise check the recieve length and fetch the buffer addr
4881                  */
4882                 if ((pmb->mbxCommand == MBX_DUMP_MEMORY) &&
4883                         (pmb->un.varDmp.type != DMP_WELL_KNOWN)) {
4884                         /* rebuild the command for sli4 using our own buffers
4885                         * like we do for biu diags
4886                         */
4887                         receive_length = pmb->un.varWords[2];
4888                         /* receive length cannot be greater than mailbox
4889                          * extension size
4890                          */
4891                         if (receive_length == 0) {
4892                                 rc = -ERANGE;
4893                                 goto job_done;
4894                         }
4895                         pmb->un.varWords[3] = putPaddrLow(dmabuf->phys
4896                                                 + sizeof(MAILBOX_t));
4897                         pmb->un.varWords[4] = putPaddrHigh(dmabuf->phys
4898                                                 + sizeof(MAILBOX_t));
4899                 } else if ((pmb->mbxCommand == MBX_UPDATE_CFG) &&
4900                         pmb->un.varUpdateCfg.co) {
4901                         bde = (struct ulp_bde64 *)&pmb->un.varWords[4];
4902
4903                         /* bde size cannot be greater than mailbox ext size */
4904                         if (bde->tus.f.bdeSize >
4905                             BSG_MBOX_SIZE - sizeof(MAILBOX_t)) {
4906                                 rc = -ERANGE;
4907                                 goto job_done;
4908                         }
4909                         bde->addrHigh = putPaddrHigh(dmabuf->phys
4910                                                 + sizeof(MAILBOX_t));
4911                         bde->addrLow = putPaddrLow(dmabuf->phys
4912                                                 + sizeof(MAILBOX_t));
4913                 } else if (pmb->mbxCommand == MBX_SLI4_CONFIG) {
4914                         /* Handling non-embedded SLI_CONFIG mailbox command */
4915                         sli4_config = &pmboxq->u.mqe.un.sli4_config;
4916                         if (!bf_get(lpfc_mbox_hdr_emb,
4917                             &sli4_config->header.cfg_mhdr)) {
4918                                 /* rebuild the command for sli4 using our
4919                                  * own buffers like we do for biu diags
4920                                  */
4921                                 nembed_sge = (struct lpfc_mbx_nembed_cmd *)
4922                                                 &pmb->un.varWords[0];
4923                                 receive_length = nembed_sge->sge[0].length;
4924
4925                                 /* receive length cannot be greater than
4926                                  * mailbox extension size
4927                                  */
4928                                 if ((receive_length == 0) ||
4929                                     (receive_length >
4930                                      BSG_MBOX_SIZE - sizeof(MAILBOX_t))) {
4931                                         rc = -ERANGE;
4932                                         goto job_done;
4933                                 }
4934
4935                                 nembed_sge->sge[0].pa_hi =
4936                                                 putPaddrHigh(dmabuf->phys
4937                                                    + sizeof(MAILBOX_t));
4938                                 nembed_sge->sge[0].pa_lo =
4939                                                 putPaddrLow(dmabuf->phys
4940                                                    + sizeof(MAILBOX_t));
4941                         }
4942                 }
4943         }
4944
4945         dd_data->context_un.mbox.dmabuffers = dmabuf;
4946
4947         /* setup wake call as IOCB callback */
4948         pmboxq->mbox_cmpl = lpfc_bsg_issue_mbox_cmpl;
4949
4950         /* setup context field to pass wait_queue pointer to wake function */
4951         pmboxq->ctx_ndlp = dd_data;
4952         dd_data->type = TYPE_MBOX;
4953         dd_data->set_job = job;
4954         dd_data->context_un.mbox.pmboxq = pmboxq;
4955         dd_data->context_un.mbox.mb = (MAILBOX_t *)pmbx;
4956         dd_data->context_un.mbox.ext = ext;
4957         dd_data->context_un.mbox.mbOffset = mbox_req->mbOffset;
4958         dd_data->context_un.mbox.inExtWLen = mbox_req->inExtWLen;
4959         dd_data->context_un.mbox.outExtWLen = mbox_req->outExtWLen;
4960         job->dd_data = dd_data;
4961
4962         if ((vport->fc_flag & FC_OFFLINE_MODE) ||
4963             (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))) {
4964                 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
4965                 if (rc != MBX_SUCCESS) {
4966                         rc = (rc == MBX_TIMEOUT) ? -ETIME : -ENODEV;
4967                         goto job_done;
4968                 }
4969
4970                 /* job finished, copy the data */
4971                 memcpy(pmbx, pmb, sizeof(*pmb));
4972                 bsg_reply->reply_payload_rcv_len =
4973                         sg_copy_from_buffer(job->reply_payload.sg_list,
4974                                             job->reply_payload.sg_cnt,
4975                                             pmbx, size);
4976                 /* not waiting mbox already done */
4977                 rc = 0;
4978                 goto job_done;
4979         }
4980
4981         rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
4982         if ((rc == MBX_SUCCESS) || (rc == MBX_BUSY))
4983                 return 1; /* job started */
4984
4985 job_done:
4986         /* common exit for error or job completed inline */
4987         if (pmboxq)
4988                 mempool_free(pmboxq, phba->mbox_mem_pool);
4989         lpfc_bsg_dma_page_free(phba, dmabuf);
4990         kfree(dd_data);
4991
4992 job_cont:
4993         return rc;
4994 }
4995
4996 /**
4997  * lpfc_bsg_mbox_cmd - process an fc bsg LPFC_BSG_VENDOR_MBOX command
4998  * @job: MBOX fc_bsg_job for LPFC_BSG_VENDOR_MBOX.
4999  **/
5000 static int
5001 lpfc_bsg_mbox_cmd(struct bsg_job *job)
5002 {
5003         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
5004         struct fc_bsg_request *bsg_request = job->request;
5005         struct fc_bsg_reply *bsg_reply = job->reply;
5006         struct lpfc_hba *phba = vport->phba;
5007         struct dfc_mbox_req *mbox_req;
5008         int rc = 0;
5009
5010         /* mix-and-match backward compatibility */
5011         bsg_reply->reply_payload_rcv_len = 0;
5012         if (job->request_len <
5013             sizeof(struct fc_bsg_request) + sizeof(struct dfc_mbox_req)) {
5014                 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
5015                                 "2737 Mix-and-match backward compatibility "
5016                                 "between MBOX_REQ old size:%d and "
5017                                 "new request size:%d\n",
5018                                 (int)(job->request_len -
5019                                       sizeof(struct fc_bsg_request)),
5020                                 (int)sizeof(struct dfc_mbox_req));
5021                 mbox_req = (struct dfc_mbox_req *)
5022                                 bsg_request->rqst_data.h_vendor.vendor_cmd;
5023                 mbox_req->extMboxTag = 0;
5024                 mbox_req->extSeqNum = 0;
5025         }
5026
5027         rc = lpfc_bsg_issue_mbox(phba, job, vport);
5028
5029         if (rc == 0) {
5030                 /* job done */
5031                 bsg_reply->result = 0;
5032                 job->dd_data = NULL;
5033                 bsg_job_done(job, bsg_reply->result,
5034                                bsg_reply->reply_payload_rcv_len);
5035         } else if (rc == 1)
5036                 /* job submitted, will complete later*/
5037                 rc = 0; /* return zero, no error */
5038         else {
5039                 /* some error occurred */
5040                 bsg_reply->result = rc;
5041                 job->dd_data = NULL;
5042         }
5043
5044         return rc;
5045 }
5046
5047 /**
5048  * lpfc_bsg_menlo_cmd_cmp - lpfc_menlo_cmd completion handler
5049  * @phba: Pointer to HBA context object.
5050  * @cmdiocbq: Pointer to command iocb.
5051  * @rspiocbq: Pointer to response iocb.
5052  *
5053  * This function is the completion handler for iocbs issued using
5054  * lpfc_menlo_cmd function. This function is called by the
5055  * ring event handler function without any lock held. This function
5056  * can be called from both worker thread context and interrupt
5057  * context. This function also can be called from another thread which
5058  * cleans up the SLI layer objects.
5059  * This function copies the contents of the response iocb to the
5060  * response iocb memory object provided by the caller of
5061  * lpfc_sli_issue_iocb_wait and then wakes up the thread which
5062  * sleeps for the iocb completion.
5063  **/
5064 static void
5065 lpfc_bsg_menlo_cmd_cmp(struct lpfc_hba *phba,
5066                         struct lpfc_iocbq *cmdiocbq,
5067                         struct lpfc_iocbq *rspiocbq)
5068 {
5069         struct bsg_job_data *dd_data;
5070         struct bsg_job *job;
5071         struct fc_bsg_reply *bsg_reply;
5072         IOCB_t *rsp;
5073         struct lpfc_dmabuf *bmp, *cmp, *rmp;
5074         struct lpfc_bsg_menlo *menlo;
5075         unsigned long flags;
5076         struct menlo_response *menlo_resp;
5077         unsigned int rsp_size;
5078         int rc = 0;
5079
5080         dd_data = cmdiocbq->context1;
5081         cmp = cmdiocbq->context2;
5082         bmp = cmdiocbq->context3;
5083         menlo = &dd_data->context_un.menlo;
5084         rmp = menlo->rmp;
5085         rsp = &rspiocbq->iocb;
5086
5087         /* Determine if job has been aborted */
5088         spin_lock_irqsave(&phba->ct_ev_lock, flags);
5089         job = dd_data->set_job;
5090         if (job) {
5091                 bsg_reply = job->reply;
5092                 /* Prevent timeout handling from trying to abort job  */
5093                 job->dd_data = NULL;
5094         }
5095         spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
5096
5097         /* Copy the job data or set the failing status for the job */
5098
5099         if (job) {
5100                 /* always return the xri, this would be used in the case
5101                  * of a menlo download to allow the data to be sent as a
5102                  * continuation of the exchange.
5103                  */
5104
5105                 menlo_resp = (struct menlo_response *)
5106                         bsg_reply->reply_data.vendor_reply.vendor_rsp;
5107                 menlo_resp->xri = rsp->ulpContext;
5108                 if (rsp->ulpStatus) {
5109                         if (rsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
5110                                 switch (rsp->un.ulpWord[4] & IOERR_PARAM_MASK) {
5111                                 case IOERR_SEQUENCE_TIMEOUT:
5112                                         rc = -ETIMEDOUT;
5113                                         break;
5114                                 case IOERR_INVALID_RPI:
5115                                         rc = -EFAULT;
5116                                         break;
5117                                 default:
5118                                         rc = -EACCES;
5119                                         break;
5120                                 }
5121                         } else {
5122                                 rc = -EACCES;
5123                         }
5124                 } else {
5125                         rsp_size = rsp->un.genreq64.bdl.bdeSize;
5126                         bsg_reply->reply_payload_rcv_len =
5127                                 lpfc_bsg_copy_data(rmp, &job->reply_payload,
5128                                                    rsp_size, 0);
5129                 }
5130
5131         }
5132
5133         lpfc_sli_release_iocbq(phba, cmdiocbq);
5134         lpfc_free_bsg_buffers(phba, cmp);
5135         lpfc_free_bsg_buffers(phba, rmp);
5136         lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
5137         kfree(bmp);
5138         kfree(dd_data);
5139
5140         /* Complete the job if active */
5141
5142         if (job) {
5143                 bsg_reply->result = rc;
5144                 bsg_job_done(job, bsg_reply->result,
5145                                bsg_reply->reply_payload_rcv_len);
5146         }
5147
5148         return;
5149 }
5150
5151 /**
5152  * lpfc_menlo_cmd - send an ioctl for menlo hardware
5153  * @job: fc_bsg_job to handle
5154  *
5155  * This function issues a gen request 64 CR ioctl for all menlo cmd requests,
5156  * all the command completions will return the xri for the command.
5157  * For menlo data requests a gen request 64 CX is used to continue the exchange
5158  * supplied in the menlo request header xri field.
5159  **/
5160 static int
5161 lpfc_menlo_cmd(struct bsg_job *job)
5162 {
5163         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
5164         struct fc_bsg_request *bsg_request = job->request;
5165         struct fc_bsg_reply *bsg_reply = job->reply;
5166         struct lpfc_hba *phba = vport->phba;
5167         struct lpfc_iocbq *cmdiocbq;
5168         IOCB_t *cmd;
5169         int rc = 0;
5170         struct menlo_command *menlo_cmd;
5171         struct lpfc_dmabuf *bmp = NULL, *cmp = NULL, *rmp = NULL;
5172         int request_nseg;
5173         int reply_nseg;
5174         struct bsg_job_data *dd_data;
5175         struct ulp_bde64 *bpl = NULL;
5176
5177         /* in case no data is returned return just the return code */
5178         bsg_reply->reply_payload_rcv_len = 0;
5179
5180         if (job->request_len <
5181             sizeof(struct fc_bsg_request) +
5182                 sizeof(struct menlo_command)) {
5183                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5184                                 "2784 Received MENLO_CMD request below "
5185                                 "minimum size\n");
5186                 rc = -ERANGE;
5187                 goto no_dd_data;
5188         }
5189
5190         if (job->reply_len < sizeof(*bsg_reply) +
5191                                 sizeof(struct menlo_response)) {
5192                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5193                                 "2785 Received MENLO_CMD reply below "
5194                                 "minimum size\n");
5195                 rc = -ERANGE;
5196                 goto no_dd_data;
5197         }
5198
5199         if (!(phba->menlo_flag & HBA_MENLO_SUPPORT)) {
5200                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5201                                 "2786 Adapter does not support menlo "
5202                                 "commands\n");
5203                 rc = -EPERM;
5204                 goto no_dd_data;
5205         }
5206
5207         menlo_cmd = (struct menlo_command *)
5208                 bsg_request->rqst_data.h_vendor.vendor_cmd;
5209
5210         /* allocate our bsg tracking structure */
5211         dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
5212         if (!dd_data) {
5213                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5214                                 "2787 Failed allocation of dd_data\n");
5215                 rc = -ENOMEM;
5216                 goto no_dd_data;
5217         }
5218
5219         bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
5220         if (!bmp) {
5221                 rc = -ENOMEM;
5222                 goto free_dd;
5223         }
5224
5225         bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys);
5226         if (!bmp->virt) {
5227                 rc = -ENOMEM;
5228                 goto free_bmp;
5229         }
5230
5231         INIT_LIST_HEAD(&bmp->list);
5232
5233         bpl = (struct ulp_bde64 *)bmp->virt;
5234         request_nseg = LPFC_BPL_SIZE/sizeof(struct ulp_bde64);
5235         cmp = lpfc_alloc_bsg_buffers(phba, job->request_payload.payload_len,
5236                                      1, bpl, &request_nseg);
5237         if (!cmp) {
5238                 rc = -ENOMEM;
5239                 goto free_bmp;
5240         }
5241         lpfc_bsg_copy_data(cmp, &job->request_payload,
5242                            job->request_payload.payload_len, 1);
5243
5244         bpl += request_nseg;
5245         reply_nseg = LPFC_BPL_SIZE/sizeof(struct ulp_bde64) - request_nseg;
5246         rmp = lpfc_alloc_bsg_buffers(phba, job->reply_payload.payload_len, 0,
5247                                      bpl, &reply_nseg);
5248         if (!rmp) {
5249                 rc = -ENOMEM;
5250                 goto free_cmp;
5251         }
5252
5253         cmdiocbq = lpfc_sli_get_iocbq(phba);
5254         if (!cmdiocbq) {
5255                 rc = -ENOMEM;
5256                 goto free_rmp;
5257         }
5258
5259         cmd = &cmdiocbq->iocb;
5260         cmd->un.genreq64.bdl.ulpIoTag32 = 0;
5261         cmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys);
5262         cmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys);
5263         cmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
5264         cmd->un.genreq64.bdl.bdeSize =
5265             (request_nseg + reply_nseg) * sizeof(struct ulp_bde64);
5266         cmd->un.genreq64.w5.hcsw.Fctl = (SI | LA);
5267         cmd->un.genreq64.w5.hcsw.Dfctl = 0;
5268         cmd->un.genreq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CMD;
5269         cmd->un.genreq64.w5.hcsw.Type = MENLO_TRANSPORT_TYPE; /* 0xfe */
5270         cmd->ulpBdeCount = 1;
5271         cmd->ulpClass = CLASS3;
5272         cmd->ulpOwner = OWN_CHIP;
5273         cmd->ulpLe = 1; /* Limited Edition */
5274         cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
5275         cmdiocbq->vport = phba->pport;
5276         /* We want the firmware to timeout before we do */
5277         cmd->ulpTimeout = MENLO_TIMEOUT - 5;
5278         cmdiocbq->iocb_cmpl = lpfc_bsg_menlo_cmd_cmp;
5279         cmdiocbq->context1 = dd_data;
5280         cmdiocbq->context2 = cmp;
5281         cmdiocbq->context3 = bmp;
5282         if (menlo_cmd->cmd == LPFC_BSG_VENDOR_MENLO_CMD) {
5283                 cmd->ulpCommand = CMD_GEN_REQUEST64_CR;
5284                 cmd->ulpPU = MENLO_PU; /* 3 */
5285                 cmd->un.ulpWord[4] = MENLO_DID; /* 0x0000FC0E */
5286                 cmd->ulpContext = MENLO_CONTEXT; /* 0 */
5287         } else {
5288                 cmd->ulpCommand = CMD_GEN_REQUEST64_CX;
5289                 cmd->ulpPU = 1;
5290                 cmd->un.ulpWord[4] = 0;
5291                 cmd->ulpContext = menlo_cmd->xri;
5292         }
5293
5294         dd_data->type = TYPE_MENLO;
5295         dd_data->set_job = job;
5296         dd_data->context_un.menlo.cmdiocbq = cmdiocbq;
5297         dd_data->context_un.menlo.rmp = rmp;
5298         job->dd_data = dd_data;
5299
5300         rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, cmdiocbq,
5301                 MENLO_TIMEOUT - 5);
5302         if (rc == IOCB_SUCCESS)
5303                 return 0; /* done for now */
5304
5305         lpfc_sli_release_iocbq(phba, cmdiocbq);
5306
5307 free_rmp:
5308         lpfc_free_bsg_buffers(phba, rmp);
5309 free_cmp:
5310         lpfc_free_bsg_buffers(phba, cmp);
5311 free_bmp:
5312         if (bmp->virt)
5313                 lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
5314         kfree(bmp);
5315 free_dd:
5316         kfree(dd_data);
5317 no_dd_data:
5318         /* make error code available to userspace */
5319         bsg_reply->result = rc;
5320         job->dd_data = NULL;
5321         return rc;
5322 }
5323
5324 static int
5325 lpfc_forced_link_speed(struct bsg_job *job)
5326 {
5327         struct Scsi_Host *shost = fc_bsg_to_shost(job);
5328         struct lpfc_vport *vport = shost_priv(shost);
5329         struct lpfc_hba *phba = vport->phba;
5330         struct fc_bsg_reply *bsg_reply = job->reply;
5331         struct forced_link_speed_support_reply *forced_reply;
5332         int rc = 0;
5333
5334         if (job->request_len <
5335             sizeof(struct fc_bsg_request) +
5336             sizeof(struct get_forced_link_speed_support)) {
5337                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5338                                 "0048 Received FORCED_LINK_SPEED request "
5339                                 "below minimum size\n");
5340                 rc = -EINVAL;
5341                 goto job_error;
5342         }
5343
5344         forced_reply = (struct forced_link_speed_support_reply *)
5345                 bsg_reply->reply_data.vendor_reply.vendor_rsp;
5346
5347         if (job->reply_len < sizeof(*bsg_reply) + sizeof(*forced_reply)) {
5348                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5349                                 "0049 Received FORCED_LINK_SPEED reply below "
5350                                 "minimum size\n");
5351                 rc = -EINVAL;
5352                 goto job_error;
5353         }
5354
5355         forced_reply->supported = (phba->hba_flag & HBA_FORCED_LINK_SPEED)
5356                                    ? LPFC_FORCED_LINK_SPEED_SUPPORTED
5357                                    : LPFC_FORCED_LINK_SPEED_NOT_SUPPORTED;
5358 job_error:
5359         bsg_reply->result = rc;
5360         if (rc == 0)
5361                 bsg_job_done(job, bsg_reply->result,
5362                                bsg_reply->reply_payload_rcv_len);
5363         return rc;
5364 }
5365
5366 /**
5367  * lpfc_check_fwlog_support: Check FW log support on the adapter
5368  * @phba: Pointer to HBA context object.
5369  *
5370  * Check if FW Logging support by the adapter
5371  **/
5372 int
5373 lpfc_check_fwlog_support(struct lpfc_hba *phba)
5374 {
5375         struct lpfc_ras_fwlog *ras_fwlog = NULL;
5376
5377         ras_fwlog = &phba->ras_fwlog;
5378
5379         if (ras_fwlog->ras_hwsupport == false)
5380                 return -EACCES;
5381         else if (ras_fwlog->ras_enabled == false)
5382                 return -EPERM;
5383         else
5384                 return 0;
5385 }
5386
5387 /**
5388  * lpfc_bsg_get_ras_config: Get RAS configuration settings
5389  * @job: fc_bsg_job to handle
5390  *
5391  * Get RAS configuration values set.
5392  **/
5393 static int
5394 lpfc_bsg_get_ras_config(struct bsg_job *job)
5395 {
5396         struct Scsi_Host *shost = fc_bsg_to_shost(job);
5397         struct lpfc_vport *vport = shost_priv(shost);
5398         struct fc_bsg_reply *bsg_reply = job->reply;
5399         struct lpfc_hba *phba = vport->phba;
5400         struct lpfc_bsg_get_ras_config_reply *ras_reply;
5401         struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog;
5402         int rc = 0;
5403
5404         if (job->request_len <
5405             sizeof(struct fc_bsg_request) +
5406             sizeof(struct lpfc_bsg_ras_req)) {
5407                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5408                                 "6192 FW_LOG request received "
5409                                 "below minimum size\n");
5410                 rc = -EINVAL;
5411                 goto ras_job_error;
5412         }
5413
5414         /* Check FW log status */
5415         rc = lpfc_check_fwlog_support(phba);
5416         if (rc)
5417                 goto ras_job_error;
5418
5419         ras_reply = (struct lpfc_bsg_get_ras_config_reply *)
5420                 bsg_reply->reply_data.vendor_reply.vendor_rsp;
5421
5422         /* Current logging state */
5423         spin_lock_irq(&phba->hbalock);
5424         if (ras_fwlog->state == ACTIVE)
5425                 ras_reply->state = LPFC_RASLOG_STATE_RUNNING;
5426         else
5427                 ras_reply->state = LPFC_RASLOG_STATE_STOPPED;
5428         spin_unlock_irq(&phba->hbalock);
5429
5430         ras_reply->log_level = phba->ras_fwlog.fw_loglevel;
5431         ras_reply->log_buff_sz = phba->cfg_ras_fwlog_buffsize;
5432
5433 ras_job_error:
5434         /* make error code available to userspace */
5435         bsg_reply->result = rc;
5436
5437         /* complete the job back to userspace */
5438         if (!rc)
5439                 bsg_job_done(job, bsg_reply->result,
5440                              bsg_reply->reply_payload_rcv_len);
5441         return rc;
5442 }
5443
5444 /**
5445  * lpfc_bsg_set_ras_config: Set FW logging parameters
5446  * @job: fc_bsg_job to handle
5447  *
5448  * Set log-level parameters for FW-logging in host memory
5449  **/
5450 static int
5451 lpfc_bsg_set_ras_config(struct bsg_job *job)
5452 {
5453         struct Scsi_Host *shost = fc_bsg_to_shost(job);
5454         struct lpfc_vport *vport = shost_priv(shost);
5455         struct lpfc_hba *phba = vport->phba;
5456         struct lpfc_bsg_set_ras_config_req *ras_req;
5457         struct fc_bsg_request *bsg_request = job->request;
5458         struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog;
5459         struct fc_bsg_reply *bsg_reply = job->reply;
5460         uint8_t action = 0, log_level = 0;
5461         int rc = 0, action_status = 0;
5462
5463         if (job->request_len <
5464             sizeof(struct fc_bsg_request) +
5465             sizeof(struct lpfc_bsg_set_ras_config_req)) {
5466                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5467                                 "6182 Received RAS_LOG request "
5468                                 "below minimum size\n");
5469                 rc = -EINVAL;
5470                 goto ras_job_error;
5471         }
5472
5473         /* Check FW log status */
5474         rc = lpfc_check_fwlog_support(phba);
5475         if (rc)
5476                 goto ras_job_error;
5477
5478         ras_req = (struct lpfc_bsg_set_ras_config_req *)
5479                 bsg_request->rqst_data.h_vendor.vendor_cmd;
5480         action = ras_req->action;
5481         log_level = ras_req->log_level;
5482
5483         if (action == LPFC_RASACTION_STOP_LOGGING) {
5484                 /* Check if already disabled */
5485                 spin_lock_irq(&phba->hbalock);
5486                 if (ras_fwlog->state != ACTIVE) {
5487                         spin_unlock_irq(&phba->hbalock);
5488                         rc = -ESRCH;
5489                         goto ras_job_error;
5490                 }
5491                 spin_unlock_irq(&phba->hbalock);
5492
5493                 /* Disable logging */
5494                 lpfc_ras_stop_fwlog(phba);
5495         } else {
5496                 /*action = LPFC_RASACTION_START_LOGGING*/
5497
5498                 /* Even though FW-logging is active re-initialize
5499                  * FW-logging with new log-level. Return status
5500                  * "Logging already Running" to caller.
5501                  **/
5502                 spin_lock_irq(&phba->hbalock);
5503                 if (ras_fwlog->state != INACTIVE)
5504                         action_status = -EINPROGRESS;
5505                 spin_unlock_irq(&phba->hbalock);
5506
5507                 /* Enable logging */
5508                 rc = lpfc_sli4_ras_fwlog_init(phba, log_level,
5509                                               LPFC_RAS_ENABLE_LOGGING);
5510                 if (rc) {
5511                         rc = -EINVAL;
5512                         goto ras_job_error;
5513                 }
5514
5515                 /* Check if FW-logging is re-initialized */
5516                 if (action_status == -EINPROGRESS)
5517                         rc = action_status;
5518         }
5519 ras_job_error:
5520         /* make error code available to userspace */
5521         bsg_reply->result = rc;
5522
5523         /* complete the job back to userspace */
5524         if (!rc)
5525                 bsg_job_done(job, bsg_reply->result,
5526                              bsg_reply->reply_payload_rcv_len);
5527
5528         return rc;
5529 }
5530
5531 /**
5532  * lpfc_bsg_get_ras_lwpd: Get log write position data
5533  * @job: fc_bsg_job to handle
5534  *
5535  * Get Offset/Wrap count of the log message written
5536  * in host memory
5537  **/
5538 static int
5539 lpfc_bsg_get_ras_lwpd(struct bsg_job *job)
5540 {
5541         struct Scsi_Host *shost = fc_bsg_to_shost(job);
5542         struct lpfc_vport *vport = shost_priv(shost);
5543         struct lpfc_bsg_get_ras_lwpd *ras_reply;
5544         struct lpfc_hba *phba = vport->phba;
5545         struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog;
5546         struct fc_bsg_reply *bsg_reply = job->reply;
5547         u32 *lwpd_ptr = NULL;
5548         int rc = 0;
5549
5550         rc = lpfc_check_fwlog_support(phba);
5551         if (rc)
5552                 goto ras_job_error;
5553
5554         if (job->request_len <
5555             sizeof(struct fc_bsg_request) +
5556             sizeof(struct lpfc_bsg_ras_req)) {
5557                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5558                                 "6183 Received RAS_LOG request "
5559                                 "below minimum size\n");
5560                 rc = -EINVAL;
5561                 goto ras_job_error;
5562         }
5563
5564         ras_reply = (struct lpfc_bsg_get_ras_lwpd *)
5565                 bsg_reply->reply_data.vendor_reply.vendor_rsp;
5566
5567         if (!ras_fwlog->lwpd.virt) {
5568                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5569                                 "6193 Restart FW Logging\n");
5570                 rc = -EINVAL;
5571                 goto ras_job_error;
5572         }
5573
5574         /* Get lwpd offset */
5575         lwpd_ptr = (uint32_t *)(ras_fwlog->lwpd.virt);
5576         ras_reply->offset = be32_to_cpu(*lwpd_ptr & 0xffffffff);
5577
5578         /* Get wrap count */
5579         ras_reply->wrap_count = be32_to_cpu(*(++lwpd_ptr) & 0xffffffff);
5580
5581 ras_job_error:
5582         /* make error code available to userspace */
5583         bsg_reply->result = rc;
5584
5585         /* complete the job back to userspace */
5586         if (!rc)
5587                 bsg_job_done(job, bsg_reply->result,
5588                              bsg_reply->reply_payload_rcv_len);
5589
5590         return rc;
5591 }
5592
5593 /**
5594  * lpfc_bsg_get_ras_fwlog: Read FW log
5595  * @job: fc_bsg_job to handle
5596  *
5597  * Copy the FW log into the passed buffer.
5598  **/
5599 static int
5600 lpfc_bsg_get_ras_fwlog(struct bsg_job *job)
5601 {
5602         struct Scsi_Host *shost = fc_bsg_to_shost(job);
5603         struct lpfc_vport *vport = shost_priv(shost);
5604         struct lpfc_hba *phba = vport->phba;
5605         struct fc_bsg_request *bsg_request = job->request;
5606         struct fc_bsg_reply *bsg_reply = job->reply;
5607         struct lpfc_bsg_get_fwlog_req *ras_req;
5608         u32 rd_offset, rd_index, offset;
5609         void *src, *fwlog_buff;
5610         struct lpfc_ras_fwlog *ras_fwlog = NULL;
5611         struct lpfc_dmabuf *dmabuf, *next;
5612         int rc = 0;
5613
5614         ras_fwlog = &phba->ras_fwlog;
5615
5616         rc = lpfc_check_fwlog_support(phba);
5617         if (rc)
5618                 goto ras_job_error;
5619
5620         /* Logging to be stopped before reading */
5621         spin_lock_irq(&phba->hbalock);
5622         if (ras_fwlog->state == ACTIVE) {
5623                 spin_unlock_irq(&phba->hbalock);
5624                 rc = -EINPROGRESS;
5625                 goto ras_job_error;
5626         }
5627         spin_unlock_irq(&phba->hbalock);
5628
5629         if (job->request_len <
5630             sizeof(struct fc_bsg_request) +
5631             sizeof(struct lpfc_bsg_get_fwlog_req)) {
5632                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5633                                 "6184 Received RAS_LOG request "
5634                                 "below minimum size\n");
5635                 rc = -EINVAL;
5636                 goto ras_job_error;
5637         }
5638
5639         ras_req = (struct lpfc_bsg_get_fwlog_req *)
5640                 bsg_request->rqst_data.h_vendor.vendor_cmd;
5641         rd_offset = ras_req->read_offset;
5642
5643         /* Allocate memory to read fw log*/
5644         fwlog_buff = vmalloc(ras_req->read_size);
5645         if (!fwlog_buff) {
5646                 rc = -ENOMEM;
5647                 goto ras_job_error;
5648         }
5649
5650         rd_index = (rd_offset / LPFC_RAS_MAX_ENTRY_SIZE);
5651         offset = (rd_offset % LPFC_RAS_MAX_ENTRY_SIZE);
5652
5653         list_for_each_entry_safe(dmabuf, next,
5654                               &ras_fwlog->fwlog_buff_list, list) {
5655
5656                 if (dmabuf->buffer_tag < rd_index)
5657                         continue;
5658
5659                 src = dmabuf->virt + offset;
5660                 memcpy(fwlog_buff, src, ras_req->read_size);
5661                 break;
5662         }
5663
5664         bsg_reply->reply_payload_rcv_len =
5665                 sg_copy_from_buffer(job->reply_payload.sg_list,
5666                                     job->reply_payload.sg_cnt,
5667                                     fwlog_buff, ras_req->read_size);
5668
5669         vfree(fwlog_buff);
5670
5671 ras_job_error:
5672         bsg_reply->result = rc;
5673         if (!rc)
5674                 bsg_job_done(job, bsg_reply->result,
5675                              bsg_reply->reply_payload_rcv_len);
5676
5677         return rc;
5678 }
5679
5680 static int
5681 lpfc_get_trunk_info(struct bsg_job *job)
5682 {
5683         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
5684         struct lpfc_hba *phba = vport->phba;
5685         struct fc_bsg_reply *bsg_reply = job->reply;
5686         struct lpfc_trunk_info *event_reply;
5687         int rc = 0;
5688
5689         if (job->request_len <
5690             sizeof(struct fc_bsg_request) + sizeof(struct get_trunk_info_req)) {
5691                 lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5692                                 "2744 Received GET TRUNK _INFO request below "
5693                                 "minimum size\n");
5694                 rc = -EINVAL;
5695                 goto job_error;
5696         }
5697
5698         event_reply = (struct lpfc_trunk_info *)
5699                 bsg_reply->reply_data.vendor_reply.vendor_rsp;
5700
5701         if (job->reply_len < sizeof(*bsg_reply) + sizeof(*event_reply)) {
5702                 lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5703                                 "2728 Received GET TRUNK _INFO reply below "
5704                                 "minimum size\n");
5705                 rc = -EINVAL;
5706                 goto job_error;
5707         }
5708         if (event_reply == NULL) {
5709                 rc = -EINVAL;
5710                 goto job_error;
5711         }
5712
5713         bsg_bf_set(lpfc_trunk_info_link_status, event_reply,
5714                    (phba->link_state >= LPFC_LINK_UP) ? 1 : 0);
5715
5716         bsg_bf_set(lpfc_trunk_info_trunk_active0, event_reply,
5717                    (phba->trunk_link.link0.state == LPFC_LINK_UP) ? 1 : 0);
5718
5719         bsg_bf_set(lpfc_trunk_info_trunk_active1, event_reply,
5720                    (phba->trunk_link.link1.state == LPFC_LINK_UP) ? 1 : 0);
5721
5722         bsg_bf_set(lpfc_trunk_info_trunk_active2, event_reply,
5723                    (phba->trunk_link.link2.state == LPFC_LINK_UP) ? 1 : 0);
5724
5725         bsg_bf_set(lpfc_trunk_info_trunk_active3, event_reply,
5726                    (phba->trunk_link.link3.state == LPFC_LINK_UP) ? 1 : 0);
5727
5728         bsg_bf_set(lpfc_trunk_info_trunk_config0, event_reply,
5729                    bf_get(lpfc_conf_trunk_port0, &phba->sli4_hba));
5730
5731         bsg_bf_set(lpfc_trunk_info_trunk_config1, event_reply,
5732                    bf_get(lpfc_conf_trunk_port1, &phba->sli4_hba));
5733
5734         bsg_bf_set(lpfc_trunk_info_trunk_config2, event_reply,
5735                    bf_get(lpfc_conf_trunk_port2, &phba->sli4_hba));
5736
5737         bsg_bf_set(lpfc_trunk_info_trunk_config3, event_reply,
5738                    bf_get(lpfc_conf_trunk_port3, &phba->sli4_hba));
5739
5740         event_reply->port_speed = phba->sli4_hba.link_state.speed / 1000;
5741         event_reply->logical_speed =
5742                                 phba->sli4_hba.link_state.logical_speed / 1000;
5743 job_error:
5744         bsg_reply->result = rc;
5745         if (!rc)
5746                 bsg_job_done(job, bsg_reply->result,
5747                              bsg_reply->reply_payload_rcv_len);
5748         return rc;
5749
5750 }
5751
5752 /**
5753  * lpfc_bsg_hst_vendor - process a vendor-specific fc_bsg_job
5754  * @job: fc_bsg_job to handle
5755  **/
5756 static int
5757 lpfc_bsg_hst_vendor(struct bsg_job *job)
5758 {
5759         struct fc_bsg_request *bsg_request = job->request;
5760         struct fc_bsg_reply *bsg_reply = job->reply;
5761         int command = bsg_request->rqst_data.h_vendor.vendor_cmd[0];
5762         int rc;
5763
5764         switch (command) {
5765         case LPFC_BSG_VENDOR_SET_CT_EVENT:
5766                 rc = lpfc_bsg_hba_set_event(job);
5767                 break;
5768         case LPFC_BSG_VENDOR_GET_CT_EVENT:
5769                 rc = lpfc_bsg_hba_get_event(job);
5770                 break;
5771         case LPFC_BSG_VENDOR_SEND_MGMT_RESP:
5772                 rc = lpfc_bsg_send_mgmt_rsp(job);
5773                 break;
5774         case LPFC_BSG_VENDOR_DIAG_MODE:
5775                 rc = lpfc_bsg_diag_loopback_mode(job);
5776                 break;
5777         case LPFC_BSG_VENDOR_DIAG_MODE_END:
5778                 rc = lpfc_sli4_bsg_diag_mode_end(job);
5779                 break;
5780         case LPFC_BSG_VENDOR_DIAG_RUN_LOOPBACK:
5781                 rc = lpfc_bsg_diag_loopback_run(job);
5782                 break;
5783         case LPFC_BSG_VENDOR_LINK_DIAG_TEST:
5784                 rc = lpfc_sli4_bsg_link_diag_test(job);
5785                 break;
5786         case LPFC_BSG_VENDOR_GET_MGMT_REV:
5787                 rc = lpfc_bsg_get_dfc_rev(job);
5788                 break;
5789         case LPFC_BSG_VENDOR_MBOX:
5790                 rc = lpfc_bsg_mbox_cmd(job);
5791                 break;
5792         case LPFC_BSG_VENDOR_MENLO_CMD:
5793         case LPFC_BSG_VENDOR_MENLO_DATA:
5794                 rc = lpfc_menlo_cmd(job);
5795                 break;
5796         case LPFC_BSG_VENDOR_FORCED_LINK_SPEED:
5797                 rc = lpfc_forced_link_speed(job);
5798                 break;
5799         case LPFC_BSG_VENDOR_RAS_GET_LWPD:
5800                 rc = lpfc_bsg_get_ras_lwpd(job);
5801                 break;
5802         case LPFC_BSG_VENDOR_RAS_GET_FWLOG:
5803                 rc = lpfc_bsg_get_ras_fwlog(job);
5804                 break;
5805         case LPFC_BSG_VENDOR_RAS_GET_CONFIG:
5806                 rc = lpfc_bsg_get_ras_config(job);
5807                 break;
5808         case LPFC_BSG_VENDOR_RAS_SET_CONFIG:
5809                 rc = lpfc_bsg_set_ras_config(job);
5810                 break;
5811         case LPFC_BSG_VENDOR_GET_TRUNK_INFO:
5812                 rc = lpfc_get_trunk_info(job);
5813                 break;
5814         default:
5815                 rc = -EINVAL;
5816                 bsg_reply->reply_payload_rcv_len = 0;
5817                 /* make error code available to userspace */
5818                 bsg_reply->result = rc;
5819                 break;
5820         }
5821
5822         return rc;
5823 }
5824
5825 /**
5826  * lpfc_bsg_request - handle a bsg request from the FC transport
5827  * @job: bsg_job to handle
5828  **/
5829 int
5830 lpfc_bsg_request(struct bsg_job *job)
5831 {
5832         struct fc_bsg_request *bsg_request = job->request;
5833         struct fc_bsg_reply *bsg_reply = job->reply;
5834         uint32_t msgcode;
5835         int rc;
5836
5837         msgcode = bsg_request->msgcode;
5838         switch (msgcode) {
5839         case FC_BSG_HST_VENDOR:
5840                 rc = lpfc_bsg_hst_vendor(job);
5841                 break;
5842         case FC_BSG_RPT_ELS:
5843                 rc = lpfc_bsg_rport_els(job);
5844                 break;
5845         case FC_BSG_RPT_CT:
5846                 rc = lpfc_bsg_send_mgmt_cmd(job);
5847                 break;
5848         default:
5849                 rc = -EINVAL;
5850                 bsg_reply->reply_payload_rcv_len = 0;
5851                 /* make error code available to userspace */
5852                 bsg_reply->result = rc;
5853                 break;
5854         }
5855
5856         return rc;
5857 }
5858
5859 /**
5860  * lpfc_bsg_timeout - handle timeout of a bsg request from the FC transport
5861  * @job: bsg_job that has timed out
5862  *
5863  * This function just aborts the job's IOCB.  The aborted IOCB will return to
5864  * the waiting function which will handle passing the error back to userspace
5865  **/
5866 int
5867 lpfc_bsg_timeout(struct bsg_job *job)
5868 {
5869         struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
5870         struct lpfc_hba *phba = vport->phba;
5871         struct lpfc_iocbq *cmdiocb;
5872         struct lpfc_sli_ring *pring;
5873         struct bsg_job_data *dd_data;
5874         unsigned long flags;
5875         int rc = 0;
5876         LIST_HEAD(completions);
5877         struct lpfc_iocbq *check_iocb, *next_iocb;
5878
5879         pring = lpfc_phba_elsring(phba);
5880         if (unlikely(!pring))
5881                 return -EIO;
5882
5883         /* if job's driver data is NULL, the command completed or is in the
5884          * the process of completing.  In this case, return status to request
5885          * so the timeout is retried.  This avoids double completion issues
5886          * and the request will be pulled off the timer queue when the
5887          * command's completion handler executes.  Otherwise, prevent the
5888          * command's completion handler from executing the job done callback
5889          * and continue processing to abort the outstanding the command.
5890          */
5891
5892         spin_lock_irqsave(&phba->ct_ev_lock, flags);
5893         dd_data = (struct bsg_job_data *)job->dd_data;
5894         if (dd_data) {
5895                 dd_data->set_job = NULL;
5896                 job->dd_data = NULL;
5897         } else {
5898                 spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
5899                 return -EAGAIN;
5900         }
5901
5902         switch (dd_data->type) {
5903         case TYPE_IOCB:
5904                 /* Check to see if IOCB was issued to the port or not. If not,
5905                  * remove it from the txq queue and call cancel iocbs.
5906                  * Otherwise, call abort iotag
5907                  */
5908                 cmdiocb = dd_data->context_un.iocb.cmdiocbq;
5909                 spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
5910
5911                 spin_lock_irqsave(&phba->hbalock, flags);
5912                 /* make sure the I/O abort window is still open */
5913                 if (!(cmdiocb->iocb_flag & LPFC_IO_CMD_OUTSTANDING)) {
5914                         spin_unlock_irqrestore(&phba->hbalock, flags);
5915                         return -EAGAIN;
5916                 }
5917                 list_for_each_entry_safe(check_iocb, next_iocb, &pring->txq,
5918                                          list) {
5919                         if (check_iocb == cmdiocb) {
5920                                 list_move_tail(&check_iocb->list, &completions);
5921                                 break;
5922                         }
5923                 }
5924                 if (list_empty(&completions))
5925                         lpfc_sli_issue_abort_iotag(phba, pring, cmdiocb, NULL);
5926                 spin_unlock_irqrestore(&phba->hbalock, flags);
5927                 if (!list_empty(&completions)) {
5928                         lpfc_sli_cancel_iocbs(phba, &completions,
5929                                               IOSTAT_LOCAL_REJECT,
5930                                               IOERR_SLI_ABORTED);
5931                 }
5932                 break;
5933
5934         case TYPE_EVT:
5935                 spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
5936                 break;
5937
5938         case TYPE_MBOX:
5939                 /* Update the ext buf ctx state if needed */
5940
5941                 if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_PORT)
5942                         phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_ABTS;
5943                 spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
5944                 break;
5945         case TYPE_MENLO:
5946                 /* Check to see if IOCB was issued to the port or not. If not,
5947                  * remove it from the txq queue and call cancel iocbs.
5948                  * Otherwise, call abort iotag.
5949                  */
5950                 cmdiocb = dd_data->context_un.menlo.cmdiocbq;
5951                 spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
5952
5953                 spin_lock_irqsave(&phba->hbalock, flags);
5954                 list_for_each_entry_safe(check_iocb, next_iocb, &pring->txq,
5955                                          list) {
5956                         if (check_iocb == cmdiocb) {
5957                                 list_move_tail(&check_iocb->list, &completions);
5958                                 break;
5959                         }
5960                 }
5961                 if (list_empty(&completions))
5962                         lpfc_sli_issue_abort_iotag(phba, pring, cmdiocb, NULL);
5963                 spin_unlock_irqrestore(&phba->hbalock, flags);
5964                 if (!list_empty(&completions)) {
5965                         lpfc_sli_cancel_iocbs(phba, &completions,
5966                                               IOSTAT_LOCAL_REJECT,
5967                                               IOERR_SLI_ABORTED);
5968                 }
5969                 break;
5970         default:
5971                 spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
5972                 break;
5973         }
5974
5975         /* scsi transport fc fc_bsg_job_timeout expects a zero return code,
5976          * otherwise an error message will be displayed on the console
5977          * so always return success (zero)
5978          */
5979         return rc;
5980 }