bfad_bsg.c revision 5a54b1d576d1880eb249e906e0c8e2ffe64506d3
1b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/*
2b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
3b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * All rights reserved
4b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * www.brocade.com
5b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati *
6b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * Linux driver for Brocade Fibre Channel Host Bus Adapter.
7b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati *
8b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * This program is free software; you can redistribute it and/or modify it
9b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * under the terms of the GNU General Public License (GPL) Version 2 as
10b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * published by the Free Software Foundation
11b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati *
12b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * This program is distributed in the hope that it will be useful, but
13b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * WITHOUT ANY WARRANTY; without even the implied warranty of
14b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati * General Public License for more details.
16b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati */
17b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
18b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati#include <linux/uaccess.h>
19b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati#include "bfad_drv.h"
20b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati#include "bfad_im.h"
21b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati#include "bfad_bsg.h"
22b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
23b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna GudipatiBFA_TRC_FILE(LDRV, BSG);
24b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
25b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/* bfad_im_bsg_get_kobject - increment the bfa refcnt */
26b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic void
27b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_get_kobject(struct fc_bsg_job *job)
28b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
29b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct Scsi_Host *shost = job->shost;
30b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long flags;
31b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
32b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(shost->host_lock, flags);
33b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	__module_get(shost->dma_dev->driver->owner);
34b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(shost->host_lock, flags);
35b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
36b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
37b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/* bfad_im_bsg_put_kobject - decrement the bfa refcnt */
38b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic void
39b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_put_kobject(struct fc_bsg_job *job)
40b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
41b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct Scsi_Host *shost = job->shost;
42b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long flags;
43b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
44b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(shost->host_lock, flags);
45b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	module_put(shost->dma_dev->driver->owner);
46b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(shost->host_lock, flags);
47b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
48b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
49601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
50601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_enable(struct bfad_s *bfad, void *cmd)
51601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
52601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
53601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	int	rc = 0;
54601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
55601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
56601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
57601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	/* If IOC is not in disabled state - return */
58601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (!bfa_ioc_is_disabled(&bfad->bfa.ioc)) {
59601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
60601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_IOC_FAILURE;
61601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return rc;
62601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
63601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
64601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	init_completion(&bfad->enable_comp);
65601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_iocfc_enable(&bfad->bfa);
66601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
67601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
68601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	wait_for_completion(&bfad->enable_comp);
69601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
70601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return rc;
71601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
72601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
73601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
74601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_disable(struct bfad_s *bfad, void *cmd)
75601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
76601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
77601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	int	rc = 0;
78601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
79601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
80601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
81601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (bfad->disable_active) {
82601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
83601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return EBUSY;
84601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
85601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
86601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfad->disable_active = BFA_TRUE;
87601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	init_completion(&bfad->disable_comp);
88601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_iocfc_disable(&bfad->bfa);
89601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
90601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
91601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	wait_for_completion(&bfad->disable_comp);
92601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfad->disable_active = BFA_FALSE;
93601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
94601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
95601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return rc;
96601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
97601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
98b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
99b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_ioc_get_info(struct bfad_s *bfad, void *cmd)
100b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
101b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int	i;
102b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_ioc_info_s *iocmd = (struct bfa_bsg_ioc_info_s *)cmd;
103b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_im_port_s	*im_port;
104b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_port_attr_s	pattr;
105b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
106b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
107b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
108b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcport_get_attr(&bfad->bfa, &pattr);
109b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->nwwn = pattr.nwwn;
110b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->pwwn = pattr.pwwn;
111b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->ioc_type = bfa_get_type(&bfad->bfa);
112b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->mac = bfa_get_mac(&bfad->bfa);
113b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->factory_mac = bfa_get_mfg_mac(&bfad->bfa);
114b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_get_adapter_serial_num(&bfad->bfa, iocmd->serialnum);
115b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->factorynwwn = pattr.factorynwwn;
116b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->factorypwwn = pattr.factorypwwn;
117b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	im_port = bfad->pport.im_port;
118b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->host = im_port->shost->host_no;
119b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
120b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
121b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->name, bfad->adapter_name);
122b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->port_name, bfad->port_name);
123b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->hwpath, bfad->pci_name);
124b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
125b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* set adapter hw path */
126b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->adapter_hwpath, bfad->pci_name);
127b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	i = strlen(iocmd->adapter_hwpath) - 1;
128b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	while (iocmd->adapter_hwpath[i] != '.')
129b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		i--;
130b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->adapter_hwpath[i] = '\0';
131b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
132b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
133b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
134b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
135b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
136b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_ioc_get_attr(struct bfad_s *bfad, void *cmd)
137b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
138b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_ioc_attr_s *iocmd = (struct bfa_bsg_ioc_attr_s *)cmd;
139b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
140b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
141b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
142b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_ioc_get_attr(&bfad->bfa.ioc, &iocmd->ioc_attr);
143b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
144b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
145b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* fill in driver attr info */
146b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->ioc_attr.driver_attr.driver, BFAD_DRIVER_NAME);
147b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strncpy(iocmd->ioc_attr.driver_attr.driver_ver,
148b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		BFAD_DRIVER_VERSION, BFA_VERSION_LEN);
149b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->ioc_attr.driver_attr.fw_ver,
150b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->ioc_attr.adapter_attr.fw_ver);
151b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->ioc_attr.driver_attr.bios_ver,
152b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->ioc_attr.adapter_attr.optrom_ver);
153b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
154b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* copy chip rev info first otherwise it will be overwritten */
155b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	memcpy(bfad->pci_attr.chip_rev, iocmd->ioc_attr.pci_attr.chip_rev,
156b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		sizeof(bfad->pci_attr.chip_rev));
157b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	memcpy(&iocmd->ioc_attr.pci_attr, &bfad->pci_attr,
158b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		sizeof(struct bfa_ioc_pci_attr_s));
159b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
160b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
161b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
162b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
163b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
164601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
165601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_get_stats(struct bfad_s *bfad, void *cmd)
166601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
167601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_ioc_stats_s *iocmd = (struct bfa_bsg_ioc_stats_s *)cmd;
168601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
169601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_ioc_get_stats(&bfad->bfa, &iocmd->ioc_stats);
170601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
171601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
172601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
173601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
174601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
175601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_get_fwstats(struct bfad_s *bfad, void *cmd,
176601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			unsigned int payload_len)
177601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
178601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_ioc_fwstats_s *iocmd =
179601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_ioc_fwstats_s *)cmd;
180601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	void	*iocmd_bufptr;
181601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
182601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
183601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
184601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(struct bfa_bsg_ioc_fwstats_s),
185601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(struct bfa_fw_stats_s)) != BFA_STATUS_OK) {
186601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
187601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
188601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
189601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
190601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_ioc_fwstats_s);
191601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
192601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_ioc_fw_stats_get(&bfad->bfa.ioc, iocmd_bufptr);
193601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
194601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
195601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
196601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, iocmd->status);
197601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
198601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
199601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
200601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_trc(bfad, 0x6666);
201601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
202601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
203601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
204601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
205601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_iocfc_get_attr(struct bfad_s *bfad, void *cmd)
206601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
207601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_iocfc_attr_s *iocmd = (struct bfa_bsg_iocfc_attr_s *)cmd;
208601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
209601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
210601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_iocfc_get_attr(&bfad->bfa, &iocmd->iocfc_attr);
211601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
212601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
213601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
214601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
215601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
216601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_iocfc_set_intr(struct bfad_s *bfad, void *cmd)
217601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
218601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_iocfc_intr_s *iocmd = (struct bfa_bsg_iocfc_intr_s *)cmd;
219601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
220601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
221601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
222601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_iocfc_israttr_set(&bfad->bfa, &iocmd->attr);
223601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
224601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
225601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
226601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
227601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
228601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
229601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_port_enable(struct bfad_s *bfad, void *cmd)
230601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
231601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
232601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfad_hal_comp fcomp;
233601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long flags;
234601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
235601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	init_completion(&fcomp.comp);
236601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
237601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_port_enable(&bfad->bfa.modules.port,
238601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati					bfad_hcb_comp, &fcomp);
239601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
240601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
241601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, iocmd->status);
242601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return 0;
243601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
244601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	wait_for_completion(&fcomp.comp);
245601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = fcomp.status;
246601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
247601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
248601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
249601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
250601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_port_disable(struct bfad_s *bfad, void *cmd)
251601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
252601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
253601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfad_hal_comp fcomp;
254601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long flags;
255601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
256601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	init_completion(&fcomp.comp);
257601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
258601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_port_disable(&bfad->bfa.modules.port,
259601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				bfad_hcb_comp, &fcomp);
260601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
261601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
262601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
263601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, iocmd->status);
264601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return 0;
265601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
266601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	wait_for_completion(&fcomp.comp);
267601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = fcomp.status;
268601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
269601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
270601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
271b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
272b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_port_get_attr(struct bfad_s *bfad, void *cmd)
273b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
274b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_port_attr_s *iocmd = (struct bfa_bsg_port_attr_s *)cmd;
275b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_lport_attr_s	port_attr;
276b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
277b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
278b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
279b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcport_get_attr(&bfad->bfa, &iocmd->attr);
280b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcs_lport_get_attr(&bfad->bfa_fcs.fabric.bport, &port_attr);
281b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
282b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
283b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (iocmd->attr.topology != BFA_PORT_TOPOLOGY_NONE)
284b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->attr.pid = port_attr.pid;
285b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	else
286b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->attr.pid = 0;
287b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
288b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->attr.port_type = port_attr.port_type;
289b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->attr.loopback = port_attr.loopback;
290b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->attr.authfail = port_attr.authfail;
291b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strncpy(iocmd->attr.port_symname.symname,
292b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		port_attr.port_cfg.sym_name.symname,
293b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		sizeof(port_attr.port_cfg.sym_name.symname));
294b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
295b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
296b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
297b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
298b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
299601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
300601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_port_get_stats(struct bfad_s *bfad, void *cmd,
301601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			unsigned int payload_len)
302601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
303601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_port_stats_s *iocmd = (struct bfa_bsg_port_stats_s *)cmd;
304601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfad_hal_comp fcomp;
305601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	void	*iocmd_bufptr;
306601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
307601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
308601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
309601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(struct bfa_bsg_port_stats_s),
310601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(union bfa_port_stats_u)) != BFA_STATUS_OK) {
311601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
312601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return 0;
313601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
314601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
315601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_port_stats_s);
316601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
317601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	init_completion(&fcomp.comp);
318601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
319601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_port_get_stats(&bfad->bfa.modules.port,
320601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd_bufptr, bfad_hcb_comp, &fcomp);
321601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
322601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
323601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, iocmd->status);
324601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
325601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
326601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
327601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	wait_for_completion(&fcomp.comp);
328601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = fcomp.status;
329601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
330601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
331601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
332601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
333b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
334b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_lport_get_attr(struct bfad_s *bfad, void *cmd)
335b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
336b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_lport_s	*fcs_port;
337b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_lport_attr_s *iocmd = (struct bfa_bsg_lport_attr_s *)cmd;
338b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
339b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
340b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
341b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
342b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				iocmd->vf_id, iocmd->pwwn);
343b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_port == NULL) {
344b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
345b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
346b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
347b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
348b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
349b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcs_lport_get_attr(fcs_port, &iocmd->port_attr);
350b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
351b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
352b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
353b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
354b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
355b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
356601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
357601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_lport_get_stats(struct bfad_s *bfad, void *cmd)
358601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
359601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
360601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_lport_stats_s *iocmd =
361601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_lport_stats_s *)cmd;
362601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
363601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
364601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
365601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
366601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
367601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_port == NULL) {
368601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
369601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
370601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
371601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
372601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
373601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcs_lport_get_stats(fcs_port, &iocmd->port_stats);
374601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
375601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
376601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
377601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
378601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
379601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
380601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
381601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_lport_get_iostats(struct bfad_s *bfad, void *cmd)
382601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
383601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
384601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_lport_iostats_s *iocmd =
385601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_lport_iostats_s *)cmd;
386601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
387601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
388601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
389601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
390601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
391601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_port == NULL) {
392601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
393601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
394601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
395601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
396601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
397601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_port_iostats(&bfad->bfa, &iocmd->iostats,
398601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			fcs_port->lp_tag);
399601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
400601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
401601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
402601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
403601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
404601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
405601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
406601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_lport_get_rports(struct bfad_s *bfad, void *cmd,
407601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			unsigned int payload_len)
408601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
409601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_lport_get_rports_s *iocmd =
410601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_lport_get_rports_s *)cmd;
411601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
412601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
413601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	void	*iocmd_bufptr;
414601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
415601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (iocmd->nrports == 0)
416601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return EINVAL;
417601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
418601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
419601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(struct bfa_bsg_lport_get_rports_s),
420601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(wwn_t) * iocmd->nrports) != BFA_STATUS_OK) {
421601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
422601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return 0;
423601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
424601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
425601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd_bufptr = (char *)iocmd +
426601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(struct bfa_bsg_lport_get_rports_s);
427601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
428601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
429601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
430601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_port == NULL) {
431601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
432601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
433601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
434601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
435601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
436601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
437601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcs_lport_get_rports(fcs_port, (wwn_t *)iocmd_bufptr,
438601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				&iocmd->nrports);
439601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
440601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
441601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
442601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
443601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
444601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
445601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
446601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_rport_get_attr(struct bfad_s *bfad, void *cmd)
447601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
448601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_rport_attr_s *iocmd = (struct bfa_bsg_rport_attr_s *)cmd;
449601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
450601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_rport_s *fcs_rport;
451601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
452601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
453601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
454601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
455601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
456601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_port == NULL) {
457601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
458601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
459601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
460601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
461601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
462601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
463601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
464601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_rport == NULL) {
465601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
466601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
467601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
468601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
469601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
470601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
471601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcs_rport_get_attr(fcs_rport, &iocmd->attr);
472601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
473601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
474601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
475601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
476601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
477601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
478b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
479b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_rport_get_addr(struct bfad_s *bfad, void *cmd)
480b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
481b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_rport_scsi_addr_s *iocmd =
482b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(struct bfa_bsg_rport_scsi_addr_s *)cmd;
483b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_lport_s	*fcs_port;
484b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_itnim_s	*fcs_itnim;
485b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_itnim_s	*drv_itnim;
486b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
487b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
488b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
489b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
490b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				iocmd->vf_id, iocmd->pwwn);
491b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_port == NULL) {
492b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_trc(bfad, 0);
493b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
494b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
495b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
496b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
497b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
498b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
499b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_itnim == NULL) {
500b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_trc(bfad, 0);
501b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
502b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
503b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
504b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
505b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
506b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_itnim = fcs_itnim->itnim_drv;
507b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
508b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_itnim && drv_itnim->im_port)
509b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->host = drv_itnim->im_port->shost->host_no;
510b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	else {
511b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_trc(bfad, 0);
512b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
513b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
514b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
515b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
516b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
517b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->target = drv_itnim->scsi_tgt_id;
518b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
519b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
520b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->bus = 0;
521b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->lun = 0;
522b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
523b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
524b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
525b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
526b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
527601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
528601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_rport_get_stats(struct bfad_s *bfad, void *cmd)
529601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
530601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_rport_stats_s *iocmd =
531601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_rport_stats_s *)cmd;
532601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
533601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_rport_s *fcs_rport;
534601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
535601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
536601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
537601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
538601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
539601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_port == NULL) {
540601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
541601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
542601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
543601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
544601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
545601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
546601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
547601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_rport == NULL) {
548601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
549601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
550601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
551601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
552601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
553601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
554601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	memcpy((void *)&iocmd->stats, (void *)&fcs_rport->stats,
555601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		sizeof(struct bfa_rport_stats_s));
556601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	memcpy((void *)&iocmd->stats.hal_stats,
557601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	       (void *)&(bfa_fcs_rport_get_halrport(fcs_rport)->stats),
558601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	       sizeof(struct bfa_rport_hal_stats_s));
559601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
560601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
561601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
562601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
563601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
564601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
565601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
566b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
567b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_fabric_get_lports(struct bfad_s *bfad, void *cmd,
568b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			unsigned int payload_len)
569b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
570b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_fabric_get_lports_s *iocmd =
571b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(struct bfa_bsg_fabric_get_lports_s *)cmd;
572b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcs_vf_t	*fcs_vf;
573b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t	nports = iocmd->nports;
574b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
575b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	void	*iocmd_bufptr;
576b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
577b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (nports == 0) {
578b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_EINVAL;
579b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
580b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
581b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
582b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
583b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		sizeof(struct bfa_bsg_fabric_get_lports_s),
584b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		sizeof(wwn_t[iocmd->nports])) != BFA_STATUS_OK) {
585b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
586b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
587b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
588b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
589b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd_bufptr = (char *)iocmd +
590b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			sizeof(struct bfa_bsg_fabric_get_lports_s);
591b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
592b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
593b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id);
594b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_vf == NULL) {
595b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
596b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_VFID;
597b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
598b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
599b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcs_vf_get_ports(fcs_vf, (wwn_t *)iocmd_bufptr, &nports);
600b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
601b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
602b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->nports = nports;
603b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
604b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
605b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
606b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
607b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
608601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
609601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcpim_get_modstats(struct bfad_s *bfad, void *cmd)
610601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
611601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_fcpim_modstats_s *iocmd =
612601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_fcpim_modstats_s *)cmd;
613601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
614601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct list_head *qe, *qen;
615601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_itnim_s *itnim;
616601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
617601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
618601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
619601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	/* accumulate IO stats from itnim */
620601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	memset((void *)&iocmd->modstats, 0, sizeof(struct bfa_itnim_iostats_s));
621601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	list_for_each_safe(qe, qen, &fcpim->itnim_q) {
622601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		itnim = (struct bfa_itnim_s *) qe;
623601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_fcpim_add_stats(&iocmd->modstats, &(itnim->stats));
624601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
625601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
626601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
627601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
628601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
629601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
630601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
631601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcpim_get_del_itn_stats(struct bfad_s *bfad, void *cmd)
632601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
633601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_fcpim_del_itn_stats_s *iocmd =
634601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_fcpim_del_itn_stats_s *)cmd;
635601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
636601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
637601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
638601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
639601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	memcpy((void *)&iocmd->modstats, (void *)&fcpim->del_itn_stats,
640601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		sizeof(struct bfa_fcpim_del_itn_stats_s));
641601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
642601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
643601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
644601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
645601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
646601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
647b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
648b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_itnim_get_attr(struct bfad_s *bfad, void *cmd)
649b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
650b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_itnim_attr_s *iocmd = (struct bfa_bsg_itnim_attr_s *)cmd;
651b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_lport_s	*fcs_port;
652b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
653b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
654b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
655b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
656b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				iocmd->vf_id, iocmd->lpwwn);
657b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!fcs_port)
658b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
659b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	else
660b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = bfa_fcs_itnim_attr_get(fcs_port,
661b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					iocmd->rpwwn, &iocmd->attr);
662b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
663b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
664b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
665b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
666601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatistatic int
667601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_itnim_get_iostats(struct bfad_s *bfad, void *cmd)
668601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
669601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_itnim_iostats_s *iocmd =
670601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_itnim_iostats_s *)cmd;
671601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
672601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_itnim_s *itnim;
673601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
674601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
675601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
676601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
677601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->lpwwn);
678601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (!fcs_port) {
679601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
680601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
681601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	} else {
682601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
683601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		if (itnim == NULL)
684601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
685601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		else {
686601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			iocmd->status = BFA_STATUS_OK;
687601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			memcpy((void *)&iocmd->iostats, (void *)
688601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			       &(bfa_fcs_itnim_get_halitn(itnim)->stats),
689601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			       sizeof(struct bfa_itnim_iostats_s));
690601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		}
691601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
692601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
693601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
694601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
695601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
696601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatistatic int
697601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_itnim_get_itnstats(struct bfad_s *bfad, void *cmd)
698601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
699601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_itnim_itnstats_s *iocmd =
700601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_itnim_itnstats_s *)cmd;
701601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
702601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_itnim_s *itnim;
703601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
704601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
705601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
706601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
707601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->lpwwn);
708601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (!fcs_port) {
709601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
710601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
711601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	} else {
712601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
713601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		if (itnim == NULL)
714601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
715601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		else {
716601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			iocmd->status = BFA_STATUS_OK;
717601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			bfa_fcs_itnim_stats_get(fcs_port, iocmd->rpwwn,
718601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati					&iocmd->itnstats);
719601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		}
720601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
721601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
722601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
723601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
724601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
725601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
726601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcport_enable(struct bfad_s *bfad, void *cmd)
727601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
728601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
729601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long flags;
730601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
731601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
732601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_fcport_enable(&bfad->bfa);
733601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
734601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
735601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
736601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
737601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
738601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
739601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcport_disable(struct bfad_s *bfad, void *cmd)
740601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
741601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
742601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long flags;
743601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
744601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
745601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_fcport_disable(&bfad->bfa);
746601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
747601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
748601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
749601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
750601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
7511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
7521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_ioc_get_pcifn_cfg(struct bfad_s *bfad, void *cmd)
7531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
7541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_pcifn_cfg_s *iocmd = (struct bfa_bsg_pcifn_cfg_s *)cmd;
7551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
7561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags;
7571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
7581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
7591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
7601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_query(&bfad->bfa.modules.ablk,
7611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				&iocmd->pcifn_cfg,
7621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				bfad_hcb_comp, &fcomp);
7631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
7641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
7651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
7661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
7671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
7681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
7691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
7701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
7711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
7721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
7731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
7741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_pcifn_create(struct bfad_s *bfad, void *cmd)
7751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
7761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
7771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
7781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags;
7791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
7801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
7811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
7821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_pf_create(&bfad->bfa.modules.ablk,
7831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				&iocmd->pcifn_id, iocmd->port,
7841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->pcifn_class, iocmd->bandwidth,
7851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				bfad_hcb_comp, &fcomp);
7861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
7871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
7881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
7891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
7901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
7911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
7921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
7931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
7941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
7951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
7961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
7971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_pcifn_delete(struct bfad_s *bfad, void *cmd)
7981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
7991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
8001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
8011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags;
8021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
8041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
8051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_pf_delete(&bfad->bfa.modules.ablk,
8061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->pcifn_id,
8071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				bfad_hcb_comp, &fcomp);
8081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
8091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
8101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
8111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
8131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
8141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
8151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
8161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
8171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
8191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_pcifn_bw(struct bfad_s *bfad, void *cmd)
8201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
8211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
8221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
8231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags;
8241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
8261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
8271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_pf_update(&bfad->bfa.modules.ablk,
8281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->pcifn_id, iocmd->bandwidth,
8291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				bfad_hcb_comp, &fcomp);
8301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
8311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_trc(bfad, iocmd->status);
8321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
8331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
8341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
8361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
8371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_trc(bfad, iocmd->status);
8381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
8391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
8401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
8411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
8431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_adapter_cfg_mode(struct bfad_s *bfad, void *cmd)
8441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
8451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_adapter_cfg_mode_s *iocmd =
8461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			(struct bfa_bsg_adapter_cfg_mode_s *)cmd;
8471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
8481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags = 0;
8491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
8511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
8521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_adapter_config(&bfad->bfa.modules.ablk,
8531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->cfg.mode, iocmd->cfg.max_pf,
8541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->cfg.max_vf, bfad_hcb_comp, &fcomp);
8551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
8561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
8571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
8581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
8601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
8611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
8621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
8631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
8641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
8661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_port_cfg_mode(struct bfad_s *bfad, void *cmd)
8671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
8681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_port_cfg_mode_s *iocmd =
8691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			(struct bfa_bsg_port_cfg_mode_s *)cmd;
8701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
8711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags = 0;
8721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
8741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
8751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_port_config(&bfad->bfa.modules.ablk,
8761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->instance, iocmd->cfg.mode,
8771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->cfg.max_pf, iocmd->cfg.max_vf,
8781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				bfad_hcb_comp, &fcomp);
8791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
8801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
8811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
8821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
8841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
8851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
8861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
8871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
8881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
8901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_ablk_optrom(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
8911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
8921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
8931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
8941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long   flags;
8951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
8961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
8971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
8981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (cmd == IOCMD_FLASH_ENABLE_OPTROM)
8991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		iocmd->status = bfa_ablk_optrom_en(&bfad->bfa.modules.ablk,
9001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati					bfad_hcb_comp, &fcomp);
9011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	else
9021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		iocmd->status = bfa_ablk_optrom_dis(&bfad->bfa.modules.ablk,
9031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati					bfad_hcb_comp, &fcomp);
9041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
9051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
9061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
9071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
9081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
9091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
9101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
9111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
9121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
9131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
9141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
915a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiint
916a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfad_iocmd_faa_enable(struct bfad_s *bfad, void *cmd)
917a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
918a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
919a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	unsigned long   flags;
920a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfad_hal_comp    fcomp;
921a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
922a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	init_completion(&fcomp.comp);
923a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
924a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
925a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = bfa_faa_enable(&bfad->bfa, bfad_hcb_comp, &fcomp);
926a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
927a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
928a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
929a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		goto out;
930a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
931a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	wait_for_completion(&fcomp.comp);
932a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = fcomp.status;
933a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiout:
934a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	return 0;
935a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
936a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
937a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiint
938a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfad_iocmd_faa_disable(struct bfad_s *bfad, void *cmd)
939a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
940a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
941a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	unsigned long   flags;
942a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfad_hal_comp    fcomp;
943a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
944a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	init_completion(&fcomp.comp);
945a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
946a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
947a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = bfa_faa_disable(&bfad->bfa, bfad_hcb_comp, &fcomp);
948a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
949a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
950a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
951a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		goto out;
952a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
953a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	wait_for_completion(&fcomp.comp);
954a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = fcomp.status;
955a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiout:
956a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	return 0;
957a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
958a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
959a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiint
960a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfad_iocmd_faa_query(struct bfad_s *bfad, void *cmd)
961a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
962a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfa_bsg_faa_attr_s *iocmd = (struct bfa_bsg_faa_attr_s *)cmd;
963a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfad_hal_comp    fcomp;
964a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	unsigned long   flags;
965a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
966a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	init_completion(&fcomp.comp);
967a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
968a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
969a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = bfa_faa_query(&bfad->bfa, &iocmd->faa_attr,
970a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati				bfad_hcb_comp, &fcomp);
971a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
972a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
973a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
974a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		goto out;
975a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
976a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	wait_for_completion(&fcomp.comp);
977a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = fcomp.status;
978a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiout:
979a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	return 0;
980a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
981a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
982148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiint
983148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfad_iocmd_cee_attr(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
984148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
985148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_bsg_cee_attr_s *iocmd =
986148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				(struct bfa_bsg_cee_attr_s *)cmd;
987148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	void	*iocmd_bufptr;
988148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfad_hal_comp	cee_comp;
989148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	unsigned long	flags;
990148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
991148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
992148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_bsg_cee_attr_s),
993148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_cee_attr_s)) != BFA_STATUS_OK) {
994148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
995148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		return 0;
996148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
997148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
998148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_attr_s);
999148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1000148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee_comp.status = 0;
1001148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	init_completion(&cee_comp.comp);
1002148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	mutex_lock(&bfad_mutex);
1003148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1004148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	iocmd->status = bfa_cee_get_attr(&bfad->bfa.modules.cee, iocmd_bufptr,
1005148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati					 bfad_hcb_comp, &cee_comp);
1006148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1007148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
1008148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		mutex_unlock(&bfad_mutex);
1009148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(bfad, 0x5555);
1010148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		goto out;
1011148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
1012148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	wait_for_completion(&cee_comp.comp);
1013148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	mutex_unlock(&bfad_mutex);
1014148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiout:
1015148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	return 0;
1016148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
1017148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1018148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiint
1019148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfad_iocmd_cee_get_stats(struct bfad_s *bfad, void *cmd,
1020148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			unsigned int payload_len)
1021148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
1022148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_bsg_cee_stats_s *iocmd =
1023148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				(struct bfa_bsg_cee_stats_s *)cmd;
1024148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	void	*iocmd_bufptr;
1025148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfad_hal_comp	cee_comp;
1026148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	unsigned long	flags;
1027148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1028148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
1029148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_bsg_cee_stats_s),
1030148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_cee_stats_s)) != BFA_STATUS_OK) {
1031148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
1032148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		return 0;
1033148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
1034148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1035148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_stats_s);
1036148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1037148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee_comp.status = 0;
1038148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	init_completion(&cee_comp.comp);
1039148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	mutex_lock(&bfad_mutex);
1040148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1041148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	iocmd->status = bfa_cee_get_stats(&bfad->bfa.modules.cee, iocmd_bufptr,
1042148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati					bfad_hcb_comp, &cee_comp);
1043148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1044148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
1045148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		mutex_unlock(&bfad_mutex);
1046148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(bfad, 0x5555);
1047148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		goto out;
1048148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
1049148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	wait_for_completion(&cee_comp.comp);
1050148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	mutex_unlock(&bfad_mutex);
1051148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiout:
1052148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	return 0;
1053148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
1054148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1055148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiint
1056148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfad_iocmd_cee_reset_stats(struct bfad_s *bfad, void *cmd)
1057148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
1058148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
1059148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	unsigned long	flags;
1060148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1061148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1062148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	iocmd->status = bfa_cee_reset_stats(&bfad->bfa.modules.cee, NULL, NULL);
1063148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1064148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
1065148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(bfad, 0x5555);
1066148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	return 0;
1067148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
1068148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
106951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiint
107051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfad_iocmd_sfp_media(struct bfad_s *bfad, void *cmd)
107151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
107251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfa_bsg_sfp_media_s *iocmd = (struct bfa_bsg_sfp_media_s *)cmd;
107351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfad_hal_comp	fcomp;
107451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	unsigned long	flags;
107551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
107651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	init_completion(&fcomp.comp);
107751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
107851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	iocmd->status = bfa_sfp_media(BFA_SFP_MOD(&bfad->bfa), &iocmd->media,
107951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati				bfad_hcb_comp, &fcomp);
108051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
108151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(bfad, iocmd->status);
108251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (iocmd->status != BFA_STATUS_SFP_NOT_READY)
108351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		goto out;
108451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
108551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	wait_for_completion(&fcomp.comp);
108651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	iocmd->status = fcomp.status;
108751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiout:
108851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	return 0;
108951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
109051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
109151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiint
109251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfad_iocmd_sfp_speed(struct bfad_s *bfad, void *cmd)
109351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
109451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfa_bsg_sfp_speed_s *iocmd = (struct bfa_bsg_sfp_speed_s *)cmd;
109551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfad_hal_comp	fcomp;
109651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	unsigned long	flags;
109751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
109851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	init_completion(&fcomp.comp);
109951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
110051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	iocmd->status = bfa_sfp_speed(BFA_SFP_MOD(&bfad->bfa), iocmd->speed,
110151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati				bfad_hcb_comp, &fcomp);
110251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
110351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(bfad, iocmd->status);
110451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (iocmd->status != BFA_STATUS_SFP_NOT_READY)
110551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		goto out;
110651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	wait_for_completion(&fcomp.comp);
110751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	iocmd->status = fcomp.status;
110851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiout:
110951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	return 0;
111051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
111151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
11125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint
11135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_get_attr(struct bfad_s *bfad, void *cmd)
11145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
11155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_bsg_flash_attr_s *iocmd =
11165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			(struct bfa_bsg_flash_attr_s *)cmd;
11175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfad_hal_comp fcomp;
11185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	unsigned long	flags;
11195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
11205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	init_completion(&fcomp.comp);
11215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
11225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = bfa_flash_get_attr(BFA_FLASH(&bfad->bfa), &iocmd->attr,
11235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				bfad_hcb_comp, &fcomp);
11245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
11255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
11265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		goto out;
11275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	wait_for_completion(&fcomp.comp);
11285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = fcomp.status;
11295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout:
11305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return 0;
11315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
11325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
11335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint
11345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_erase_part(struct bfad_s *bfad, void *cmd)
11355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
11365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
11375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfad_hal_comp fcomp;
11385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	unsigned long	flags;
11395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
11405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	init_completion(&fcomp.comp);
11415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
11425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = bfa_flash_erase_part(BFA_FLASH(&bfad->bfa), iocmd->type,
11435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				iocmd->instance, bfad_hcb_comp, &fcomp);
11445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
11455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
11465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		goto out;
11475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	wait_for_completion(&fcomp.comp);
11485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = fcomp.status;
11495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout:
11505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return 0;
11515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
11525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
11535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint
11545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_update_part(struct bfad_s *bfad, void *cmd,
11555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			unsigned int payload_len)
11565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
11575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
11585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	void	*iocmd_bufptr;
11595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfad_hal_comp fcomp;
11605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	unsigned long	flags;
11615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
11625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
11635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			sizeof(struct bfa_bsg_flash_s),
11645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			iocmd->bufsz) != BFA_STATUS_OK) {
11655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
11665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return 0;
11675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
11685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
11695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s);
11705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
11715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	init_completion(&fcomp.comp);
11725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
11735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
11745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				iocmd->type, iocmd->instance, iocmd_bufptr,
11755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				iocmd->bufsz, 0, bfad_hcb_comp, &fcomp);
11765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
11775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
11785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		goto out;
11795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	wait_for_completion(&fcomp.comp);
11805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = fcomp.status;
11815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout:
11825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return 0;
11835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
11845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
11855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint
11865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_read_part(struct bfad_s *bfad, void *cmd,
11875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			unsigned int payload_len)
11885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
11895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
11905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfad_hal_comp fcomp;
11915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	void	*iocmd_bufptr;
11925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	unsigned long	flags;
11935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
11945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
11955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			sizeof(struct bfa_bsg_flash_s),
11965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			iocmd->bufsz) != BFA_STATUS_OK) {
11975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
11985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return 0;
11995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
12005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
12015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s);
12025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
12035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	init_completion(&fcomp.comp);
12045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
12055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), iocmd->type,
12065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				iocmd->instance, iocmd_bufptr, iocmd->bufsz, 0,
12075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				bfad_hcb_comp, &fcomp);
12085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
12105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		goto out;
12115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	wait_for_completion(&fcomp.comp);
12125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = fcomp.status;
12135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout:
12145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return 0;
12155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
12165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
1217b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
1218b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd,
1219b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		unsigned int payload_len)
1220b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1221b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int rc = EINVAL;
1222b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1223b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	switch (cmd) {
1224601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_ENABLE:
1225601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_enable(bfad, iocmd);
1226601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1227601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_DISABLE:
1228601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_disable(bfad, iocmd);
1229601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1230b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_IOC_GET_INFO:
1231b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_ioc_get_info(bfad, iocmd);
1232b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1233b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_IOC_GET_ATTR:
1234b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_ioc_get_attr(bfad, iocmd);
1235b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1236601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_GET_STATS:
1237601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_get_stats(bfad, iocmd);
1238601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1239601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_GET_FWSTATS:
1240601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_get_fwstats(bfad, iocmd, payload_len);
1241601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1242601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOCFC_GET_ATTR:
1243601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_iocfc_get_attr(bfad, iocmd);
1244601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1245601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOCFC_SET_INTR:
1246601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_iocfc_set_intr(bfad, iocmd);
1247601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1248601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_PORT_ENABLE:
1249601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_port_enable(bfad, iocmd);
1250601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1251601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_PORT_DISABLE:
1252601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_port_disable(bfad, iocmd);
1253601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1254b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_PORT_GET_ATTR:
1255b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_port_get_attr(bfad, iocmd);
1256b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1257601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_PORT_GET_STATS:
1258601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_port_get_stats(bfad, iocmd, payload_len);
1259601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1260b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_LPORT_GET_ATTR:
1261b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_lport_get_attr(bfad, iocmd);
1262b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1263601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_LPORT_GET_STATS:
1264601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_lport_get_stats(bfad, iocmd);
1265601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1266601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_LPORT_GET_IOSTATS:
1267601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_lport_get_iostats(bfad, iocmd);
1268601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1269601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_LPORT_GET_RPORTS:
1270601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_lport_get_rports(bfad, iocmd, payload_len);
1271601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1272601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_RPORT_GET_ATTR:
1273601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_rport_get_attr(bfad, iocmd);
1274601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1275b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_RPORT_GET_ADDR:
1276b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_rport_get_addr(bfad, iocmd);
1277b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1278601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_RPORT_GET_STATS:
1279601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_rport_get_stats(bfad, iocmd);
1280601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1281b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_FABRIC_GET_LPORTS:
1282b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_fabric_get_lports(bfad, iocmd, payload_len);
1283b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1284601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPIM_MODSTATS:
1285601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcpim_get_modstats(bfad, iocmd);
1286601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1287601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPIM_DEL_ITN_STATS:
1288601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcpim_get_del_itn_stats(bfad, iocmd);
1289601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1290b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_ITNIM_GET_ATTR:
1291b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_itnim_get_attr(bfad, iocmd);
1292b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1293601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_ITNIM_GET_IOSTATS:
1294601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_itnim_get_iostats(bfad, iocmd);
1295601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1296601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_ITNIM_GET_ITNSTATS:
1297601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_itnim_get_itnstats(bfad, iocmd);
1298601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1299601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPORT_ENABLE:
1300601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcport_enable(bfad, iocmd);
1301601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1302601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPORT_DISABLE:
1303601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcport_disable(bfad, iocmd);
1304601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
13051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_IOC_PCIFN_CFG:
13061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_ioc_get_pcifn_cfg(bfad, iocmd);
13071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
13081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PCIFN_CREATE:
13091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_pcifn_create(bfad, iocmd);
13101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
13111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PCIFN_DELETE:
13121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_pcifn_delete(bfad, iocmd);
13131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
13141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PCIFN_BW:
13151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_pcifn_bw(bfad, iocmd);
13161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
13171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_ADAPTER_CFG_MODE:
13181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_adapter_cfg_mode(bfad, iocmd);
13191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
13201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PORT_CFG_MODE:
13211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_port_cfg_mode(bfad, iocmd);
13221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
13231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_FLASH_ENABLE_OPTROM:
13241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_FLASH_DISABLE_OPTROM:
13251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_ablk_optrom(bfad, cmd, iocmd);
13261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
1327a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	case IOCMD_FAA_ENABLE:
1328a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		rc = bfad_iocmd_faa_enable(bfad, iocmd);
1329a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		break;
1330a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	case IOCMD_FAA_DISABLE:
1331a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		rc = bfad_iocmd_faa_disable(bfad, iocmd);
1332a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		break;
1333a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	case IOCMD_FAA_QUERY:
1334a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		rc = bfad_iocmd_faa_query(bfad, iocmd);
1335a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		break;
1336148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case IOCMD_CEE_GET_ATTR:
1337148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		rc = bfad_iocmd_cee_attr(bfad, iocmd, payload_len);
1338148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
1339148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case IOCMD_CEE_GET_STATS:
1340148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		rc = bfad_iocmd_cee_get_stats(bfad, iocmd, payload_len);
1341148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
1342148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case IOCMD_CEE_RESET_STATS:
1343148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		rc = bfad_iocmd_cee_reset_stats(bfad, iocmd);
1344148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
134551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	case IOCMD_SFP_MEDIA:
134651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		rc = bfad_iocmd_sfp_media(bfad, iocmd);
134751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		 break;
134851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	case IOCMD_SFP_SPEED:
134951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		rc = bfad_iocmd_sfp_speed(bfad, iocmd);
135051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		break;
13515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_GET_ATTR:
13525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_get_attr(bfad, iocmd);
13535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
13545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_ERASE_PART:
13555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_erase_part(bfad, iocmd);
13565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
13575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_UPDATE_PART:
13585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_update_part(bfad, iocmd, payload_len);
13595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
13605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_READ_PART:
13615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_read_part(bfad, iocmd, payload_len);
13625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
1363b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	default:
1364b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = EINVAL;
1365b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1366b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1367b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return -rc;
1368b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1369b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1370b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
1371b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_vendor_request(struct fc_bsg_job *job)
1372b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1373b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t vendor_cmd = job->request->rqst_data.h_vendor.vendor_cmd[0];
1374b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_im_port_s *im_port =
1375b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(struct bfad_im_port_s *) job->shost->hostdata[0];
1376b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_s *bfad = im_port->bfad;
1377b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	void *payload_kbuf;
1378b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int rc = -EINVAL;
1379b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1380b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Allocate a temp buffer to hold the passed in user space command */
1381b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	payload_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL);
1382b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!payload_kbuf) {
1383b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
1384b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
1385b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1386b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1387b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Copy the sg_list passed in to a linear buffer: holds the cmnd data */
1388b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_to_buffer(job->request_payload.sg_list,
1389b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.sg_cnt, payload_kbuf,
1390b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.payload_len);
1391b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1392b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Invoke IOCMD handler - to handle all the vendor command requests */
1393b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rc = bfad_iocmd_handler(bfad, vendor_cmd, payload_kbuf,
1394b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				job->request_payload.payload_len);
1395b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (rc != BFA_STATUS_OK)
1396b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto error;
1397b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1398b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Copy the response data to the job->reply_payload sg_list */
1399b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_from_buffer(job->reply_payload.sg_list,
1400b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.sg_cnt,
1401b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    payload_kbuf,
1402b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.payload_len);
1403b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1404b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* free the command buffer */
1405b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(payload_kbuf);
1406b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1407b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Fill the BSG job reply data */
1408b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply_len = job->reply_payload.payload_len;
1409b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->reply_payload_rcv_len = job->reply_payload.payload_len;
1410b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->result = rc;
1411b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1412b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->job_done(job);
1413b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
1414b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatierror:
1415b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* free the command buffer */
1416b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(payload_kbuf);
1417b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
1418b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->result = rc;
1419b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply_len = sizeof(uint32_t);
1420b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->reply_payload_rcv_len = 0;
1421b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
1422b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1423b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1424b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/* FC passthru call backs */
1425b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu64
1426b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_req_sgaddr_cb(void *bfad_fcxp, int sgeid)
1427b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1428b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
1429b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s  *sge;
1430b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	u64	addr;
1431b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1432b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->req_sge + sgeid;
1433b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	addr = (u64)(size_t) sge->sg_addr;
1434b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return addr;
1435b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1436b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1437b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu32
1438b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_req_sglen_cb(void *bfad_fcxp, int sgeid)
1439b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1440b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
1441b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sge;
1442b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1443b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->req_sge + sgeid;
1444b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return sge->sg_len;
1445b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1446b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1447b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu64
1448b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_rsp_sgaddr_cb(void *bfad_fcxp, int sgeid)
1449b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1450b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
1451b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sge;
1452b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	u64	addr;
1453b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1454b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->rsp_sge + sgeid;
1455b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	addr = (u64)(size_t) sge->sg_addr;
1456b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return addr;
1457b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1458b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1459b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu32
1460b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_rsp_sglen_cb(void *bfad_fcxp, int sgeid)
1461b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1462b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
1463b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sge;
1464b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1465b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->rsp_sge + sgeid;
1466b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return sge->sg_len;
1467b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1468b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1469b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipativoid
1470b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_send_fcpt_cb(void *bfad_fcxp, struct bfa_fcxp_s *fcxp, void *cbarg,
1471b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_status_t req_status, u32 rsp_len, u32 resid_len,
1472b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		struct fchs_s *rsp_fchs)
1473b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1474b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp *drv_fcxp = bfad_fcxp;
1475b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1476b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->req_status = req_status;
1477b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->rsp_len = rsp_len;
1478b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1479b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* bfa_fcxp will be automatically freed by BFA */
1480b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->bfa_fcxp = NULL;
1481b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	complete(&drv_fcxp->comp);
1482b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1483b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1484b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistruct bfad_buf_info *
1485b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_map_sg(struct bfad_s *bfad, void *payload_kbuf,
1486b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		 uint32_t payload_len, uint32_t *num_sgles)
1487b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1488b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_buf_info	*buf_base, *buf_info;
1489b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sg_table;
1490b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int sge_num = 1;
1491b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1492b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_base = kzalloc((sizeof(struct bfad_buf_info) +
1493b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			   sizeof(struct bfa_sge_s)) * sge_num, GFP_KERNEL);
1494b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!buf_base)
1495b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		return NULL;
1496b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1497b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_table = (struct bfa_sge_s *) (((uint8_t *)buf_base) +
1498b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(sizeof(struct bfad_buf_info) * sge_num));
1499b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1500b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Allocate dma coherent memory */
1501b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_info = buf_base;
1502b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_info->size = payload_len;
1503b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_info->virt = dma_alloc_coherent(&bfad->pcidev->dev, buf_info->size,
1504b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					&buf_info->phys, GFP_KERNEL);
1505b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!buf_info->virt)
1506b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1507b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1508b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* copy the linear bsg buffer to buf_info */
1509b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	memset(buf_info->virt, 0, buf_info->size);
1510b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	memcpy(buf_info->virt, payload_kbuf, buf_info->size);
1511b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1512b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/*
1513b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * Setup SG table
1514b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 */
1515b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_table->sg_len = buf_info->size;
1516b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_table->sg_addr = (void *)(size_t) buf_info->phys;
1517b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1518b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	*num_sgles = sge_num;
1519b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1520b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return buf_base;
1521b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1522b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout_free_mem:
1523b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(buf_base);
1524b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return NULL;
1525b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1526b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1527b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipativoid
1528b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_free_mem(struct bfad_s *bfad, struct bfad_buf_info *buf_base,
1529b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   uint32_t num_sgles)
1530b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1531b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int i;
1532b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_buf_info *buf_info = buf_base;
1533b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1534b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (buf_base) {
1535b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		for (i = 0; i < num_sgles; buf_info++, i++) {
1536b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			if (buf_info->virt != NULL)
1537b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				dma_free_coherent(&bfad->pcidev->dev,
1538b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					buf_info->size, buf_info->virt,
1539b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					buf_info->phys);
1540b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		}
1541b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		kfree(buf_base);
1542b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1543b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1544b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1545b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
1546b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_bsg_send(struct fc_bsg_job *job, struct bfad_fcxp *drv_fcxp,
1547b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   bfa_bsg_fcpt_t *bsg_fcpt)
1548b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1549b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcxp_s *hal_fcxp;
1550b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_s	*bfad = drv_fcxp->port->bfad;
1551b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
1552b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint8_t	lp_tag;
1553b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1554b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1555b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1556b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Allocate bfa_fcxp structure */
1557b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	hal_fcxp = bfa_fcxp_alloc(drv_fcxp, &bfad->bfa,
1558b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  drv_fcxp->num_req_sgles,
1559b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  drv_fcxp->num_rsp_sgles,
1560b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_req_sgaddr_cb,
1561b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_req_sglen_cb,
1562b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_rsp_sgaddr_cb,
1563b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_rsp_sglen_cb);
1564b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!hal_fcxp) {
1565b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_trc(bfad, 0);
1566b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1567b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		return BFA_STATUS_ENOMEM;
1568b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1569b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1570b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->bfa_fcxp = hal_fcxp;
1571b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1572b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	lp_tag = bfa_lps_get_tag_from_pid(&bfad->bfa, bsg_fcpt->fchs.s_id);
1573b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1574b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcxp_send(hal_fcxp, drv_fcxp->bfa_rport, bsg_fcpt->vf_id, lp_tag,
1575b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      bsg_fcpt->cts, bsg_fcpt->cos,
1576b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      job->request_payload.payload_len,
1577b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      &bsg_fcpt->fchs, bfad_send_fcpt_cb, bfad,
1578b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      job->reply_payload.payload_len, bsg_fcpt->tsecs);
1579b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1580b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1581b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1582b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return BFA_STATUS_OK;
1583b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1584b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1585b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
1586b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_els_ct_request(struct fc_bsg_job *job)
1587b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1588b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_data *bsg_data;
1589b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_im_port_s *im_port =
1590b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(struct bfad_im_port_s *) job->shost->hostdata[0];
1591b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_s *bfad = im_port->bfad;
1592b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_bsg_fcpt_t *bsg_fcpt;
1593b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp    *drv_fcxp;
1594b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
1595b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_rport_s *fcs_rport;
1596b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t command_type = job->request->msgcode;
1597b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long flags;
1598b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_buf_info *rsp_buf_info;
1599b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	void *req_kbuf = NULL, *rsp_kbuf = NULL;
1600b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int rc = -EINVAL;
1601b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1602b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply_len  = sizeof(uint32_t);	/* Atleast uint32_t reply_len */
1603b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->reply_payload_rcv_len = 0;
1604b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1605b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Get the payload passed in from userspace */
1606b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bsg_data = (struct bfa_bsg_data *) (((char *)job->request) +
1607b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					sizeof(struct fc_bsg_request));
1608b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (bsg_data == NULL)
1609b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
1610b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1611b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/*
1612b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * Allocate buffer for bsg_fcpt and do a copy_from_user op for payload
1613b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * buffer of size bsg_data->payload_len
1614b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 */
1615b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bsg_fcpt = (struct bfa_bsg_fcpt_s *)
1616b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   kzalloc(bsg_data->payload_len, GFP_KERNEL);
1617b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!bsg_fcpt)
1618b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
1619b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1620b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (copy_from_user((uint8_t *)bsg_fcpt, bsg_data->payload,
1621b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bsg_data->payload_len)) {
1622b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		kfree(bsg_fcpt);
1623b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
1624b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1625b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1626b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp = kzalloc(sizeof(struct bfad_fcxp), GFP_KERNEL);
1627b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_fcxp == NULL) {
1628b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
1629b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
1630b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1631b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1632b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1633b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, bsg_fcpt->vf_id,
1634b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					bsg_fcpt->lpwwn);
1635b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_port == NULL) {
1636b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = BFA_STATUS_UNKNOWN_LWWN;
1637b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1638b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1639b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1640b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1641b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Check if the port is online before sending FC Passthru cmd */
1642b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!bfa_fcs_lport_is_online(fcs_port)) {
1643b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = BFA_STATUS_PORT_OFFLINE;
1644b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1645b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1646b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1647b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1648b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->port = fcs_port->bfad_port;
1649b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1650b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_fcxp->port->bfad == 0)
1651b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		drv_fcxp->port->bfad = bfad;
1652b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1653b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Fetch the bfa_rport - if nexus needed */
1654b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (command_type == FC_BSG_HST_ELS_NOLOGIN ||
1655b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	    command_type == FC_BSG_HST_CT) {
1656b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* BSG HST commands: no nexus needed */
1657b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		drv_fcxp->bfa_rport = NULL;
1658b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1659b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else if (command_type == FC_BSG_RPT_ELS ||
1660b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   command_type == FC_BSG_RPT_CT) {
1661b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* BSG RPT commands: nexus needed */
1662b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		fcs_rport = bfa_fcs_lport_get_rport_by_pwwn(fcs_port,
1663b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati							    bsg_fcpt->dpwwn);
1664b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		if (fcs_rport == NULL) {
1665b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			bsg_fcpt->status = BFA_STATUS_UNKNOWN_RWWN;
1666b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1667b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			goto out_free_mem;
1668b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		}
1669b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1670b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		drv_fcxp->bfa_rport = fcs_rport->bfa_rport;
1671b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1672b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else { /* Unknown BSG msgcode; return -EINVAL */
1673b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1674b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1675b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1676b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1677b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1678b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1679b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* allocate memory for req / rsp buffers */
1680b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	req_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL);
1681b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!req_kbuf) {
1682b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt request buffer alloc failed\n",
1683b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
1684b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
1685b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1686b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1687b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1688b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rsp_kbuf = kzalloc(job->reply_payload.payload_len, GFP_KERNEL);
1689b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!rsp_kbuf) {
1690b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt response buffer alloc failed\n",
1691b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
1692b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
1693b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1694b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1695b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1696b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* map req sg - copy the sg_list passed in to the linear buffer */
1697b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_to_buffer(job->request_payload.sg_list,
1698b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.sg_cnt, req_kbuf,
1699b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.payload_len);
1700b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1701b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->reqbuf_info = bfad_fcxp_map_sg(bfad, req_kbuf,
1702b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					job->request_payload.payload_len,
1703b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					&drv_fcxp->num_req_sgles);
1704b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!drv_fcxp->reqbuf_info) {
1705b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt request fcxp_map_sg failed\n",
1706b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
1707b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
1708b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1709b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1710b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1711b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->req_sge = (struct bfa_sge_s *)
1712b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (((uint8_t *)drv_fcxp->reqbuf_info) +
1713b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (sizeof(struct bfad_buf_info) *
1714b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					drv_fcxp->num_req_sgles));
1715b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1716b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* map rsp sg */
1717b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->rspbuf_info = bfad_fcxp_map_sg(bfad, rsp_kbuf,
1718b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					job->reply_payload.payload_len,
1719b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					&drv_fcxp->num_rsp_sgles);
1720b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!drv_fcxp->rspbuf_info) {
1721b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt response fcxp_map_sg failed\n",
1722b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
1723b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
1724b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1725b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1726b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1727b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rsp_buf_info = (struct bfad_buf_info *)drv_fcxp->rspbuf_info;
1728b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->rsp_sge = (struct bfa_sge_s  *)
1729b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (((uint8_t *)drv_fcxp->rspbuf_info) +
1730b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (sizeof(struct bfad_buf_info) *
1731b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					drv_fcxp->num_rsp_sgles));
1732b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1733b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* fcxp send */
1734b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	init_completion(&drv_fcxp->comp);
1735b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rc = bfad_fcxp_bsg_send(job, drv_fcxp, bsg_fcpt);
1736b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (rc == BFA_STATUS_OK) {
1737b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		wait_for_completion(&drv_fcxp->comp);
1738b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = drv_fcxp->req_status;
1739b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else {
1740b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = rc;
1741b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1742b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1743b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1744b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* fill the job->reply data */
1745b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_fcxp->req_status == BFA_STATUS_OK) {
1746b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply_len = drv_fcxp->rsp_len;
1747b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_payload_rcv_len = drv_fcxp->rsp_len;
1748b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
1749b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else {
1750b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_payload_rcv_len =
1751b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					sizeof(struct fc_bsg_ctels_reply);
1752b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply_len = sizeof(uint32_t);
1753b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_data.ctels_reply.status =
1754b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati						FC_CTELS_STATUS_REJECT;
1755b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1756b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1757b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Copy the response data to the reply_payload sg list */
1758b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_from_buffer(job->reply_payload.sg_list,
1759b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.sg_cnt,
1760b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (uint8_t *)rsp_buf_info->virt,
1761b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.payload_len);
1762b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1763b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout_free_mem:
1764b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfad_fcxp_free_mem(bfad, drv_fcxp->rspbuf_info,
1765b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			   drv_fcxp->num_rsp_sgles);
1766b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfad_fcxp_free_mem(bfad, drv_fcxp->reqbuf_info,
1767b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			   drv_fcxp->num_req_sgles);
1768b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(req_kbuf);
1769b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(rsp_kbuf);
1770b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1771b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Need a copy to user op */
1772b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (copy_to_user(bsg_data->payload, (void *) bsg_fcpt,
1773b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			 bsg_data->payload_len))
1774b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -EIO;
1775b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1776b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(bsg_fcpt);
1777b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(drv_fcxp);
1778b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
1779b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->result = rc;
1780b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1781b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (rc == BFA_STATUS_OK)
1782b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->job_done(job);
1783b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1784b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
1785b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1786b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1787b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
1788b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_request(struct fc_bsg_job *job)
1789b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1790b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t rc = BFA_STATUS_OK;
1791b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1792b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Increment the bfa module refcnt - if bsg request is in service */
1793b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfad_im_bsg_get_kobject(job);
1794b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1795b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	switch (job->request->msgcode) {
1796b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_HST_VENDOR:
1797b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* Process BSG HST Vendor requests */
1798b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_im_bsg_vendor_request(job);
1799b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1800b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_HST_ELS_NOLOGIN:
1801b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_RPT_ELS:
1802b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_HST_CT:
1803b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_RPT_CT:
1804b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* Process BSG ELS/CT commands */
1805b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_im_bsg_els_ct_request(job);
1806b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1807b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	default:
1808b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->result = rc = -EINVAL;
1809b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_payload_rcv_len = 0;
1810b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1811b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1812b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1813b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Decrement the bfa module refcnt - on completion of bsg request */
1814b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfad_im_bsg_put_kobject(job);
1815b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1816b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
1817b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1818b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1819b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
1820b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_timeout(struct fc_bsg_job *job)
1821b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1822b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Don't complete the BSG job request - return -EAGAIN
1823b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * to reset bsg job timeout : for ELS/CT pass thru we
1824b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * already have timer to track the request.
1825b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 */
1826b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return -EAGAIN;
1827b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1828