bfad_bsg.c revision 3350d98d6d072fc4ac3622e61dc3dc351ef01dc5
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
12173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
12183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_temp(struct bfad_s *bfad, void *cmd)
12193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
12203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_get_temp_s *iocmd =
12213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_get_temp_s *)cmd;
12223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
12233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long	flags;
12243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
12253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
12263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
12273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_diag_tsensor_query(BFA_DIAG_MOD(&bfad->bfa),
12283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				&iocmd->result, bfad_hcb_comp, &fcomp);
12293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
12313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
12323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
12333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
12343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
12353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
12363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
12373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
12383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
12393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
12403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_memtest(struct bfad_s *bfad, void *cmd)
12413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
12423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_memtest_s *iocmd =
12433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_memtest_s *)cmd;
12443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
12453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
12463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
12473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
12483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
12493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_diag_memtest(BFA_DIAG_MOD(&bfad->bfa),
12503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				&iocmd->memtest, iocmd->pat,
12513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				&iocmd->result, bfad_hcb_comp, &fcomp);
12523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
12543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
12553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
12563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
12573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
12583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
12593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
12603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
12613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
12623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
12633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_loopback(struct bfad_s *bfad, void *cmd)
12643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
12653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_loopback_s *iocmd =
12663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_loopback_s *)cmd;
12673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
12683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
12693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
12703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
12713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
12723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_fcdiag_loopback(&bfad->bfa, iocmd->opmode,
12733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				iocmd->speed, iocmd->lpcnt, iocmd->pat,
12743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				&iocmd->result, bfad_hcb_comp, &fcomp);
12753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
12773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
12783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
12793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
12803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
12813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
12823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
12833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
12843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
12853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
12863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_fwping(struct bfad_s *bfad, void *cmd)
12873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
12883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_fwping_s *iocmd =
12893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_fwping_s *)cmd;
12903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
12913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
12923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
12933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
12943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
12953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_diag_fwping(BFA_DIAG_MOD(&bfad->bfa), iocmd->cnt,
12963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				iocmd->pattern, &iocmd->result,
12973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				bfad_hcb_comp, &fcomp);
12983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
13003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
13013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
13023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, 0x77771);
13033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
13043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
13053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
13063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
13073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
13083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
13103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_queuetest(struct bfad_s *bfad, void *cmd)
13113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
13123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_qtest_s *iocmd = (struct bfa_bsg_diag_qtest_s *)cmd;
13133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
13143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
13153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
13173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
13183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_fcdiag_queuetest(&bfad->bfa, iocmd->force,
13193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				iocmd->queue, &iocmd->result,
13203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				bfad_hcb_comp, &fcomp);
13213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
13223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
13233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
13243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
13253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
13263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
13273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
13283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
13293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
13313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_sfp(struct bfad_s *bfad, void *cmd)
13323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
13333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_sfp_show_s *iocmd =
13343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_sfp_show_s *)cmd;
13353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
13363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
13373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
13393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
13403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_sfp_show(BFA_SFP_MOD(&bfad->bfa), &iocmd->sfp,
13413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				bfad_hcb_comp, &fcomp);
13423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
13433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
13443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
13453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
13463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
13473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
13483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
13493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
13503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
13513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
13523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
13543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_led(struct bfad_s *bfad, void *cmd)
13553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
13563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_led_s *iocmd = (struct bfa_bsg_diag_led_s *)cmd;
13573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
13583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
13603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_diag_ledtest(BFA_DIAG_MOD(&bfad->bfa),
13613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				&iocmd->ledtest);
13623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
13633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
13643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
13653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
13673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_beacon_lport(struct bfad_s *bfad, void *cmd)
13683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
13693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_beacon_s *iocmd =
13703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_beacon_s *)cmd;
13713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long	flags;
13723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
13743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_diag_beacon_port(BFA_DIAG_MOD(&bfad->bfa),
13753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				iocmd->beacon, iocmd->link_e2e_beacon,
13763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				iocmd->second);
13773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
13783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
13793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
13803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
13823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_lb_stat(struct bfad_s *bfad, void *cmd)
13833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
13843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_lb_stat_s *iocmd =
13853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_lb_stat_s *)cmd;
13863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long	flags;
13873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
13893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_fcdiag_lb_is_running(&bfad->bfa);
13903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
13913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
13923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
13943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
13953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
13963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint
13973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_get_attr(struct bfad_s *bfad, void *cmd)
13983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
13993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_bsg_phy_attr_s *iocmd =
14003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			(struct bfa_bsg_phy_attr_s *)cmd;
14013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfad_hal_comp fcomp;
14023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	unsigned long	flags;
14033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
14043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	init_completion(&fcomp.comp);
14053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
14063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = bfa_phy_get_attr(BFA_PHY(&bfad->bfa), iocmd->instance,
14073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				&iocmd->attr, bfad_hcb_comp, &fcomp);
14083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
14093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
14103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		goto out;
14113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	wait_for_completion(&fcomp.comp);
14123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = fcomp.status;
14133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout:
14143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return 0;
14153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
14163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
14173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint
14183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_get_stats(struct bfad_s *bfad, void *cmd)
14193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
14203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_bsg_phy_stats_s *iocmd =
14213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			(struct bfa_bsg_phy_stats_s *)cmd;
14223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfad_hal_comp fcomp;
14233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	unsigned long	flags;
14243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
14253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	init_completion(&fcomp.comp);
14263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
14273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = bfa_phy_get_stats(BFA_PHY(&bfad->bfa), iocmd->instance,
14283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				&iocmd->stats, bfad_hcb_comp, &fcomp);
14293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
14303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
14313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		goto out;
14323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	wait_for_completion(&fcomp.comp);
14333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = fcomp.status;
14343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout:
14353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return 0;
14363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
14373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
14383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint
14393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_read(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
14403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
14413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd;
14423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfad_hal_comp fcomp;
14433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	void	*iocmd_bufptr;
14443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	unsigned long	flags;
14453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
14463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
14473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			sizeof(struct bfa_bsg_phy_s),
14483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			iocmd->bufsz) != BFA_STATUS_OK) {
14493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
14503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return 0;
14513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
14523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
14533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s);
14543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	init_completion(&fcomp.comp);
14553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
14563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = bfa_phy_read(BFA_PHY(&bfad->bfa),
14573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				iocmd->instance, iocmd_bufptr, iocmd->bufsz,
14583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				0, bfad_hcb_comp, &fcomp);
14593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
14603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
14613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		goto out;
14623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	wait_for_completion(&fcomp.comp);
14633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = fcomp.status;
14643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
14653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		goto out;
14663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout:
14673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return 0;
14683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
14693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
14703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint
14713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_update(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
14723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
14733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd;
14743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	void	*iocmd_bufptr;
14753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfad_hal_comp fcomp;
14763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	unsigned long	flags;
14773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
14783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
14793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			sizeof(struct bfa_bsg_phy_s),
14803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			iocmd->bufsz) != BFA_STATUS_OK) {
14813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
14823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return 0;
14833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
14843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
14853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s);
14863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	init_completion(&fcomp.comp);
14873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
14883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = bfa_phy_update(BFA_PHY(&bfad->bfa),
14893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				iocmd->instance, iocmd_bufptr, iocmd->bufsz,
14903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				0, bfad_hcb_comp, &fcomp);
14913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
14923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
14933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		goto out;
14943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	wait_for_completion(&fcomp.comp);
14953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = fcomp.status;
14963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout:
14973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return 0;
14983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
14993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
1500b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
1501b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd,
1502b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		unsigned int payload_len)
1503b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1504b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int rc = EINVAL;
1505b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1506b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	switch (cmd) {
1507601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_ENABLE:
1508601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_enable(bfad, iocmd);
1509601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1510601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_DISABLE:
1511601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_disable(bfad, iocmd);
1512601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1513b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_IOC_GET_INFO:
1514b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_ioc_get_info(bfad, iocmd);
1515b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1516b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_IOC_GET_ATTR:
1517b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_ioc_get_attr(bfad, iocmd);
1518b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1519601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_GET_STATS:
1520601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_get_stats(bfad, iocmd);
1521601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1522601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_GET_FWSTATS:
1523601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_get_fwstats(bfad, iocmd, payload_len);
1524601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1525601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOCFC_GET_ATTR:
1526601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_iocfc_get_attr(bfad, iocmd);
1527601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1528601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOCFC_SET_INTR:
1529601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_iocfc_set_intr(bfad, iocmd);
1530601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1531601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_PORT_ENABLE:
1532601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_port_enable(bfad, iocmd);
1533601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1534601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_PORT_DISABLE:
1535601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_port_disable(bfad, iocmd);
1536601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1537b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_PORT_GET_ATTR:
1538b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_port_get_attr(bfad, iocmd);
1539b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1540601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_PORT_GET_STATS:
1541601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_port_get_stats(bfad, iocmd, payload_len);
1542601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1543b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_LPORT_GET_ATTR:
1544b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_lport_get_attr(bfad, iocmd);
1545b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1546601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_LPORT_GET_STATS:
1547601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_lport_get_stats(bfad, iocmd);
1548601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1549601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_LPORT_GET_IOSTATS:
1550601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_lport_get_iostats(bfad, iocmd);
1551601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1552601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_LPORT_GET_RPORTS:
1553601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_lport_get_rports(bfad, iocmd, payload_len);
1554601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1555601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_RPORT_GET_ATTR:
1556601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_rport_get_attr(bfad, iocmd);
1557601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1558b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_RPORT_GET_ADDR:
1559b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_rport_get_addr(bfad, iocmd);
1560b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1561601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_RPORT_GET_STATS:
1562601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_rport_get_stats(bfad, iocmd);
1563601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1564b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_FABRIC_GET_LPORTS:
1565b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_fabric_get_lports(bfad, iocmd, payload_len);
1566b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1567601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPIM_MODSTATS:
1568601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcpim_get_modstats(bfad, iocmd);
1569601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1570601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPIM_DEL_ITN_STATS:
1571601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcpim_get_del_itn_stats(bfad, iocmd);
1572601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1573b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_ITNIM_GET_ATTR:
1574b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_itnim_get_attr(bfad, iocmd);
1575b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1576601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_ITNIM_GET_IOSTATS:
1577601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_itnim_get_iostats(bfad, iocmd);
1578601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1579601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_ITNIM_GET_ITNSTATS:
1580601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_itnim_get_itnstats(bfad, iocmd);
1581601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1582601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPORT_ENABLE:
1583601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcport_enable(bfad, iocmd);
1584601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
1585601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPORT_DISABLE:
1586601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcport_disable(bfad, iocmd);
1587601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
15881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_IOC_PCIFN_CFG:
15891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_ioc_get_pcifn_cfg(bfad, iocmd);
15901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
15911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PCIFN_CREATE:
15921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_pcifn_create(bfad, iocmd);
15931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
15941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PCIFN_DELETE:
15951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_pcifn_delete(bfad, iocmd);
15961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
15971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PCIFN_BW:
15981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_pcifn_bw(bfad, iocmd);
15991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
16001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_ADAPTER_CFG_MODE:
16011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_adapter_cfg_mode(bfad, iocmd);
16021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
16031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PORT_CFG_MODE:
16041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_port_cfg_mode(bfad, iocmd);
16051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
16061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_FLASH_ENABLE_OPTROM:
16071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_FLASH_DISABLE_OPTROM:
16081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_ablk_optrom(bfad, cmd, iocmd);
16091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
1610a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	case IOCMD_FAA_ENABLE:
1611a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		rc = bfad_iocmd_faa_enable(bfad, iocmd);
1612a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		break;
1613a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	case IOCMD_FAA_DISABLE:
1614a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		rc = bfad_iocmd_faa_disable(bfad, iocmd);
1615a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		break;
1616a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	case IOCMD_FAA_QUERY:
1617a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		rc = bfad_iocmd_faa_query(bfad, iocmd);
1618a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		break;
1619148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case IOCMD_CEE_GET_ATTR:
1620148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		rc = bfad_iocmd_cee_attr(bfad, iocmd, payload_len);
1621148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
1622148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case IOCMD_CEE_GET_STATS:
1623148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		rc = bfad_iocmd_cee_get_stats(bfad, iocmd, payload_len);
1624148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
1625148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case IOCMD_CEE_RESET_STATS:
1626148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		rc = bfad_iocmd_cee_reset_stats(bfad, iocmd);
1627148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
162851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	case IOCMD_SFP_MEDIA:
162951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		rc = bfad_iocmd_sfp_media(bfad, iocmd);
163051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		 break;
163151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	case IOCMD_SFP_SPEED:
163251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		rc = bfad_iocmd_sfp_speed(bfad, iocmd);
163351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		break;
16345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_GET_ATTR:
16355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_get_attr(bfad, iocmd);
16365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
16375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_ERASE_PART:
16385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_erase_part(bfad, iocmd);
16395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
16405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_UPDATE_PART:
16415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_update_part(bfad, iocmd, payload_len);
16425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
16435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_READ_PART:
16445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_read_part(bfad, iocmd, payload_len);
16455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
16463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_TEMP:
16473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_temp(bfad, iocmd);
16483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
16493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_MEMTEST:
16503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_memtest(bfad, iocmd);
16513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
16523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_LOOPBACK:
16533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_loopback(bfad, iocmd);
16543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
16553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_FWPING:
16563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_fwping(bfad, iocmd);
16573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
16583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_QUEUETEST:
16593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_queuetest(bfad, iocmd);
16603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
16613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_SFP:
16623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_sfp(bfad, iocmd);
16633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
16643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_LED:
16653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_led(bfad, iocmd);
16663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
16673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_BEACON_LPORT:
16683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_beacon_lport(bfad, iocmd);
16693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
16703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_LB_STAT:
16713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_lb_stat(bfad, iocmd);
16723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
16733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case IOCMD_PHY_GET_ATTR:
16743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		rc = bfad_iocmd_phy_get_attr(bfad, iocmd);
16753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
16763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case IOCMD_PHY_GET_STATS:
16773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		rc = bfad_iocmd_phy_get_stats(bfad, iocmd);
16783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
16793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case IOCMD_PHY_UPDATE_FW:
16803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		rc = bfad_iocmd_phy_update(bfad, iocmd, payload_len);
16813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
16823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case IOCMD_PHY_READ_FW:
16833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		rc = bfad_iocmd_phy_read(bfad, iocmd, payload_len);
16843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
1685b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	default:
1686b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = EINVAL;
1687b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
1688b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1689b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return -rc;
1690b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1691b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1692b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
1693b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_vendor_request(struct fc_bsg_job *job)
1694b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1695b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t vendor_cmd = job->request->rqst_data.h_vendor.vendor_cmd[0];
1696b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_im_port_s *im_port =
1697b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(struct bfad_im_port_s *) job->shost->hostdata[0];
1698b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_s *bfad = im_port->bfad;
1699b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	void *payload_kbuf;
1700b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int rc = -EINVAL;
1701b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1702b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Allocate a temp buffer to hold the passed in user space command */
1703b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	payload_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL);
1704b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!payload_kbuf) {
1705b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
1706b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
1707b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1708b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1709b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Copy the sg_list passed in to a linear buffer: holds the cmnd data */
1710b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_to_buffer(job->request_payload.sg_list,
1711b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.sg_cnt, payload_kbuf,
1712b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.payload_len);
1713b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1714b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Invoke IOCMD handler - to handle all the vendor command requests */
1715b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rc = bfad_iocmd_handler(bfad, vendor_cmd, payload_kbuf,
1716b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				job->request_payload.payload_len);
1717b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (rc != BFA_STATUS_OK)
1718b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto error;
1719b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1720b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Copy the response data to the job->reply_payload sg_list */
1721b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_from_buffer(job->reply_payload.sg_list,
1722b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.sg_cnt,
1723b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    payload_kbuf,
1724b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.payload_len);
1725b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1726b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* free the command buffer */
1727b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(payload_kbuf);
1728b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1729b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Fill the BSG job reply data */
1730b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply_len = job->reply_payload.payload_len;
1731b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->reply_payload_rcv_len = job->reply_payload.payload_len;
1732b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->result = rc;
1733b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1734b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->job_done(job);
1735b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
1736b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatierror:
1737b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* free the command buffer */
1738b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(payload_kbuf);
1739b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
1740b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->result = rc;
1741b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply_len = sizeof(uint32_t);
1742b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->reply_payload_rcv_len = 0;
1743b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
1744b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1745b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1746b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/* FC passthru call backs */
1747b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu64
1748b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_req_sgaddr_cb(void *bfad_fcxp, int sgeid)
1749b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1750b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
1751b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s  *sge;
1752b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	u64	addr;
1753b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1754b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->req_sge + sgeid;
1755b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	addr = (u64)(size_t) sge->sg_addr;
1756b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return addr;
1757b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1758b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1759b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu32
1760b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_req_sglen_cb(void *bfad_fcxp, int sgeid)
1761b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1762b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
1763b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sge;
1764b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1765b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->req_sge + sgeid;
1766b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return sge->sg_len;
1767b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1768b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1769b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu64
1770b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_rsp_sgaddr_cb(void *bfad_fcxp, int sgeid)
1771b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1772b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
1773b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sge;
1774b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	u64	addr;
1775b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1776b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->rsp_sge + sgeid;
1777b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	addr = (u64)(size_t) sge->sg_addr;
1778b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return addr;
1779b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1780b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1781b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu32
1782b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_rsp_sglen_cb(void *bfad_fcxp, int sgeid)
1783b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1784b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
1785b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sge;
1786b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1787b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->rsp_sge + sgeid;
1788b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return sge->sg_len;
1789b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1790b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1791b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipativoid
1792b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_send_fcpt_cb(void *bfad_fcxp, struct bfa_fcxp_s *fcxp, void *cbarg,
1793b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_status_t req_status, u32 rsp_len, u32 resid_len,
1794b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		struct fchs_s *rsp_fchs)
1795b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1796b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp *drv_fcxp = bfad_fcxp;
1797b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1798b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->req_status = req_status;
1799b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->rsp_len = rsp_len;
1800b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1801b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* bfa_fcxp will be automatically freed by BFA */
1802b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->bfa_fcxp = NULL;
1803b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	complete(&drv_fcxp->comp);
1804b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1805b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1806b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistruct bfad_buf_info *
1807b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_map_sg(struct bfad_s *bfad, void *payload_kbuf,
1808b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		 uint32_t payload_len, uint32_t *num_sgles)
1809b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1810b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_buf_info	*buf_base, *buf_info;
1811b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sg_table;
1812b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int sge_num = 1;
1813b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1814b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_base = kzalloc((sizeof(struct bfad_buf_info) +
1815b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			   sizeof(struct bfa_sge_s)) * sge_num, GFP_KERNEL);
1816b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!buf_base)
1817b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		return NULL;
1818b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1819b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_table = (struct bfa_sge_s *) (((uint8_t *)buf_base) +
1820b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(sizeof(struct bfad_buf_info) * sge_num));
1821b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1822b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Allocate dma coherent memory */
1823b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_info = buf_base;
1824b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_info->size = payload_len;
1825b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_info->virt = dma_alloc_coherent(&bfad->pcidev->dev, buf_info->size,
1826b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					&buf_info->phys, GFP_KERNEL);
1827b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!buf_info->virt)
1828b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1829b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1830b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* copy the linear bsg buffer to buf_info */
1831b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	memset(buf_info->virt, 0, buf_info->size);
1832b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	memcpy(buf_info->virt, payload_kbuf, buf_info->size);
1833b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1834b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/*
1835b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * Setup SG table
1836b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 */
1837b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_table->sg_len = buf_info->size;
1838b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_table->sg_addr = (void *)(size_t) buf_info->phys;
1839b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1840b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	*num_sgles = sge_num;
1841b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1842b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return buf_base;
1843b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1844b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout_free_mem:
1845b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(buf_base);
1846b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return NULL;
1847b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1848b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1849b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipativoid
1850b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_free_mem(struct bfad_s *bfad, struct bfad_buf_info *buf_base,
1851b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   uint32_t num_sgles)
1852b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1853b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int i;
1854b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_buf_info *buf_info = buf_base;
1855b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1856b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (buf_base) {
1857b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		for (i = 0; i < num_sgles; buf_info++, i++) {
1858b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			if (buf_info->virt != NULL)
1859b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				dma_free_coherent(&bfad->pcidev->dev,
1860b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					buf_info->size, buf_info->virt,
1861b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					buf_info->phys);
1862b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		}
1863b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		kfree(buf_base);
1864b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1865b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1866b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1867b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
1868b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_bsg_send(struct fc_bsg_job *job, struct bfad_fcxp *drv_fcxp,
1869b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   bfa_bsg_fcpt_t *bsg_fcpt)
1870b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1871b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcxp_s *hal_fcxp;
1872b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_s	*bfad = drv_fcxp->port->bfad;
1873b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
1874b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint8_t	lp_tag;
1875b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1876b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1877b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1878b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Allocate bfa_fcxp structure */
1879b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	hal_fcxp = bfa_fcxp_alloc(drv_fcxp, &bfad->bfa,
1880b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  drv_fcxp->num_req_sgles,
1881b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  drv_fcxp->num_rsp_sgles,
1882b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_req_sgaddr_cb,
1883b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_req_sglen_cb,
1884b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_rsp_sgaddr_cb,
1885b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_rsp_sglen_cb);
1886b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!hal_fcxp) {
1887b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_trc(bfad, 0);
1888b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1889b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		return BFA_STATUS_ENOMEM;
1890b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1891b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1892b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->bfa_fcxp = hal_fcxp;
1893b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1894b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	lp_tag = bfa_lps_get_tag_from_pid(&bfad->bfa, bsg_fcpt->fchs.s_id);
1895b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1896b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcxp_send(hal_fcxp, drv_fcxp->bfa_rport, bsg_fcpt->vf_id, lp_tag,
1897b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      bsg_fcpt->cts, bsg_fcpt->cos,
1898b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      job->request_payload.payload_len,
1899b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      &bsg_fcpt->fchs, bfad_send_fcpt_cb, bfad,
1900b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      job->reply_payload.payload_len, bsg_fcpt->tsecs);
1901b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1902b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1903b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1904b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return BFA_STATUS_OK;
1905b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1906b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1907b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
1908b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_els_ct_request(struct fc_bsg_job *job)
1909b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
1910b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_data *bsg_data;
1911b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_im_port_s *im_port =
1912b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(struct bfad_im_port_s *) job->shost->hostdata[0];
1913b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_s *bfad = im_port->bfad;
1914b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_bsg_fcpt_t *bsg_fcpt;
1915b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp    *drv_fcxp;
1916b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
1917b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_rport_s *fcs_rport;
1918b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t command_type = job->request->msgcode;
1919b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long flags;
1920b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_buf_info *rsp_buf_info;
1921b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	void *req_kbuf = NULL, *rsp_kbuf = NULL;
1922b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int rc = -EINVAL;
1923b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1924b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply_len  = sizeof(uint32_t);	/* Atleast uint32_t reply_len */
1925b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->reply_payload_rcv_len = 0;
1926b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1927b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Get the payload passed in from userspace */
1928b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bsg_data = (struct bfa_bsg_data *) (((char *)job->request) +
1929b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					sizeof(struct fc_bsg_request));
1930b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (bsg_data == NULL)
1931b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
1932b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1933b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/*
1934b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * Allocate buffer for bsg_fcpt and do a copy_from_user op for payload
1935b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * buffer of size bsg_data->payload_len
1936b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 */
1937b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bsg_fcpt = (struct bfa_bsg_fcpt_s *)
1938b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   kzalloc(bsg_data->payload_len, GFP_KERNEL);
1939b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!bsg_fcpt)
1940b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
1941b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1942b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (copy_from_user((uint8_t *)bsg_fcpt, bsg_data->payload,
1943b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bsg_data->payload_len)) {
1944b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		kfree(bsg_fcpt);
1945b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
1946b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1947b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1948b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp = kzalloc(sizeof(struct bfad_fcxp), GFP_KERNEL);
1949b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_fcxp == NULL) {
1950b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
1951b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
1952b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1953b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1954b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1955b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, bsg_fcpt->vf_id,
1956b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					bsg_fcpt->lpwwn);
1957b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_port == NULL) {
1958b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = BFA_STATUS_UNKNOWN_LWWN;
1959b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1960b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1961b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1962b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1963b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Check if the port is online before sending FC Passthru cmd */
1964b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!bfa_fcs_lport_is_online(fcs_port)) {
1965b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = BFA_STATUS_PORT_OFFLINE;
1966b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1967b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1968b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1969b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1970b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->port = fcs_port->bfad_port;
1971b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1972b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_fcxp->port->bfad == 0)
1973b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		drv_fcxp->port->bfad = bfad;
1974b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1975b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Fetch the bfa_rport - if nexus needed */
1976b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (command_type == FC_BSG_HST_ELS_NOLOGIN ||
1977b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	    command_type == FC_BSG_HST_CT) {
1978b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* BSG HST commands: no nexus needed */
1979b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		drv_fcxp->bfa_rport = NULL;
1980b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1981b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else if (command_type == FC_BSG_RPT_ELS ||
1982b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   command_type == FC_BSG_RPT_CT) {
1983b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* BSG RPT commands: nexus needed */
1984b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		fcs_rport = bfa_fcs_lport_get_rport_by_pwwn(fcs_port,
1985b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati							    bsg_fcpt->dpwwn);
1986b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		if (fcs_rport == NULL) {
1987b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			bsg_fcpt->status = BFA_STATUS_UNKNOWN_RWWN;
1988b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1989b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			goto out_free_mem;
1990b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		}
1991b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1992b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		drv_fcxp->bfa_rport = fcs_rport->bfa_rport;
1993b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1994b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else { /* Unknown BSG msgcode; return -EINVAL */
1995b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1996b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
1997b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
1998b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1999b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2000b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2001b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* allocate memory for req / rsp buffers */
2002b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	req_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL);
2003b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!req_kbuf) {
2004b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt request buffer alloc failed\n",
2005b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
2006b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
2007b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
2008b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
2009b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2010b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rsp_kbuf = kzalloc(job->reply_payload.payload_len, GFP_KERNEL);
2011b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!rsp_kbuf) {
2012b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt response buffer alloc failed\n",
2013b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
2014b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
2015b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
2016b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
2017b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2018b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* map req sg - copy the sg_list passed in to the linear buffer */
2019b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_to_buffer(job->request_payload.sg_list,
2020b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.sg_cnt, req_kbuf,
2021b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.payload_len);
2022b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2023b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->reqbuf_info = bfad_fcxp_map_sg(bfad, req_kbuf,
2024b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					job->request_payload.payload_len,
2025b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					&drv_fcxp->num_req_sgles);
2026b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!drv_fcxp->reqbuf_info) {
2027b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt request fcxp_map_sg failed\n",
2028b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
2029b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
2030b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
2031b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
2032b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2033b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->req_sge = (struct bfa_sge_s *)
2034b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (((uint8_t *)drv_fcxp->reqbuf_info) +
2035b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (sizeof(struct bfad_buf_info) *
2036b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					drv_fcxp->num_req_sgles));
2037b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2038b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* map rsp sg */
2039b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->rspbuf_info = bfad_fcxp_map_sg(bfad, rsp_kbuf,
2040b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					job->reply_payload.payload_len,
2041b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					&drv_fcxp->num_rsp_sgles);
2042b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!drv_fcxp->rspbuf_info) {
2043b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt response fcxp_map_sg failed\n",
2044b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
2045b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
2046b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
2047b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
2048b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2049b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rsp_buf_info = (struct bfad_buf_info *)drv_fcxp->rspbuf_info;
2050b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->rsp_sge = (struct bfa_sge_s  *)
2051b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (((uint8_t *)drv_fcxp->rspbuf_info) +
2052b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (sizeof(struct bfad_buf_info) *
2053b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					drv_fcxp->num_rsp_sgles));
2054b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2055b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* fcxp send */
2056b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	init_completion(&drv_fcxp->comp);
2057b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rc = bfad_fcxp_bsg_send(job, drv_fcxp, bsg_fcpt);
2058b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (rc == BFA_STATUS_OK) {
2059b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		wait_for_completion(&drv_fcxp->comp);
2060b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = drv_fcxp->req_status;
2061b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else {
2062b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = rc;
2063b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
2064b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
2065b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2066b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* fill the job->reply data */
2067b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_fcxp->req_status == BFA_STATUS_OK) {
2068b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply_len = drv_fcxp->rsp_len;
2069b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_payload_rcv_len = drv_fcxp->rsp_len;
2070b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
2071b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else {
2072b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_payload_rcv_len =
2073b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					sizeof(struct fc_bsg_ctels_reply);
2074b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply_len = sizeof(uint32_t);
2075b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_data.ctels_reply.status =
2076b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati						FC_CTELS_STATUS_REJECT;
2077b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
2078b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2079b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Copy the response data to the reply_payload sg list */
2080b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_from_buffer(job->reply_payload.sg_list,
2081b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.sg_cnt,
2082b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (uint8_t *)rsp_buf_info->virt,
2083b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.payload_len);
2084b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2085b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout_free_mem:
2086b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfad_fcxp_free_mem(bfad, drv_fcxp->rspbuf_info,
2087b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			   drv_fcxp->num_rsp_sgles);
2088b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfad_fcxp_free_mem(bfad, drv_fcxp->reqbuf_info,
2089b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			   drv_fcxp->num_req_sgles);
2090b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(req_kbuf);
2091b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(rsp_kbuf);
2092b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2093b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Need a copy to user op */
2094b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (copy_to_user(bsg_data->payload, (void *) bsg_fcpt,
2095b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			 bsg_data->payload_len))
2096b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -EIO;
2097b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2098b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(bsg_fcpt);
2099b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(drv_fcxp);
2100b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
2101b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->result = rc;
2102b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2103b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (rc == BFA_STATUS_OK)
2104b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->job_done(job);
2105b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2106b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
2107b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2108b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2109b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
2110b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_request(struct fc_bsg_job *job)
2111b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2112b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t rc = BFA_STATUS_OK;
2113b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2114b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Increment the bfa module refcnt - if bsg request is in service */
2115b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfad_im_bsg_get_kobject(job);
2116b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2117b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	switch (job->request->msgcode) {
2118b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_HST_VENDOR:
2119b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* Process BSG HST Vendor requests */
2120b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_im_bsg_vendor_request(job);
2121b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2122b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_HST_ELS_NOLOGIN:
2123b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_RPT_ELS:
2124b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_HST_CT:
2125b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_RPT_CT:
2126b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* Process BSG ELS/CT commands */
2127b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_im_bsg_els_ct_request(job);
2128b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2129b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	default:
2130b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->result = rc = -EINVAL;
2131b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_payload_rcv_len = 0;
2132b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2133b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
2134b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2135b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Decrement the bfa module refcnt - on completion of bsg request */
2136b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfad_im_bsg_put_kobject(job);
2137b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2138b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
2139b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2140b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2141b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
2142b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_timeout(struct fc_bsg_job *job)
2143b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2144b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Don't complete the BSG job request - return -EAGAIN
2145b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * to reset bsg job timeout : for ELS/CT pass thru we
2146b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * already have timer to track the request.
2147b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 */
2148b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return -EAGAIN;
2149b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2150