cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lpfc_bsg.c (170199B)


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