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
25601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
26601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_enable(struct bfad_s *bfad, void *cmd)
27601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
28601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
29601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	int	rc = 0;
30601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
31601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
32601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
33601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	/* If IOC is not in disabled state - return */
34601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (!bfa_ioc_is_disabled(&bfad->bfa.ioc)) {
35601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
36601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_IOC_FAILURE;
37601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return rc;
38601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
39601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
40601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	init_completion(&bfad->enable_comp);
41601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_iocfc_enable(&bfad->bfa);
42601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
43601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
44601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	wait_for_completion(&bfad->enable_comp);
45601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
46601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return rc;
47601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
48601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
49601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
50601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_disable(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 (bfad->disable_active) {
58601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
599afbcfab74d26051702862b57c0115f71477a3ccKrishna Gudipati		return -EBUSY;
60601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
61601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
62601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfad->disable_active = BFA_TRUE;
63601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	init_completion(&bfad->disable_comp);
64601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_iocfc_disable(&bfad->bfa);
65601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
66601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
67601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	wait_for_completion(&bfad->disable_comp);
68601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfad->disable_active = BFA_FALSE;
69601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
70601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
71601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return rc;
72601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
73601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
74b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
75b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_ioc_get_info(struct bfad_s *bfad, void *cmd)
76b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
77b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int	i;
78b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_ioc_info_s *iocmd = (struct bfa_bsg_ioc_info_s *)cmd;
79b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_im_port_s	*im_port;
80b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_port_attr_s	pattr;
81b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
82b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
83b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
84b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcport_get_attr(&bfad->bfa, &pattr);
85b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->nwwn = pattr.nwwn;
86b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->pwwn = pattr.pwwn;
87b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->ioc_type = bfa_get_type(&bfad->bfa);
88b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->mac = bfa_get_mac(&bfad->bfa);
89b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->factory_mac = bfa_get_mfg_mac(&bfad->bfa);
90b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_get_adapter_serial_num(&bfad->bfa, iocmd->serialnum);
91b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->factorynwwn = pattr.factorynwwn;
92b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->factorypwwn = pattr.factorypwwn;
937826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	iocmd->bfad_num = bfad->inst_no;
94b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	im_port = bfad->pport.im_port;
95b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->host = im_port->shost->host_no;
96b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
97b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
98b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->name, bfad->adapter_name);
99b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->port_name, bfad->port_name);
100b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->hwpath, bfad->pci_name);
101b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
102b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* set adapter hw path */
103b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->adapter_hwpath, bfad->pci_name);
104b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	i = strlen(iocmd->adapter_hwpath) - 1;
105b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	while (iocmd->adapter_hwpath[i] != '.')
106b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		i--;
107b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->adapter_hwpath[i] = '\0';
108b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
109b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
110b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
111b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
112b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
113b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_ioc_get_attr(struct bfad_s *bfad, void *cmd)
114b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
115b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_ioc_attr_s *iocmd = (struct bfa_bsg_ioc_attr_s *)cmd;
116b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
117b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
118b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
119b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_ioc_get_attr(&bfad->bfa.ioc, &iocmd->ioc_attr);
120b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
121b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
122b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* fill in driver attr info */
123b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->ioc_attr.driver_attr.driver, BFAD_DRIVER_NAME);
124b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strncpy(iocmd->ioc_attr.driver_attr.driver_ver,
125b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		BFAD_DRIVER_VERSION, BFA_VERSION_LEN);
126b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->ioc_attr.driver_attr.fw_ver,
127b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->ioc_attr.adapter_attr.fw_ver);
128b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strcpy(iocmd->ioc_attr.driver_attr.bios_ver,
129b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->ioc_attr.adapter_attr.optrom_ver);
130b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
131b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* copy chip rev info first otherwise it will be overwritten */
132b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	memcpy(bfad->pci_attr.chip_rev, iocmd->ioc_attr.pci_attr.chip_rev,
133b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		sizeof(bfad->pci_attr.chip_rev));
134b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	memcpy(&iocmd->ioc_attr.pci_attr, &bfad->pci_attr,
135b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		sizeof(struct bfa_ioc_pci_attr_s));
136b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
137b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
138b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
139b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
140b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
141601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
142601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_get_stats(struct bfad_s *bfad, void *cmd)
143601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
144601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_ioc_stats_s *iocmd = (struct bfa_bsg_ioc_stats_s *)cmd;
145601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
146601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_ioc_get_stats(&bfad->bfa, &iocmd->ioc_stats);
147601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
148601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
149601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
150601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
151601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
152601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_ioc_get_fwstats(struct bfad_s *bfad, void *cmd,
153601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			unsigned int payload_len)
154601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
155601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_ioc_fwstats_s *iocmd =
156601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_ioc_fwstats_s *)cmd;
157601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	void	*iocmd_bufptr;
158601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
159601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
160601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
161601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(struct bfa_bsg_ioc_fwstats_s),
162601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(struct bfa_fw_stats_s)) != BFA_STATUS_OK) {
163601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
164601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
165601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
166601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
167601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_ioc_fwstats_s);
168601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
169601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_ioc_fw_stats_get(&bfad->bfa.ioc, iocmd_bufptr);
170601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
171601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
172601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
173601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, iocmd->status);
174601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
175601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
176601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
177601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_trc(bfad, 0x6666);
178601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
179601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
180601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
181601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
182f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_ioc_reset_stats(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
183f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
184f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
185f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
186f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
187f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (v_cmd == IOCMD_IOC_RESET_STATS) {
188f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfa_ioc_clear_stats(&bfad->bfa);
189f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_OK;
190f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	} else if (v_cmd == IOCMD_IOC_RESET_FWSTATS) {
191f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_lock_irqsave(&bfad->bfad_lock, flags);
192f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = bfa_ioc_fw_stats_clear(&bfad->bfa.ioc);
193f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
194f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
195f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
196f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
197f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
198f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
199f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
200f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_ioc_set_name(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
201f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
202f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_ioc_name_s *iocmd = (struct bfa_bsg_ioc_name_s *) cmd;
203f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
204f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (v_cmd == IOCMD_IOC_SET_ADAPTER_NAME)
205f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		strcpy(bfad->adapter_name, iocmd->name);
206f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	else if (v_cmd == IOCMD_IOC_SET_PORT_NAME)
207f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		strcpy(bfad->port_name, iocmd->name);
208f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
209f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
210f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
211f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
212f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
213f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
214601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_iocfc_get_attr(struct bfad_s *bfad, void *cmd)
215601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
216601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_iocfc_attr_s *iocmd = (struct bfa_bsg_iocfc_attr_s *)cmd;
217601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
218601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
219601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_iocfc_get_attr(&bfad->bfa, &iocmd->iocfc_attr);
220601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
221601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
222601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
223601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
224601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
225601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_iocfc_set_intr(struct bfad_s *bfad, void *cmd)
226601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
227601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_iocfc_intr_s *iocmd = (struct bfa_bsg_iocfc_intr_s *)cmd;
228601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
229601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
230601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
231601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_iocfc_israttr_set(&bfad->bfa, &iocmd->attr);
232601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
233601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
234601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
235601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
236601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
237601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
238601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_port_enable(struct bfad_s *bfad, void *cmd)
239601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
240601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
241601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfad_hal_comp fcomp;
242601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long flags;
243601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
244601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	init_completion(&fcomp.comp);
245601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
246601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_port_enable(&bfad->bfa.modules.port,
247601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati					bfad_hcb_comp, &fcomp);
248601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
249601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
250601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, iocmd->status);
251601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return 0;
252601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
253601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	wait_for_completion(&fcomp.comp);
254601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = fcomp.status;
255601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
256601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
257601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
258601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
259601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_port_disable(struct bfad_s *bfad, void *cmd)
260601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
261601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
262601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfad_hal_comp fcomp;
263601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long flags;
264601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
265601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	init_completion(&fcomp.comp);
266601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
267601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_port_disable(&bfad->bfa.modules.port,
268601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				bfad_hcb_comp, &fcomp);
269601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
270601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
271601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
272601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, iocmd->status);
273601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return 0;
274601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
275601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	wait_for_completion(&fcomp.comp);
276601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = fcomp.status;
277601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
278601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
279601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
280b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
281b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_port_get_attr(struct bfad_s *bfad, void *cmd)
282b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
283b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_port_attr_s *iocmd = (struct bfa_bsg_port_attr_s *)cmd;
284b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_lport_attr_s	port_attr;
285b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
286b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
287b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
288b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcport_get_attr(&bfad->bfa, &iocmd->attr);
289b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcs_lport_get_attr(&bfad->bfa_fcs.fabric.bport, &port_attr);
290b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
291b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
292b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (iocmd->attr.topology != BFA_PORT_TOPOLOGY_NONE)
293b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->attr.pid = port_attr.pid;
294b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	else
295b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->attr.pid = 0;
296b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
297b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->attr.port_type = port_attr.port_type;
298b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->attr.loopback = port_attr.loopback;
299b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->attr.authfail = port_attr.authfail;
300b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	strncpy(iocmd->attr.port_symname.symname,
301b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		port_attr.port_cfg.sym_name.symname,
302b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		sizeof(port_attr.port_cfg.sym_name.symname));
303b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
304b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
305b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
306b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
307b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
308601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
309601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_port_get_stats(struct bfad_s *bfad, void *cmd,
310601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			unsigned int payload_len)
311601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
312601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_port_stats_s *iocmd = (struct bfa_bsg_port_stats_s *)cmd;
313601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfad_hal_comp fcomp;
314601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	void	*iocmd_bufptr;
315601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
316601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
317601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
318601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(struct bfa_bsg_port_stats_s),
319601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(union bfa_port_stats_u)) != BFA_STATUS_OK) {
320601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
321601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return 0;
322601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
323601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
324601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_port_stats_s);
325601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
326601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	init_completion(&fcomp.comp);
327601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
328601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_port_get_stats(&bfad->bfa.modules.port,
329601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd_bufptr, bfad_hcb_comp, &fcomp);
330601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
331601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
332601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, iocmd->status);
333601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
334601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
335601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
336601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	wait_for_completion(&fcomp.comp);
337601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = fcomp.status;
338601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
339601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
340601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
341601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
342f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
343f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_port_reset_stats(struct bfad_s *bfad, void *cmd)
344f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
345f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
346f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfad_hal_comp fcomp;
347f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
348f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
349f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	init_completion(&fcomp.comp);
350f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
351f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = bfa_port_clear_stats(&bfad->bfa.modules.port,
352f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati					bfad_hcb_comp, &fcomp);
353f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
354f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
355f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfa_trc(bfad, iocmd->status);
356f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		return 0;
357f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
358f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	wait_for_completion(&fcomp.comp);
359f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = fcomp.status;
360f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
361f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
362f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
363f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
364f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_set_port_cfg(struct bfad_s *bfad, void *iocmd, unsigned int v_cmd)
365f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
366f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_port_cfg_s *cmd = (struct bfa_bsg_port_cfg_s *)iocmd;
367f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
368f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
369f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
370f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (v_cmd == IOCMD_PORT_CFG_TOPO)
371f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		cmd->status = bfa_fcport_cfg_topology(&bfad->bfa, cmd->param);
372f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	else if (v_cmd == IOCMD_PORT_CFG_SPEED)
373f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		cmd->status = bfa_fcport_cfg_speed(&bfad->bfa, cmd->param);
374f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	else if (v_cmd == IOCMD_PORT_CFG_ALPA)
375f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		cmd->status = bfa_fcport_cfg_hardalpa(&bfad->bfa, cmd->param);
376f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	else if (v_cmd == IOCMD_PORT_CLR_ALPA)
377f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		cmd->status = bfa_fcport_clr_hardalpa(&bfad->bfa);
378f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
379f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
380f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
381f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
382f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
383f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
384f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_port_cfg_maxfrsize(struct bfad_s *bfad, void *cmd)
385f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
386f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_port_cfg_maxfrsize_s *iocmd =
387f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				(struct bfa_bsg_port_cfg_maxfrsize_s *)cmd;
388f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
389f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
390f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
391f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = bfa_fcport_cfg_maxfrsize(&bfad->bfa, iocmd->maxfrsize);
392f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
393f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
394f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
395f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
396f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
397f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
398f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_port_cfg_bbsc(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
399f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
400f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
401f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
402f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
403f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
404f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
405f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (bfa_ioc_get_type(&bfad->bfa.ioc) == BFA_IOC_TYPE_FC) {
406f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		if (v_cmd == IOCMD_PORT_BBSC_ENABLE)
407f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			fcport->cfg.bb_scn_state = BFA_TRUE;
408f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		else if (v_cmd == IOCMD_PORT_BBSC_DISABLE)
409f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			fcport->cfg.bb_scn_state = BFA_FALSE;
410f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
411f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
412f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
413f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
414f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
415f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
416f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
417b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
418b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_lport_get_attr(struct bfad_s *bfad, void *cmd)
419b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
420b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_lport_s	*fcs_port;
421b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_lport_attr_s *iocmd = (struct bfa_bsg_lport_attr_s *)cmd;
422b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
423b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
424b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
425b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
426b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				iocmd->vf_id, iocmd->pwwn);
427b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_port == NULL) {
428b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
429b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
430b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
431b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
432b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
433b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcs_lport_get_attr(fcs_port, &iocmd->port_attr);
434b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
435b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
436b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
437b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
438b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
439b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
440601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
441601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_lport_get_stats(struct bfad_s *bfad, void *cmd)
442601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
443601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
444601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_lport_stats_s *iocmd =
445601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_lport_stats_s *)cmd;
446601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
447601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
448601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
449601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
450601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
451601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_port == NULL) {
452601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
453601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
454601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
455601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
456601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
457601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcs_lport_get_stats(fcs_port, &iocmd->port_stats);
458601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
459601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
460601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
461601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
462601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
463601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
464601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
465f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_lport_reset_stats(struct bfad_s *bfad, void *cmd)
466f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
467f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
468f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_reset_stats_s *iocmd =
469f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			(struct bfa_bsg_reset_stats_s *)cmd;
470f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
471f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct list_head *qe, *qen;
472f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_itnim_s *itnim;
473f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
474f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
475f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
476f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
477f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				iocmd->vf_id, iocmd->vpwwn);
478f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (fcs_port == NULL) {
479f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
480f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
481f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		goto out;
482f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
483f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
484f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	bfa_fcs_lport_clear_stats(fcs_port);
485f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	/* clear IO stats from all active itnims */
486f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	list_for_each_safe(qe, qen, &fcpim->itnim_q) {
487f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		itnim = (struct bfa_itnim_s *) qe;
488f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		if (itnim->rport->rport_info.lp_tag != fcs_port->lp_tag)
489f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			continue;
490f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfa_itnim_clear_stats(itnim);
491f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
492f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
493f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
494f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiout:
495f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
496f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
497f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
498f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
499601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_lport_get_iostats(struct bfad_s *bfad, void *cmd)
500601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
501601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
502601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_lport_iostats_s *iocmd =
503601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_lport_iostats_s *)cmd;
504601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
505601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
506601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
507601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
508601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
509601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_port == NULL) {
510601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
511601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
512601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
513601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
514601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
515601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcpim_port_iostats(&bfad->bfa, &iocmd->iostats,
516601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			fcs_port->lp_tag);
517601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
518601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
519601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
520601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
521601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
522601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
523601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
524601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_lport_get_rports(struct bfad_s *bfad, void *cmd,
525601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			unsigned int payload_len)
526601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
527601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_lport_get_rports_s *iocmd =
528601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_lport_get_rports_s *)cmd;
529601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
530601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
531601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	void	*iocmd_bufptr;
532601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
533601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (iocmd->nrports == 0)
5349afbcfab74d26051702862b57c0115f71477a3ccKrishna Gudipati		return -EINVAL;
535601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
536601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
537601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(struct bfa_bsg_lport_get_rports_s),
538601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(wwn_t) * iocmd->nrports) != BFA_STATUS_OK) {
539601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
540601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		return 0;
541601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
542601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
543601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd_bufptr = (char *)iocmd +
544601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			sizeof(struct bfa_bsg_lport_get_rports_s);
545601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
546601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
547601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
548601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_port == NULL) {
549601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
550601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
551601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
552601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
553601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
554601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
555601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcs_lport_get_rports(fcs_port, (wwn_t *)iocmd_bufptr,
556601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				&iocmd->nrports);
557601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
558601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
559601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
560601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
561601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
562601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
563601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
564601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_rport_get_attr(struct bfad_s *bfad, void *cmd)
565601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
566601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_rport_attr_s *iocmd = (struct bfa_bsg_rport_attr_s *)cmd;
567601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
568601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_rport_s *fcs_rport;
569601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
570601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
571601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
572601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
573601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
574601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_port == NULL) {
575601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
576601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
577601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
578601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
579601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
580601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
581601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
582601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_rport == NULL) {
583601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
584601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
585601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
586601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
587601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
588601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
589601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa_fcs_rport_get_attr(fcs_rport, &iocmd->attr);
590601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
591601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
592601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
593601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
594601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
595601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
596b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
597b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_rport_get_addr(struct bfad_s *bfad, void *cmd)
598b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
599b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_rport_scsi_addr_s *iocmd =
600b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(struct bfa_bsg_rport_scsi_addr_s *)cmd;
601b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_lport_s	*fcs_port;
602b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_itnim_s	*fcs_itnim;
603b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_itnim_s	*drv_itnim;
604b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
605b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
606b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
607b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
608b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				iocmd->vf_id, iocmd->pwwn);
609b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_port == NULL) {
610b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_trc(bfad, 0);
611b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
612b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
613b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
614b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
615b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
616b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
617b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_itnim == NULL) {
618b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_trc(bfad, 0);
619b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
620b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
621b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
622b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
623b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
624b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_itnim = fcs_itnim->itnim_drv;
625b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
626b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_itnim && drv_itnim->im_port)
627b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->host = drv_itnim->im_port->shost->host_no;
628b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	else {
629b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_trc(bfad, 0);
630b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
631b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
632b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
633b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
634b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
635b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->target = drv_itnim->scsi_tgt_id;
636b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
637b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
638b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->bus = 0;
639b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->lun = 0;
640b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
641b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
642b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
643b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
644b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
645601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
646601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_rport_get_stats(struct bfad_s *bfad, void *cmd)
647601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
648601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_rport_stats_s *iocmd =
649601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_rport_stats_s *)cmd;
650601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
651601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_rport_s *fcs_rport;
652601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
653601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
654601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
655601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
656601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
657601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_port == NULL) {
658601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
659601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
660601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
661601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
662601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
663601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
664601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
665601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (fcs_rport == NULL) {
666601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
667601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
668601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
669601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		goto out;
670601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
671601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
672601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	memcpy((void *)&iocmd->stats, (void *)&fcs_rport->stats,
673601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		sizeof(struct bfa_rport_stats_s));
674601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	memcpy((void *)&iocmd->stats.hal_stats,
675601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	       (void *)&(bfa_fcs_rport_get_halrport(fcs_rport)->stats),
676601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	       sizeof(struct bfa_rport_hal_stats_s));
677601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
678601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
679601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
680601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiout:
681601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
682601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
683601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
684f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
685f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_rport_clr_stats(struct bfad_s *bfad, void *cmd)
686f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
687f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_rport_reset_stats_s *iocmd =
688f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				(struct bfa_bsg_rport_reset_stats_s *)cmd;
689f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
690f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcs_rport_s *fcs_rport;
691f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_rport_s *rport;
692f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
693f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
694f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
695f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
696f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
697f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (fcs_port == NULL) {
698f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
699f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
700f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		goto out;
701f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
702f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
703f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
704f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (fcs_rport == NULL) {
705f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
706f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
707f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		goto out;
708f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
709f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
710f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	memset((char *)&fcs_rport->stats, 0, sizeof(struct bfa_rport_stats_s));
711f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	rport = bfa_fcs_rport_get_halrport(fcs_rport);
712f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	memset(&rport->stats, 0, sizeof(rport->stats));
713f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
714f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
715f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiout:
716f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
717f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
718f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
719f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
720f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_rport_set_speed(struct bfad_s *bfad, void *cmd)
721f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
722f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_rport_set_speed_s *iocmd =
723f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				(struct bfa_bsg_rport_set_speed_s *)cmd;
724f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
725f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcs_rport_s *fcs_rport;
726f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
727f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
728f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
729f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
730f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
731f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (fcs_port == NULL) {
732f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
733f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
734f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		goto out;
735f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
736f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
737f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
738f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (fcs_rport == NULL) {
739f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
740f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
741f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		goto out;
742f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
743f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
744f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcs_rport->rpf.assigned_speed  = iocmd->speed;
745f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	/* Set this speed in f/w only if the RPSC speed is not available */
746f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (fcs_rport->rpf.rpsc_speed == BFA_PORT_SPEED_UNKNOWN)
747f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfa_rport_speed(fcs_rport->bfa_rport, iocmd->speed);
748f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
749f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
750f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiout:
751f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
752f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
753f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
754f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
755f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_vport_get_attr(struct bfad_s *bfad, void *cmd)
756f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
757f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcs_vport_s *fcs_vport;
758f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_vport_attr_s *iocmd = (struct bfa_bsg_vport_attr_s *)cmd;
759f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
760f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
761f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
762f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs,
763f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				iocmd->vf_id, iocmd->vpwwn);
764f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (fcs_vport == NULL) {
765f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
766f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_VWWN;
767f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		goto out;
768f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
769f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
770f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	bfa_fcs_vport_get_attr(fcs_vport, &iocmd->vport_attr);
771f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
772f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
773f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiout:
774f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
775f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
776f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
777f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
778f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_vport_get_stats(struct bfad_s *bfad, void *cmd)
779f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
780f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcs_vport_s *fcs_vport;
781f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_vport_stats_s *iocmd =
782f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				(struct bfa_bsg_vport_stats_s *)cmd;
783f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
784f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
785f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
786f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs,
787f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				iocmd->vf_id, iocmd->vpwwn);
788f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (fcs_vport == NULL) {
789f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
790f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_VWWN;
791f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		goto out;
792f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
793f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
794f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	memcpy((void *)&iocmd->vport_stats, (void *)&fcs_vport->vport_stats,
795f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		sizeof(struct bfa_vport_stats_s));
796f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	memcpy((void *)&iocmd->vport_stats.port_stats,
797f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	       (void *)&fcs_vport->lport.stats,
798f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		sizeof(struct bfa_lport_stats_s));
799f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
800f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
801f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiout:
802f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
803f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
804f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
805f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
806f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_vport_clr_stats(struct bfad_s *bfad, void *cmd)
807f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
808f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcs_vport_s *fcs_vport;
809f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_reset_stats_s *iocmd =
810f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				(struct bfa_bsg_reset_stats_s *)cmd;
811f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
812f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
813f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
814f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs,
815f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				iocmd->vf_id, iocmd->vpwwn);
816f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (fcs_vport == NULL) {
817f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
818f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_VWWN;
819f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		goto out;
820f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
821f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
822f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	memset(&fcs_vport->vport_stats, 0, sizeof(struct bfa_vport_stats_s));
823f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	memset(&fcs_vport->lport.stats, 0, sizeof(struct bfa_lport_stats_s));
824f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
825f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
826f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiout:
827f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
828f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
829f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
830b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
831b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_fabric_get_lports(struct bfad_s *bfad, void *cmd,
832b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			unsigned int payload_len)
833b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
834b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_fabric_get_lports_s *iocmd =
835b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(struct bfa_bsg_fabric_get_lports_s *)cmd;
836b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcs_vf_t	*fcs_vf;
837b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t	nports = iocmd->nports;
838b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
839b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	void	*iocmd_bufptr;
840b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
841b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (nports == 0) {
842b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_EINVAL;
843b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
844b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
845b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
846b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
847b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		sizeof(struct bfa_bsg_fabric_get_lports_s),
848b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		sizeof(wwn_t[iocmd->nports])) != BFA_STATUS_OK) {
849b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
850b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
851b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
852b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
853b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd_bufptr = (char *)iocmd +
854b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			sizeof(struct bfa_bsg_fabric_get_lports_s);
855b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
856b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
857b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id);
858b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_vf == NULL) {
859b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
860b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_VFID;
861b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
862b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
863b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcs_vf_get_ports(fcs_vf, (wwn_t *)iocmd_bufptr, &nports);
864b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
865b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
866b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->nports = nports;
867b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
868b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
869b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
870b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
871b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
872601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
873f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_ratelim(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
874f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
875f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
876f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
877f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
878f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
879f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
880f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
881f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (cmd == IOCMD_RATELIM_ENABLE)
882f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		fcport->cfg.ratelimit = BFA_TRUE;
883f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	else if (cmd == IOCMD_RATELIM_DISABLE)
884f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		fcport->cfg.ratelimit = BFA_FALSE;
885f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
886f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (fcport->cfg.trl_def_speed == BFA_PORT_SPEED_UNKNOWN)
887f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		fcport->cfg.trl_def_speed = BFA_PORT_SPEED_1GBPS;
888f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
889f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
890f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
891f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
892f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
893f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
894f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
895f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
896f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_ratelim_speed(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
897f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
898f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_trl_speed_s *iocmd = (struct bfa_bsg_trl_speed_s *)pcmd;
899f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
900f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
901f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
902f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
903f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
904f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	/* Auto and speeds greater than the supported speed, are invalid */
905f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if ((iocmd->speed == BFA_PORT_SPEED_AUTO) ||
906f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	    (iocmd->speed > fcport->speed_sup)) {
907f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_UNSUPP_SPEED;
908f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
909f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		return 0;
910f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
911f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
912f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcport->cfg.trl_def_speed = iocmd->speed;
913f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
914f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
915f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
916f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
917f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
918f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
919f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
920f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_cfg_fcpim(struct bfad_s *bfad, void *cmd)
921f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
922f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_fcpim_s *iocmd = (struct bfa_bsg_fcpim_s *)cmd;
923f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
924f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
925f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
926f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	bfa_fcpim_path_tov_set(&bfad->bfa, iocmd->param);
927f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
928f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
929f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
930f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
931f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
932f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
933601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcpim_get_modstats(struct bfad_s *bfad, void *cmd)
934601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
935601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_fcpim_modstats_s *iocmd =
936601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_fcpim_modstats_s *)cmd;
937601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
938601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct list_head *qe, *qen;
939601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_itnim_s *itnim;
940601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
941601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
942601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
943601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	/* accumulate IO stats from itnim */
944601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	memset((void *)&iocmd->modstats, 0, sizeof(struct bfa_itnim_iostats_s));
945601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	list_for_each_safe(qe, qen, &fcpim->itnim_q) {
946601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		itnim = (struct bfa_itnim_s *) qe;
947601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_fcpim_add_stats(&iocmd->modstats, &(itnim->stats));
948601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
949601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
950601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
951601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
952601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
953601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
954601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
955f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_fcpim_clr_modstats(struct bfad_s *bfad, void *cmd)
956f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
957f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_fcpim_modstatsclr_s *iocmd =
958f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				(struct bfa_bsg_fcpim_modstatsclr_s *)cmd;
959f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
960f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct list_head *qe, *qen;
961f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_itnim_s *itnim;
962f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
963f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
964f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
965f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	list_for_each_safe(qe, qen, &fcpim->itnim_q) {
966f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		itnim = (struct bfa_itnim_s *) qe;
967f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfa_itnim_clear_stats(itnim);
968f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
969f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	memset(&fcpim->del_itn_stats, 0,
970f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		sizeof(struct bfa_fcpim_del_itn_stats_s));
971f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
972f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
973f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
974f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
975f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
976f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
977601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcpim_get_del_itn_stats(struct bfad_s *bfad, void *cmd)
978601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
979601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_fcpim_del_itn_stats_s *iocmd =
980601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_fcpim_del_itn_stats_s *)cmd;
981601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
982601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
983601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
984601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
985601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	memcpy((void *)&iocmd->modstats, (void *)&fcpim->del_itn_stats,
986601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		sizeof(struct bfa_fcpim_del_itn_stats_s));
987601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
988601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
989601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
990601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
991601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
992601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
993b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
994b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_itnim_get_attr(struct bfad_s *bfad, void *cmd)
995b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
996b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_itnim_attr_s *iocmd = (struct bfa_bsg_itnim_attr_s *)cmd;
997b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_lport_s	*fcs_port;
998b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
999b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1000b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1001b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
1002b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				iocmd->vf_id, iocmd->lpwwn);
1003b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!fcs_port)
1004b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
1005b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	else
1006b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		iocmd->status = bfa_fcs_itnim_attr_get(fcs_port,
1007b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					iocmd->rpwwn, &iocmd->attr);
1008b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1009b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return 0;
1010b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
1011b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
1012601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatistatic int
1013601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_itnim_get_iostats(struct bfad_s *bfad, void *cmd)
1014601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
1015601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_itnim_iostats_s *iocmd =
1016601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_itnim_iostats_s *)cmd;
1017601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
1018601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_itnim_s *itnim;
1019601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
1020601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
1021601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1022601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
1023601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->lpwwn);
1024601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (!fcs_port) {
1025601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
1026601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
1027601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	} else {
1028601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
1029601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		if (itnim == NULL)
1030601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
1031601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		else {
1032601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			iocmd->status = BFA_STATUS_OK;
1033601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			memcpy((void *)&iocmd->iostats, (void *)
1034601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			       &(bfa_fcs_itnim_get_halitn(itnim)->stats),
1035601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			       sizeof(struct bfa_itnim_iostats_s));
1036601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		}
1037601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
1038601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1039601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
1040601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
1041601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
1042601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatistatic int
1043f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_itnim_reset_stats(struct bfad_s *bfad, void *cmd)
1044f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
1045f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_rport_reset_stats_s *iocmd =
1046f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			(struct bfa_bsg_rport_reset_stats_s *)cmd;
1047f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcs_lport_s	*fcs_port;
1048f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_fcs_itnim_s	*itnim;
1049f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
1050f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1051f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1052f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
1053f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati				iocmd->vf_id, iocmd->pwwn);
1054f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (!fcs_port)
1055f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
1056f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	else {
1057f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
1058f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		if (itnim == NULL)
1059f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
1060f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		else {
1061f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			iocmd->status = BFA_STATUS_OK;
1062f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			bfa_fcs_itnim_stats_clear(fcs_port, iocmd->rpwwn);
1063f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			bfa_itnim_clear_stats(bfa_fcs_itnim_get_halitn(itnim));
1064f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		}
1065f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
1066f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1067f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1068f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
1069f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
1070f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1071f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatistatic int
1072601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_itnim_get_itnstats(struct bfad_s *bfad, void *cmd)
1073601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
1074601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_itnim_itnstats_s *iocmd =
1075601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			(struct bfa_bsg_itnim_itnstats_s *)cmd;
1076601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
1077601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_fcs_itnim_s *itnim;
1078601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long	flags;
1079601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
1080601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1081601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
1082601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati				iocmd->vf_id, iocmd->lpwwn);
1083601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (!fcs_port) {
1084601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
1085601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		bfa_trc(bfad, 0);
1086601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	} else {
1087601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
1088601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		if (itnim == NULL)
1089601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
1090601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		else {
1091601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			iocmd->status = BFA_STATUS_OK;
1092601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			bfa_fcs_itnim_stats_get(fcs_port, iocmd->rpwwn,
1093601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati					&iocmd->itnstats);
1094601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		}
1095601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
1096601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1097601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
1098601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
1099601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
1100601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
1101601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcport_enable(struct bfad_s *bfad, void *cmd)
1102601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
1103601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
1104601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long flags;
1105601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
1106601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1107601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_fcport_enable(&bfad->bfa);
1108601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1109601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
1110601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
1111601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
1112601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
1113601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatiint
1114601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfad_iocmd_fcport_disable(struct bfad_s *bfad, void *cmd)
1115601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
1116601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
1117601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	unsigned long flags;
1118601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
1119601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1120601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	iocmd->status = bfa_fcport_disable(&bfad->bfa);
1121601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1122601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
1123601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	return 0;
1124601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
1125601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
11261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
11271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_ioc_get_pcifn_cfg(struct bfad_s *bfad, void *cmd)
11281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
11291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_pcifn_cfg_s *iocmd = (struct bfa_bsg_pcifn_cfg_s *)cmd;
11301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
11311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags;
11321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
11331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
11341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
11351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_query(&bfad->bfa.modules.ablk,
11361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				&iocmd->pcifn_cfg,
11371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				bfad_hcb_comp, &fcomp);
11381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
11391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
11401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
11411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
11421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
11431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
11441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
11451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
11461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
11471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
11481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
11491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_pcifn_create(struct bfad_s *bfad, void *cmd)
11501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
11511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
11521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
11531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags;
11541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
11551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
11561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
11571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_pf_create(&bfad->bfa.modules.ablk,
11581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				&iocmd->pcifn_id, iocmd->port,
11591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->pcifn_class, iocmd->bandwidth,
11601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				bfad_hcb_comp, &fcomp);
11611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
11621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
11631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
11641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
11651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
11661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
11671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
11681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
11691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
11701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
11711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
11721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_pcifn_delete(struct bfad_s *bfad, void *cmd)
11731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
11741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
11751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
11761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags;
11771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
11781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
11791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
11801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_pf_delete(&bfad->bfa.modules.ablk,
11811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->pcifn_id,
11821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				bfad_hcb_comp, &fcomp);
11831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
11841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
11851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
11861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
11871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
11881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
11891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
11901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
11911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
11921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
11931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
11941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_pcifn_bw(struct bfad_s *bfad, void *cmd)
11951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
11961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
11971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
11981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags;
11991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
12011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
12021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_pf_update(&bfad->bfa.modules.ablk,
12031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->pcifn_id, iocmd->bandwidth,
12041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				bfad_hcb_comp, &fcomp);
12051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_trc(bfad, iocmd->status);
12071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
12081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
12091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
12111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
12121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_trc(bfad, iocmd->status);
12131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
12141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
12151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
12161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
12181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_adapter_cfg_mode(struct bfad_s *bfad, void *cmd)
12191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
12201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_adapter_cfg_mode_s *iocmd =
12211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			(struct bfa_bsg_adapter_cfg_mode_s *)cmd;
12221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
12231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags = 0;
12241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
12261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
12271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_adapter_config(&bfad->bfa.modules.ablk,
12281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->cfg.mode, iocmd->cfg.max_pf,
12291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->cfg.max_vf, bfad_hcb_comp, &fcomp);
12301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
12321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
12331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
12351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
12361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
12371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
12381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
12391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
12411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_port_cfg_mode(struct bfad_s *bfad, void *cmd)
12421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
12431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_port_cfg_mode_s *iocmd =
12441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			(struct bfa_bsg_port_cfg_mode_s *)cmd;
12451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
12461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long flags = 0;
12471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
12491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
12501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = bfa_ablk_port_config(&bfad->bfa.modules.ablk,
12511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->instance, iocmd->cfg.mode,
12521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				iocmd->cfg.max_pf, iocmd->cfg.max_vf,
12531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				bfad_hcb_comp, &fcomp);
12541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
12561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
12571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
12591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
12601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
12611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
12621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
12631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiint
12651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfad_iocmd_ablk_optrom(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
12661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
12671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
12681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfad_hal_comp fcomp;
12691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	unsigned long   flags;
12701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	init_completion(&fcomp.comp);
12721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
12731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (cmd == IOCMD_FLASH_ENABLE_OPTROM)
12741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		iocmd->status = bfa_ablk_optrom_en(&bfad->bfa.modules.ablk,
12751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati					bfad_hcb_comp, &fcomp);
12761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	else
12771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		iocmd->status = bfa_ablk_optrom_dis(&bfad->bfa.modules.ablk,
12781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati					bfad_hcb_comp, &fcomp);
12791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
12821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		goto out;
12831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
12841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	wait_for_completion(&fcomp.comp);
12851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	iocmd->status = fcomp.status;
12861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiout:
12871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return 0;
12881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
12891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
1290a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiint
1291a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfad_iocmd_faa_query(struct bfad_s *bfad, void *cmd)
1292a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
1293a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfa_bsg_faa_attr_s *iocmd = (struct bfa_bsg_faa_attr_s *)cmd;
1294a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfad_hal_comp    fcomp;
1295a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	unsigned long   flags;
1296a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
1297a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	init_completion(&fcomp.comp);
1298a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
1299a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1300a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = bfa_faa_query(&bfad->bfa, &iocmd->faa_attr,
1301a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati				bfad_hcb_comp, &fcomp);
1302a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1303a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
1304a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
1305a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		goto out;
1306a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
1307a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	wait_for_completion(&fcomp.comp);
1308a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocmd->status = fcomp.status;
1309a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatiout:
1310a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	return 0;
1311a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
1312a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
1313148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiint
1314148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfad_iocmd_cee_attr(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
1315148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
1316148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_bsg_cee_attr_s *iocmd =
1317148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				(struct bfa_bsg_cee_attr_s *)cmd;
1318148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	void	*iocmd_bufptr;
1319148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfad_hal_comp	cee_comp;
1320148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	unsigned long	flags;
1321148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1322148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
1323148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_bsg_cee_attr_s),
1324148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_cee_attr_s)) != BFA_STATUS_OK) {
1325148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
1326148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		return 0;
1327148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
1328148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1329148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_attr_s);
1330148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1331148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee_comp.status = 0;
1332148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	init_completion(&cee_comp.comp);
1333148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	mutex_lock(&bfad_mutex);
1334148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1335148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	iocmd->status = bfa_cee_get_attr(&bfad->bfa.modules.cee, iocmd_bufptr,
1336148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati					 bfad_hcb_comp, &cee_comp);
1337148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1338148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
1339148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		mutex_unlock(&bfad_mutex);
1340148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(bfad, 0x5555);
1341148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		goto out;
1342148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
1343148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	wait_for_completion(&cee_comp.comp);
1344148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	mutex_unlock(&bfad_mutex);
1345148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiout:
1346148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	return 0;
1347148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
1348148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1349148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiint
1350148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfad_iocmd_cee_get_stats(struct bfad_s *bfad, void *cmd,
1351148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			unsigned int payload_len)
1352148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
1353148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_bsg_cee_stats_s *iocmd =
1354148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati				(struct bfa_bsg_cee_stats_s *)cmd;
1355148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	void	*iocmd_bufptr;
1356148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfad_hal_comp	cee_comp;
1357148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	unsigned long	flags;
1358148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1359148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
1360148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_bsg_cee_stats_s),
1361148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati			sizeof(struct bfa_cee_stats_s)) != BFA_STATUS_OK) {
1362148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
1363148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		return 0;
1364148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
1365148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1366148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_stats_s);
1367148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1368148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee_comp.status = 0;
1369148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	init_completion(&cee_comp.comp);
1370148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	mutex_lock(&bfad_mutex);
1371148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1372148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	iocmd->status = bfa_cee_get_stats(&bfad->bfa.modules.cee, iocmd_bufptr,
1373148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati					bfad_hcb_comp, &cee_comp);
1374148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1375148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
1376148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		mutex_unlock(&bfad_mutex);
1377148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(bfad, 0x5555);
1378148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		goto out;
1379148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	}
1380148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	wait_for_completion(&cee_comp.comp);
1381148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	mutex_unlock(&bfad_mutex);
1382148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiout:
1383148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	return 0;
1384148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
1385148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1386148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatiint
1387148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfad_iocmd_cee_reset_stats(struct bfad_s *bfad, void *cmd)
1388148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
1389148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
1390148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	unsigned long	flags;
1391148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
1392148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
1393148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	iocmd->status = bfa_cee_reset_stats(&bfad->bfa.modules.cee, NULL, NULL);
1394148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1395148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
1396148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		bfa_trc(bfad, 0x5555);
1397148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	return 0;
1398148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
1399148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
140051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiint
140151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfad_iocmd_sfp_media(struct bfad_s *bfad, void *cmd)
140251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
140351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfa_bsg_sfp_media_s *iocmd = (struct bfa_bsg_sfp_media_s *)cmd;
140451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfad_hal_comp	fcomp;
140551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	unsigned long	flags;
140651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
140751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	init_completion(&fcomp.comp);
140851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
140951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	iocmd->status = bfa_sfp_media(BFA_SFP_MOD(&bfad->bfa), &iocmd->media,
141051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati				bfad_hcb_comp, &fcomp);
141151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
141251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(bfad, iocmd->status);
141351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (iocmd->status != BFA_STATUS_SFP_NOT_READY)
141451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		goto out;
141551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
141651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	wait_for_completion(&fcomp.comp);
141751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	iocmd->status = fcomp.status;
141851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiout:
141951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	return 0;
142051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
142151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
142251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiint
142351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfad_iocmd_sfp_speed(struct bfad_s *bfad, void *cmd)
142451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
142551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfa_bsg_sfp_speed_s *iocmd = (struct bfa_bsg_sfp_speed_s *)cmd;
142651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfad_hal_comp	fcomp;
142751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	unsigned long	flags;
142851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
142951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	init_completion(&fcomp.comp);
143051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
143151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	iocmd->status = bfa_sfp_speed(BFA_SFP_MOD(&bfad->bfa), iocmd->speed,
143251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati				bfad_hcb_comp, &fcomp);
143351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
143451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(bfad, iocmd->status);
143551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (iocmd->status != BFA_STATUS_SFP_NOT_READY)
143651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		goto out;
143751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	wait_for_completion(&fcomp.comp);
143851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	iocmd->status = fcomp.status;
143951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiout:
144051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	return 0;
144151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
144251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
14435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint
14445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_get_attr(struct bfad_s *bfad, void *cmd)
14455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
14465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_bsg_flash_attr_s *iocmd =
14475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			(struct bfa_bsg_flash_attr_s *)cmd;
14485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfad_hal_comp fcomp;
14495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	unsigned long	flags;
14505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
14515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	init_completion(&fcomp.comp);
14525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
14535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = bfa_flash_get_attr(BFA_FLASH(&bfad->bfa), &iocmd->attr,
14545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				bfad_hcb_comp, &fcomp);
14555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
14565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
14575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		goto out;
14585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	wait_for_completion(&fcomp.comp);
14595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = fcomp.status;
14605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout:
14615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return 0;
14625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
14635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
14645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint
14655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_erase_part(struct bfad_s *bfad, void *cmd)
14665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
14675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
14685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfad_hal_comp fcomp;
14695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	unsigned long	flags;
14705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
14715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	init_completion(&fcomp.comp);
14725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
14735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = bfa_flash_erase_part(BFA_FLASH(&bfad->bfa), iocmd->type,
14745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				iocmd->instance, bfad_hcb_comp, &fcomp);
14755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
14765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
14775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		goto out;
14785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	wait_for_completion(&fcomp.comp);
14795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = fcomp.status;
14805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout:
14815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return 0;
14825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
14835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
14845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint
14855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_update_part(struct bfad_s *bfad, void *cmd,
14865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			unsigned int payload_len)
14875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
14885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
14895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	void	*iocmd_bufptr;
14905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfad_hal_comp fcomp;
14915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	unsigned long	flags;
14925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
14935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
14945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			sizeof(struct bfa_bsg_flash_s),
14955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			iocmd->bufsz) != BFA_STATUS_OK) {
14965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
14975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return 0;
14985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
14995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
15005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s);
15015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
15025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	init_completion(&fcomp.comp);
15035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
15045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
15055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				iocmd->type, iocmd->instance, iocmd_bufptr,
15065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				iocmd->bufsz, 0, bfad_hcb_comp, &fcomp);
15075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
15085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
15095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		goto out;
15105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	wait_for_completion(&fcomp.comp);
15115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = fcomp.status;
15125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout:
15135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return 0;
15145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
15155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
15165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiint
15175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfad_iocmd_flash_read_part(struct bfad_s *bfad, void *cmd,
15185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			unsigned int payload_len)
15195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
15205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
15215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfad_hal_comp fcomp;
15225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	void	*iocmd_bufptr;
15235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	unsigned long	flags;
15245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
15255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
15265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			sizeof(struct bfa_bsg_flash_s),
15275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			iocmd->bufsz) != BFA_STATUS_OK) {
15285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
15295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return 0;
15305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
15315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
15325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s);
15335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
15345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	init_completion(&fcomp.comp);
15355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
15365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), iocmd->type,
15375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				iocmd->instance, iocmd_bufptr, iocmd->bufsz, 0,
15385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				bfad_hcb_comp, &fcomp);
15395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
15405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
15415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		goto out;
15425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	wait_for_completion(&fcomp.comp);
15435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	iocmd->status = fcomp.status;
15445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiout:
15455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return 0;
15465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
15475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
15483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
15493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_temp(struct bfad_s *bfad, void *cmd)
15503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
15513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_get_temp_s *iocmd =
15523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_get_temp_s *)cmd;
15533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
15543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long	flags;
15553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
15563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
15573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
15583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_diag_tsensor_query(BFA_DIAG_MOD(&bfad->bfa),
15593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				&iocmd->result, bfad_hcb_comp, &fcomp);
15603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
15613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
15623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
15633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
15643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
15653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
15663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
15673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
15683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
15693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
15703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
15713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_memtest(struct bfad_s *bfad, void *cmd)
15723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
15733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_memtest_s *iocmd =
15743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_memtest_s *)cmd;
15753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
15763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
15773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
15783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
15793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
15803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_diag_memtest(BFA_DIAG_MOD(&bfad->bfa),
15813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				&iocmd->memtest, iocmd->pat,
15823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				&iocmd->result, bfad_hcb_comp, &fcomp);
15833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
15843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
15853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
15863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
15873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
15883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
15893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
15903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
15913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
15923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
15933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
15943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_loopback(struct bfad_s *bfad, void *cmd)
15953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
15963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_loopback_s *iocmd =
15973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_loopback_s *)cmd;
15983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
15993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
16003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
16013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
16023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
16033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_fcdiag_loopback(&bfad->bfa, iocmd->opmode,
16043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				iocmd->speed, iocmd->lpcnt, iocmd->pat,
16053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				&iocmd->result, bfad_hcb_comp, &fcomp);
16063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
16083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
16093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
16103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
16113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
16123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
16133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
16143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
16153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
16163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
16173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_fwping(struct bfad_s *bfad, void *cmd)
16183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
16193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_fwping_s *iocmd =
16203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_fwping_s *)cmd;
16213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
16223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
16233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
16243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
16253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
16263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_diag_fwping(BFA_DIAG_MOD(&bfad->bfa), iocmd->cnt,
16273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				iocmd->pattern, &iocmd->result,
16283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				bfad_hcb_comp, &fcomp);
16293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
16313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
16323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
16333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, 0x77771);
16343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
16353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
16363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
16373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
16383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
16393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
16403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
16413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_queuetest(struct bfad_s *bfad, void *cmd)
16423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
16433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_qtest_s *iocmd = (struct bfa_bsg_diag_qtest_s *)cmd;
16443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
16453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
16463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
16473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
16483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
16493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_fcdiag_queuetest(&bfad->bfa, iocmd->force,
16503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				iocmd->queue, &iocmd->result,
16513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				bfad_hcb_comp, &fcomp);
16523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
16543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
16553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
16563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
16573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
16583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
16593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
16603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
16613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
16623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_sfp(struct bfad_s *bfad, void *cmd)
16633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
16643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_sfp_show_s *iocmd =
16653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_sfp_show_s *)cmd;
16663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfad_hal_comp fcomp;
16673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
16683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
16693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	init_completion(&fcomp.comp);
16703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
16713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_sfp_show(BFA_SFP_MOD(&bfad->bfa), &iocmd->sfp,
16723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				bfad_hcb_comp, &fcomp);
16733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
16753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
16763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		goto out;
16773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	wait_for_completion(&fcomp.comp);
16783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = fcomp.status;
16793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
16803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiout:
16813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
16823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
16833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
16843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
16853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_led(struct bfad_s *bfad, void *cmd)
16863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
16873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_led_s *iocmd = (struct bfa_bsg_diag_led_s *)cmd;
16883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long   flags;
16893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
16903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
16913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_diag_ledtest(BFA_DIAG_MOD(&bfad->bfa),
16923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				&iocmd->ledtest);
16933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
16953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
16963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
16973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
16983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_beacon_lport(struct bfad_s *bfad, void *cmd)
16993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
17003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_beacon_s *iocmd =
17013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_beacon_s *)cmd;
17023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long	flags;
17033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
17043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
17053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_diag_beacon_port(BFA_DIAG_MOD(&bfad->bfa),
17063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				iocmd->beacon, iocmd->link_e2e_beacon,
17073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				iocmd->second);
17083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
17093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
17103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
17113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
17123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiint
17133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfad_iocmd_diag_lb_stat(struct bfad_s *bfad, void *cmd)
17143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
17153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_bsg_diag_lb_stat_s *iocmd =
17163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			(struct bfa_bsg_diag_lb_stat_s *)cmd;
17173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	unsigned long	flags;
17183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
17193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
17203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	iocmd->status = bfa_fcdiag_lb_is_running(&bfad->bfa);
17213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
17223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(bfad, iocmd->status);
17233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
17243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return 0;
17253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
17263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
17273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint
17283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_get_attr(struct bfad_s *bfad, void *cmd)
17293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
17303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_bsg_phy_attr_s *iocmd =
17313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			(struct bfa_bsg_phy_attr_s *)cmd;
17323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfad_hal_comp fcomp;
17333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	unsigned long	flags;
17343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
17353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	init_completion(&fcomp.comp);
17363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
17373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = bfa_phy_get_attr(BFA_PHY(&bfad->bfa), iocmd->instance,
17383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				&iocmd->attr, bfad_hcb_comp, &fcomp);
17393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
17403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
17413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		goto out;
17423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	wait_for_completion(&fcomp.comp);
17433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = fcomp.status;
17443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout:
17453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return 0;
17463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
17473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
17483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint
17493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_get_stats(struct bfad_s *bfad, void *cmd)
17503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
17513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_bsg_phy_stats_s *iocmd =
17523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			(struct bfa_bsg_phy_stats_s *)cmd;
17533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfad_hal_comp fcomp;
17543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	unsigned long	flags;
17553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
17563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	init_completion(&fcomp.comp);
17573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
17583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = bfa_phy_get_stats(BFA_PHY(&bfad->bfa), iocmd->instance,
17593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				&iocmd->stats, bfad_hcb_comp, &fcomp);
17603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
17613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
17623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		goto out;
17633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	wait_for_completion(&fcomp.comp);
17643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = fcomp.status;
17653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout:
17663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return 0;
17673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
17683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
17693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint
17703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_read(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
17713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
17723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd;
17733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfad_hal_comp fcomp;
17743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	void	*iocmd_bufptr;
17753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	unsigned long	flags;
17763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
17773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
17783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			sizeof(struct bfa_bsg_phy_s),
17793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			iocmd->bufsz) != BFA_STATUS_OK) {
17803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
17813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return 0;
17823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
17833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
17843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s);
17853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	init_completion(&fcomp.comp);
17863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
17873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = bfa_phy_read(BFA_PHY(&bfad->bfa),
17883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				iocmd->instance, iocmd_bufptr, iocmd->bufsz,
17893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				0, bfad_hcb_comp, &fcomp);
17903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
17913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
17923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		goto out;
17933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	wait_for_completion(&fcomp.comp);
17943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = fcomp.status;
17953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
17963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		goto out;
17973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout:
17983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return 0;
17993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
18003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
18013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiint
180261e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipatibfad_iocmd_vhba_query(struct bfad_s *bfad, void *cmd)
180361e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati{
180461e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	struct bfa_bsg_vhba_attr_s *iocmd =
180561e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati			(struct bfa_bsg_vhba_attr_s *)cmd;
180661e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	struct bfa_vhba_attr_s *attr = &iocmd->attr;
180761e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	unsigned long flags;
180861e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati
180961e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
181061e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	attr->pwwn =  bfad->bfa.ioc.attr->pwwn;
181161e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	attr->nwwn =  bfad->bfa.ioc.attr->nwwn;
181261e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	attr->plog_enabled = (bfa_boolean_t)bfad->bfa.plog->plog_enabled;
181361e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	attr->io_profile = bfa_fcpim_get_io_profile(&bfad->bfa);
181461e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	attr->path_tov  = bfa_fcpim_path_tov_get(&bfad->bfa);
181561e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
181661e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
181761e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	return 0;
181861e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati}
181961e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati
182061e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipatiint
18213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfad_iocmd_phy_update(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
18223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
18233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd;
18243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	void	*iocmd_bufptr;
18253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfad_hal_comp fcomp;
18263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	unsigned long	flags;
18273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
18283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (bfad_chk_iocmd_sz(payload_len,
18293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			sizeof(struct bfa_bsg_phy_s),
18303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			iocmd->bufsz) != BFA_STATUS_OK) {
18313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
18323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return 0;
18333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
18343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
18353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s);
18363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	init_completion(&fcomp.comp);
18373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
18383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = bfa_phy_update(BFA_PHY(&bfad->bfa),
18393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				iocmd->instance, iocmd_bufptr, iocmd->bufsz,
18403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				0, bfad_hcb_comp, &fcomp);
18413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
18423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
18433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		goto out;
18443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	wait_for_completion(&fcomp.comp);
18453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	iocmd->status = fcomp.status;
18463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiout:
18473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return 0;
18483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
18493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
185061e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipatiint
185161e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipatibfad_iocmd_porglog_get(struct bfad_s *bfad, void *cmd)
185261e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati{
185361e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	struct bfa_bsg_debug_s *iocmd = (struct bfa_bsg_debug_s *)cmd;
185461e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	void *iocmd_bufptr;
185561e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati
185661e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	if (iocmd->bufsz < sizeof(struct bfa_plog_s)) {
185761e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati		bfa_trc(bfad, sizeof(struct bfa_plog_s));
185861e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati		iocmd->status = BFA_STATUS_EINVAL;
185961e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati		goto out;
186061e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	}
186161e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati
186261e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
186361e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_debug_s);
186461e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	memcpy(iocmd_bufptr, (u8 *) &bfad->plog_buf, sizeof(struct bfa_plog_s));
186561e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipatiout:
186661e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	return 0;
186761e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati}
186861e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati
1869f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati#define BFA_DEBUG_FW_CORE_CHUNK_SZ	0x4000U /* 16K chunks for FW dump */
1870f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
1871f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_debug_fw_core(struct bfad_s *bfad, void *cmd,
1872f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			unsigned int payload_len)
1873f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
1874f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_debug_s *iocmd = (struct bfa_bsg_debug_s *)cmd;
1875f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	void	*iocmd_bufptr;
1876f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
187776c8ae4b2fbcbc92601c48e1b534c35638c8d597Santosh Nayak	u32 offset;
1878f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1879f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (bfad_chk_iocmd_sz(payload_len, sizeof(struct bfa_bsg_debug_s),
1880f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			BFA_DEBUG_FW_CORE_CHUNK_SZ) != BFA_STATUS_OK) {
1881f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_VERSION_FAIL;
1882f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		return 0;
1883f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
1884f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1885f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (iocmd->bufsz < BFA_DEBUG_FW_CORE_CHUNK_SZ ||
1886f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			!IS_ALIGNED(iocmd->bufsz, sizeof(u16)) ||
1887f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati			!IS_ALIGNED(iocmd->offset, sizeof(u32))) {
1888f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfa_trc(bfad, BFA_DEBUG_FW_CORE_CHUNK_SZ);
1889f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		iocmd->status = BFA_STATUS_EINVAL;
1890f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		goto out;
1891f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	}
1892f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1893f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_debug_s);
1894f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
189576c8ae4b2fbcbc92601c48e1b534c35638c8d597Santosh Nayak	offset = iocmd->offset;
1896f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = bfa_ioc_debug_fwcore(&bfad->bfa.ioc, iocmd_bufptr,
189776c8ae4b2fbcbc92601c48e1b534c35638c8d597Santosh Nayak				&offset, &iocmd->bufsz);
189876c8ae4b2fbcbc92601c48e1b534c35638c8d597Santosh Nayak	iocmd->offset = offset;
1899f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1900f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiout:
1901f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
1902f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
1903f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1904f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
1905f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_debug_ctl(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
1906f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
1907f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
1908f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	unsigned long	flags;
1909f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1910f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (v_cmd == IOCMD_DEBUG_FW_STATE_CLR) {
1911f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_lock_irqsave(&bfad->bfad_lock, flags);
1912f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfad->bfa.ioc.dbg_fwsave_once = BFA_TRUE;
1913f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1914f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	} else if (v_cmd == IOCMD_DEBUG_PORTLOG_CLR)
1915f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfad->plog_buf.head = bfad->plog_buf.tail = 0;
1916f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	else if (v_cmd == IOCMD_DEBUG_START_DTRC)
1917f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfa_trc_init(bfad->trcmod);
1918f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	else if (v_cmd == IOCMD_DEBUG_STOP_DTRC)
1919f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfa_trc_stop(bfad->trcmod);
1920f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1921f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
1922f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
1923f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
1924f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1925f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatiint
1926f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipatibfad_iocmd_porglog_ctl(struct bfad_s *bfad, void *cmd)
1927f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati{
1928f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	struct bfa_bsg_portlogctl_s *iocmd = (struct bfa_bsg_portlogctl_s *)cmd;
1929f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1930f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	if (iocmd->ctl == BFA_TRUE)
1931f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfad->plog_buf.plog_enabled = 1;
1932f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	else
1933f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		bfad->plog_buf.plog_enabled = 0;
1934f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
1935f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
1936f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	return 0;
1937f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati}
1938f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati
193942a8e6e298f39518445785c53a16357267db37efKrishna Gudipatiint
194042a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfad_iocmd_fcpim_cfg_profile(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
194142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{
194242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	struct bfa_bsg_fcpim_profile_s *iocmd =
194342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati				(struct bfa_bsg_fcpim_profile_s *)cmd;
194442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	struct timeval  tv;
194542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	unsigned long	flags;
194642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
194742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	do_gettimeofday(&tv);
194842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
194942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	if (v_cmd == IOCMD_FCPIM_PROFILE_ON)
195042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		iocmd->status = bfa_fcpim_profile_on(&bfad->bfa, tv.tv_sec);
195142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	else if (v_cmd == IOCMD_FCPIM_PROFILE_OFF)
195242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		iocmd->status = bfa_fcpim_profile_off(&bfad->bfa);
195342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
195442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
195542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	return 0;
195642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati}
195742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
195842a8e6e298f39518445785c53a16357267db37efKrishna Gudipatistatic int
195942a8e6e298f39518445785c53a16357267db37efKrishna Gudipatibfad_iocmd_itnim_get_ioprofile(struct bfad_s *bfad, void *cmd)
196042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati{
196142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	struct bfa_bsg_itnim_ioprofile_s *iocmd =
196242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati				(struct bfa_bsg_itnim_ioprofile_s *)cmd;
196342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
196442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	struct bfa_fcs_itnim_s *itnim;
196542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	unsigned long   flags;
196642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
196742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
196842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
196942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati				iocmd->vf_id, iocmd->lpwwn);
197042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	if (!fcs_port)
197142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
197242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	else {
197342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
197442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		if (itnim == NULL)
197542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati			iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
197642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		else
197742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati			iocmd->status = bfa_itnim_get_ioprofile(
197842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati						bfa_fcs_itnim_get_halitn(itnim),
197942a8e6e298f39518445785c53a16357267db37efKrishna Gudipati						&iocmd->ioprofile);
198042a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	}
198142a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
198242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	return 0;
198342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati}
198442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati
198537ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipatiint
198637ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipatibfad_iocmd_fcport_get_stats(struct bfad_s *bfad, void *cmd)
198737ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati{
198837ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	struct bfa_bsg_fcport_stats_s *iocmd =
198937ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati				(struct bfa_bsg_fcport_stats_s *)cmd;
199037ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	struct bfad_hal_comp fcomp;
199137ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	unsigned long	flags;
199237ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	struct bfa_cb_pending_q_s cb_qe;
199337ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati
199437ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	init_completion(&fcomp.comp);
199537ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
199637ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati			   &fcomp, &iocmd->stats);
199737ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
199837ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	iocmd->status = bfa_fcport_get_stats(&bfad->bfa, &cb_qe);
199937ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
200037ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
200137ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		bfa_trc(bfad, iocmd->status);
200237ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		goto out;
200337ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	}
200437ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	wait_for_completion(&fcomp.comp);
200537ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	iocmd->status = fcomp.status;
200637ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipatiout:
200737ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	return 0;
200837ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati}
200937ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati
201037ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipatiint
201137ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipatibfad_iocmd_fcport_reset_stats(struct bfad_s *bfad, void *cmd)
201237ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati{
201337ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
201437ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	struct bfad_hal_comp fcomp;
201537ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	unsigned long	flags;
201637ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	struct bfa_cb_pending_q_s cb_qe;
201737ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati
201837ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	init_completion(&fcomp.comp);
201937ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, &fcomp, NULL);
202037ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati
202137ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
202237ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	iocmd->status = bfa_fcport_clear_stats(&bfad->bfa, &cb_qe);
202337ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
202437ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
202537ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		bfa_trc(bfad, iocmd->status);
202637ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		goto out;
202737ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	}
202837ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	wait_for_completion(&fcomp.comp);
202937ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	iocmd->status = fcomp.status;
203037ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipatiout:
203137ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	return 0;
203237ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati}
203337ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati
2034a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatiint
2035a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatibfad_iocmd_boot_cfg(struct bfad_s *bfad, void *cmd)
2036a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati{
2037a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd;
2038a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfad_hal_comp fcomp;
2039a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	unsigned long	flags;
2040a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
2041a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	init_completion(&fcomp.comp);
2042a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
2043a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
2044a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati			BFA_FLASH_PART_BOOT, PCI_FUNC(bfad->pcidev->devfn),
2045a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati			&iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0,
2046a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati			bfad_hcb_comp, &fcomp);
2047a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2048a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
2049a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		goto out;
2050a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	wait_for_completion(&fcomp.comp);
2051a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	iocmd->status = fcomp.status;
2052a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatiout:
2053a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	return 0;
2054a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati}
2055a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
2056a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatiint
2057a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatibfad_iocmd_boot_query(struct bfad_s *bfad, void *cmd)
2058a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati{
2059a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd;
2060a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfad_hal_comp fcomp;
2061a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	unsigned long	flags;
2062a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
2063a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	init_completion(&fcomp.comp);
2064a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
2065a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa),
2066a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati			BFA_FLASH_PART_BOOT, PCI_FUNC(bfad->pcidev->devfn),
2067a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati			&iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0,
2068a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati			bfad_hcb_comp, &fcomp);
2069a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2070a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
2071a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		goto out;
2072a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	wait_for_completion(&fcomp.comp);
2073a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	iocmd->status = fcomp.status;
2074a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatiout:
2075a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	return 0;
2076a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati}
2077a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
2078a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatiint
2079a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatibfad_iocmd_preboot_query(struct bfad_s *bfad, void *cmd)
2080a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati{
2081a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfa_bsg_preboot_s *iocmd = (struct bfa_bsg_preboot_s *)cmd;
2082a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfi_iocfc_cfgrsp_s *cfgrsp = bfad->bfa.iocfc.cfgrsp;
2083a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfa_boot_pbc_s *pbcfg = &iocmd->cfg;
2084a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	unsigned long	flags;
2085a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
2086a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
2087a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	pbcfg->enable = cfgrsp->pbc_cfg.boot_enabled;
2088a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	pbcfg->nbluns = cfgrsp->pbc_cfg.nbluns;
2089a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	pbcfg->speed = cfgrsp->pbc_cfg.port_speed;
2090a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	memcpy(pbcfg->pblun, cfgrsp->pbc_cfg.blun, sizeof(pbcfg->pblun));
2091a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
2092a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2093a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
2094a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	return 0;
2095a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati}
2096a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
2097a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatiint
2098a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatibfad_iocmd_ethboot_cfg(struct bfad_s *bfad, void *cmd)
2099a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati{
2100a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd;
2101a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfad_hal_comp fcomp;
2102a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	unsigned long	flags;
2103a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
2104a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	init_completion(&fcomp.comp);
2105a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
2106a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
2107a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati				BFA_FLASH_PART_PXECFG,
2108a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati				bfad->bfa.ioc.port_id, &iocmd->cfg,
2109a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati				sizeof(struct bfa_ethboot_cfg_s), 0,
2110a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati				bfad_hcb_comp, &fcomp);
2111a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2112a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
2113a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		goto out;
2114a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	wait_for_completion(&fcomp.comp);
2115a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	iocmd->status = fcomp.status;
2116a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatiout:
2117a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	return 0;
2118a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati}
2119a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
2120a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatiint
2121a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatibfad_iocmd_ethboot_query(struct bfad_s *bfad, void *cmd)
2122a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati{
2123a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd;
2124a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	struct bfad_hal_comp fcomp;
2125a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	unsigned long	flags;
2126a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
2127a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	init_completion(&fcomp.comp);
2128a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
2129a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa),
2130a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati				BFA_FLASH_PART_PXECFG,
2131a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati				bfad->bfa.ioc.port_id, &iocmd->cfg,
2132a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati				sizeof(struct bfa_ethboot_cfg_s), 0,
2133a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati				bfad_hcb_comp, &fcomp);
2134a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2135a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	if (iocmd->status != BFA_STATUS_OK)
2136a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		goto out;
2137a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	wait_for_completion(&fcomp.comp);
2138a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	iocmd->status = fcomp.status;
2139a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipatiout:
2140a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	return 0;
2141a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati}
2142a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati
214345191236b179877d259a40e13c5144628d4df37fKrishna Gudipatiint
214445191236b179877d259a40e13c5144628d4df37fKrishna Gudipatibfad_iocmd_cfg_trunk(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
214545191236b179877d259a40e13c5144628d4df37fKrishna Gudipati{
214645191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
214745191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
214845191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	struct bfa_fcport_trunk_s *trunk = &fcport->trunk;
214945191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	unsigned long	flags;
215045191236b179877d259a40e13c5144628d4df37fKrishna Gudipati
215145191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
215245191236b179877d259a40e13c5144628d4df37fKrishna Gudipati
215345191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	if (v_cmd == IOCMD_TRUNK_ENABLE) {
215445191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		trunk->attr.state = BFA_TRUNK_OFFLINE;
215545191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		bfa_fcport_disable(&bfad->bfa);
215645191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		fcport->cfg.trunked = BFA_TRUE;
215745191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	} else if (v_cmd == IOCMD_TRUNK_DISABLE) {
215845191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		trunk->attr.state = BFA_TRUNK_DISABLED;
215945191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		bfa_fcport_disable(&bfad->bfa);
216045191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		fcport->cfg.trunked = BFA_FALSE;
216145191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	}
216245191236b179877d259a40e13c5144628d4df37fKrishna Gudipati
216345191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	if (!bfa_fcport_is_disabled(&bfad->bfa))
216445191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		bfa_fcport_enable(&bfad->bfa);
216545191236b179877d259a40e13c5144628d4df37fKrishna Gudipati
216645191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
216745191236b179877d259a40e13c5144628d4df37fKrishna Gudipati
216845191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
216945191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	return 0;
217045191236b179877d259a40e13c5144628d4df37fKrishna Gudipati}
217145191236b179877d259a40e13c5144628d4df37fKrishna Gudipati
217245191236b179877d259a40e13c5144628d4df37fKrishna Gudipatiint
217345191236b179877d259a40e13c5144628d4df37fKrishna Gudipatibfad_iocmd_trunk_get_attr(struct bfad_s *bfad, void *cmd)
217445191236b179877d259a40e13c5144628d4df37fKrishna Gudipati{
217545191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	struct bfa_bsg_trunk_attr_s *iocmd = (struct bfa_bsg_trunk_attr_s *)cmd;
217645191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
217745191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	struct bfa_fcport_trunk_s *trunk = &fcport->trunk;
217845191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	unsigned long	flags;
217945191236b179877d259a40e13c5144628d4df37fKrishna Gudipati
218045191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
218145191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	memcpy((void *)&iocmd->attr, (void *)&trunk->attr,
218245191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		sizeof(struct bfa_trunk_attr_s));
218345191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	iocmd->attr.port_id = bfa_lps_get_base_pid(&bfad->bfa);
218445191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
218545191236b179877d259a40e13c5144628d4df37fKrishna Gudipati
218645191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	iocmd->status = BFA_STATUS_OK;
218745191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	return 0;
218845191236b179877d259a40e13c5144628d4df37fKrishna Gudipati}
218945191236b179877d259a40e13c5144628d4df37fKrishna Gudipati
21903ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatiint
21913ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatibfad_iocmd_qos(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
21923ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati{
21933ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
21943ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
21953ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	unsigned long	flags;
21963ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
21973ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
21983ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	if (bfa_ioc_get_type(&bfad->bfa.ioc) == BFA_IOC_TYPE_FC) {
21993ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		if (v_cmd == IOCMD_QOS_ENABLE)
22003ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati			fcport->cfg.qos_enabled = BFA_TRUE;
22013ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		else if (v_cmd == IOCMD_QOS_DISABLE)
22023ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati			fcport->cfg.qos_enabled = BFA_FALSE;
22033ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	}
22043ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
22053ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22063ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
22073ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	return 0;
22083ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati}
22093ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22103ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatiint
22113ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatibfad_iocmd_qos_get_attr(struct bfad_s *bfad, void *cmd)
22123ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati{
22133ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_bsg_qos_attr_s *iocmd = (struct bfa_bsg_qos_attr_s *)cmd;
22143ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
22153ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	unsigned long	flags;
22163ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22173ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
22183ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->attr.state = fcport->qos_attr.state;
22193ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->attr.total_bb_cr = be32_to_cpu(fcport->qos_attr.total_bb_cr);
22203ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
22213ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22223ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
22233ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	return 0;
22243ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati}
22253ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22263ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatiint
22273ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatibfad_iocmd_qos_get_vc_attr(struct bfad_s *bfad, void *cmd)
22283ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati{
22293ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_bsg_qos_vc_attr_s *iocmd =
22303ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati				(struct bfa_bsg_qos_vc_attr_s *)cmd;
22313ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
22323ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_qos_vc_attr_s *bfa_vc_attr = &fcport->qos_vc_attr;
22333ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	unsigned long	flags;
22343ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	u32	i = 0;
22353ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22363ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
22373ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->attr.total_vc_count = be16_to_cpu(bfa_vc_attr->total_vc_count);
22383ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->attr.shared_credit  = be16_to_cpu(bfa_vc_attr->shared_credit);
22393ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->attr.elp_opmode_flags  =
22403ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati				be32_to_cpu(bfa_vc_attr->elp_opmode_flags);
22413ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22423ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	/* Individual VC info */
22433ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	while (i < iocmd->attr.total_vc_count) {
22443ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		iocmd->attr.vc_info[i].vc_credit =
22453ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati				bfa_vc_attr->vc_info[i].vc_credit;
22463ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		iocmd->attr.vc_info[i].borrow_credit =
22473ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati				bfa_vc_attr->vc_info[i].borrow_credit;
22483ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		iocmd->attr.vc_info[i].priority =
22493ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati				bfa_vc_attr->vc_info[i].priority;
22503ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		i++;
22513ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	}
22523ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
22533ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22543ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
22553ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	return 0;
22563ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati}
22573ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22583ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatiint
22593ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatibfad_iocmd_qos_get_stats(struct bfad_s *bfad, void *cmd)
22603ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati{
22613ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_bsg_fcport_stats_s *iocmd =
22623ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati				(struct bfa_bsg_fcport_stats_s *)cmd;
22633ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfad_hal_comp fcomp;
22643ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	unsigned long	flags;
22653ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_cb_pending_q_s cb_qe;
22663ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22673ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	init_completion(&fcomp.comp);
22683ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
22693ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati			   &fcomp, &iocmd->stats);
22703ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22713ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
22723ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc));
22733ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->status = bfa_fcport_get_stats(&bfad->bfa, &cb_qe);
22743ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
22753ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
22763ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		bfa_trc(bfad, iocmd->status);
22773ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		goto out;
22783ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	}
22793ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	wait_for_completion(&fcomp.comp);
22803ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->status = fcomp.status;
22813ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatiout:
22823ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	return 0;
22833ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati}
22843ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22853ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatiint
22863ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatibfad_iocmd_qos_reset_stats(struct bfad_s *bfad, void *cmd)
22873ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati{
22883ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
22893ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfad_hal_comp fcomp;
22903ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	unsigned long	flags;
22913ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	struct bfa_cb_pending_q_s cb_qe;
22923ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22933ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	init_completion(&fcomp.comp);
22943ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
22953ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati			   &fcomp, NULL);
22963ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
22973ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
22983ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc));
22993ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->status = bfa_fcport_clear_stats(&bfad->bfa, &cb_qe);
23003ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
23013ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	if (iocmd->status != BFA_STATUS_OK) {
23023ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		bfa_trc(bfad, iocmd->status);
23033ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		goto out;
23043ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	}
23053ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	wait_for_completion(&fcomp.comp);
23063ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	iocmd->status = fcomp.status;
23073ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipatiout:
23083ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	return 0;
23093ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati}
23103ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati
2311c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipatiint
2312c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipatibfad_iocmd_vf_get_stats(struct bfad_s *bfad, void *cmd)
2313c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati{
2314c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	struct bfa_bsg_vf_stats_s *iocmd =
2315c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati			(struct bfa_bsg_vf_stats_s *)cmd;
2316c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	struct bfa_fcs_fabric_s	*fcs_vf;
2317c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	unsigned long	flags;
2318c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati
2319c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
2320c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id);
2321c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	if (fcs_vf == NULL) {
2322c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2323c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_VFID;
2324c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		goto out;
2325c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	}
2326c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	memcpy((void *)&iocmd->stats, (void *)&fcs_vf->stats,
2327c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		sizeof(struct bfa_vf_stats_s));
2328c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2329c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
2330c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipatiout:
2331c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	return 0;
2332c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati}
2333c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati
2334c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipatiint
2335c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipatibfad_iocmd_vf_clr_stats(struct bfad_s *bfad, void *cmd)
2336c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati{
2337c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	struct bfa_bsg_vf_reset_stats_s *iocmd =
2338c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati			(struct bfa_bsg_vf_reset_stats_s *)cmd;
2339c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	struct bfa_fcs_fabric_s	*fcs_vf;
2340c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	unsigned long	flags;
2341c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati
2342c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
2343c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id);
2344c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	if (fcs_vf == NULL) {
2345c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2346c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		iocmd->status = BFA_STATUS_UNKNOWN_VFID;
2347c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		goto out;
2348c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	}
2349c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	memset((void *)&fcs_vf->stats, 0, sizeof(struct bfa_vf_stats_s));
2350c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2351c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	iocmd->status = BFA_STATUS_OK;
2352c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipatiout:
2353c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	return 0;
2354c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati}
2355c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati
23565b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati/* Function to reset the LUN SCAN mode */
23575b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipatistatic void
23585b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipatibfad_iocmd_lunmask_reset_lunscan_mode(struct bfad_s *bfad, int lunmask_cfg)
23595b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati{
23605b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati	struct bfad_im_port_s *pport_im = bfad->pport.im_port;
23615b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati	struct bfad_vport_s *vport = NULL;
23625b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati
23635b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati	/* Set the scsi device LUN SCAN flags for base port */
23645b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati	bfad_reset_sdev_bflags(pport_im, lunmask_cfg);
23655b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati
23665b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati	/* Set the scsi device LUN SCAN flags for the vports */
23675b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati	list_for_each_entry(vport, &bfad->vport_list, list_entry)
23685b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati		bfad_reset_sdev_bflags(vport->drv_port.im_port, lunmask_cfg);
23695b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati}
23705b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati
23714c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatiint
23724c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfad_iocmd_lunmask(struct bfad_s *bfad, void *pcmd, unsigned int v_cmd)
23734c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{
23744c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
23754c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	unsigned long	flags;
23764c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23774c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
23785b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati	if (v_cmd == IOCMD_FCPIM_LUNMASK_ENABLE) {
23794c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		iocmd->status = bfa_fcpim_lunmask_update(&bfad->bfa, BFA_TRUE);
23805b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati		/* Set the LUN Scanning mode to be Sequential scan */
23815b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati		if (iocmd->status == BFA_STATUS_OK)
23825b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati			bfad_iocmd_lunmask_reset_lunscan_mode(bfad, BFA_TRUE);
23835b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati	} else if (v_cmd == IOCMD_FCPIM_LUNMASK_DISABLE) {
23844c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		iocmd->status = bfa_fcpim_lunmask_update(&bfad->bfa, BFA_FALSE);
23855b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati		/* Set the LUN Scanning mode to default REPORT_LUNS scan */
23865b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati		if (iocmd->status == BFA_STATUS_OK)
23875b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati			bfad_iocmd_lunmask_reset_lunscan_mode(bfad, BFA_FALSE);
23885b7db7af522d9f281ff8bf540d2b5cbea2206b27Krishna Gudipati	} else if (v_cmd == IOCMD_FCPIM_LUNMASK_CLEAR)
23894c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		iocmd->status = bfa_fcpim_lunmask_clear(&bfad->bfa);
23904c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
23914c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	return 0;
23924c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati}
23934c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
23944c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatiint
23954c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfad_iocmd_fcpim_lunmask_query(struct bfad_s *bfad, void *cmd)
23964c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{
23974c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_bsg_fcpim_lunmask_query_s *iocmd =
23984c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati			(struct bfa_bsg_fcpim_lunmask_query_s *)cmd;
23994c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_lunmask_cfg_s *lun_mask = &iocmd->lun_mask;
24004c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	unsigned long	flags;
24014c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
24024c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
24034c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	iocmd->status = bfa_fcpim_lunmask_query(&bfad->bfa, lun_mask);
24044c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
24054c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	return 0;
24064c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati}
24074c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
24084c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatiint
24094c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipatibfad_iocmd_fcpim_cfg_lunmask(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
24104c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati{
24114c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	struct bfa_bsg_fcpim_lunmask_s *iocmd =
24124c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati				(struct bfa_bsg_fcpim_lunmask_s *)cmd;
24134c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	unsigned long	flags;
24144c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
24154c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
24164c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	if (v_cmd == IOCMD_FCPIM_LUNMASK_ADD)
24174c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		iocmd->status = bfa_fcpim_lunmask_add(&bfad->bfa, iocmd->vf_id,
24184c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati					&iocmd->pwwn, iocmd->rpwwn, iocmd->lun);
24194c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	else if (v_cmd == IOCMD_FCPIM_LUNMASK_DELETE)
24204c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		iocmd->status = bfa_fcpim_lunmask_delete(&bfad->bfa,
24214c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati					iocmd->vf_id, &iocmd->pwwn,
24224c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati					iocmd->rpwwn, iocmd->lun);
24234c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
24244c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	return 0;
24254c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati}
24264c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati
2427b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
2428b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd,
2429b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		unsigned int payload_len)
2430b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
24319afbcfab74d26051702862b57c0115f71477a3ccKrishna Gudipati	int rc = -EINVAL;
2432b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2433b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	switch (cmd) {
2434601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_ENABLE:
2435601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_enable(bfad, iocmd);
2436601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2437601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_DISABLE:
2438601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_disable(bfad, iocmd);
2439601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2440b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_IOC_GET_INFO:
2441b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_ioc_get_info(bfad, iocmd);
2442b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2443b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_IOC_GET_ATTR:
2444b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_ioc_get_attr(bfad, iocmd);
2445b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2446601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_GET_STATS:
2447601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_get_stats(bfad, iocmd);
2448601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2449601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOC_GET_FWSTATS:
2450601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_ioc_get_fwstats(bfad, iocmd, payload_len);
2451601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2452f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_IOC_RESET_STATS:
2453f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_IOC_RESET_FWSTATS:
2454f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_ioc_reset_stats(bfad, iocmd, cmd);
2455f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2456f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_IOC_SET_ADAPTER_NAME:
2457f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_IOC_SET_PORT_NAME:
2458f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_ioc_set_name(bfad, iocmd, cmd);
2459f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2460601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOCFC_GET_ATTR:
2461601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_iocfc_get_attr(bfad, iocmd);
2462601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2463601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_IOCFC_SET_INTR:
2464601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_iocfc_set_intr(bfad, iocmd);
2465601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2466601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_PORT_ENABLE:
2467601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_port_enable(bfad, iocmd);
2468601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2469601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_PORT_DISABLE:
2470601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_port_disable(bfad, iocmd);
2471601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2472b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_PORT_GET_ATTR:
2473b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_port_get_attr(bfad, iocmd);
2474b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2475601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_PORT_GET_STATS:
2476601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_port_get_stats(bfad, iocmd, payload_len);
2477601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2478f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_PORT_RESET_STATS:
2479f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_port_reset_stats(bfad, iocmd);
2480f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2481f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_PORT_CFG_TOPO:
2482f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_PORT_CFG_SPEED:
2483f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_PORT_CFG_ALPA:
2484f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_PORT_CLR_ALPA:
2485f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_set_port_cfg(bfad, iocmd, cmd);
2486f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2487f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_PORT_CFG_MAXFRSZ:
2488f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_port_cfg_maxfrsize(bfad, iocmd);
2489f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2490f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_PORT_BBSC_ENABLE:
2491f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_PORT_BBSC_DISABLE:
2492f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_port_cfg_bbsc(bfad, iocmd, cmd);
2493f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2494b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_LPORT_GET_ATTR:
2495b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_lport_get_attr(bfad, iocmd);
2496b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2497601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_LPORT_GET_STATS:
2498601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_lport_get_stats(bfad, iocmd);
2499601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2500f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_LPORT_RESET_STATS:
2501f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_lport_reset_stats(bfad, iocmd);
2502f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2503601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_LPORT_GET_IOSTATS:
2504601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_lport_get_iostats(bfad, iocmd);
2505601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2506601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_LPORT_GET_RPORTS:
2507601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_lport_get_rports(bfad, iocmd, payload_len);
2508601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2509601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_RPORT_GET_ATTR:
2510601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_rport_get_attr(bfad, iocmd);
2511601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2512b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_RPORT_GET_ADDR:
2513b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_rport_get_addr(bfad, iocmd);
2514b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2515601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_RPORT_GET_STATS:
2516601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_rport_get_stats(bfad, iocmd);
2517601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2518f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_RPORT_RESET_STATS:
2519f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_rport_clr_stats(bfad, iocmd);
2520f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2521f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_RPORT_SET_SPEED:
2522f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_rport_set_speed(bfad, iocmd);
2523f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2524f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_VPORT_GET_ATTR:
2525f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_vport_get_attr(bfad, iocmd);
2526f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2527f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_VPORT_GET_STATS:
2528f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_vport_get_stats(bfad, iocmd);
2529f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2530f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_VPORT_RESET_STATS:
2531f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_vport_clr_stats(bfad, iocmd);
2532f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2533b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_FABRIC_GET_LPORTS:
2534b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_fabric_get_lports(bfad, iocmd, payload_len);
2535b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2536f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_RATELIM_ENABLE:
2537f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_RATELIM_DISABLE:
2538f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_ratelim(bfad, cmd, iocmd);
2539f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2540f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_RATELIM_DEF_SPEED:
2541f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_ratelim_speed(bfad, cmd, iocmd);
2542f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2543f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_FCPIM_FAILOVER:
2544f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_cfg_fcpim(bfad, iocmd);
2545f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2546601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPIM_MODSTATS:
2547601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcpim_get_modstats(bfad, iocmd);
2548601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2549f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_FCPIM_MODSTATSCLR:
2550f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_fcpim_clr_modstats(bfad, iocmd);
2551f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2552601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPIM_DEL_ITN_STATS:
2553601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcpim_get_del_itn_stats(bfad, iocmd);
2554601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2555b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case IOCMD_ITNIM_GET_ATTR:
2556b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_iocmd_itnim_get_attr(bfad, iocmd);
2557b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2558601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_ITNIM_GET_IOSTATS:
2559601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_itnim_get_iostats(bfad, iocmd);
2560601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2561f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_ITNIM_RESET_STATS:
2562f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_itnim_reset_stats(bfad, iocmd);
2563f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2564601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_ITNIM_GET_ITNSTATS:
2565601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_itnim_get_itnstats(bfad, iocmd);
2566601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2567601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPORT_ENABLE:
2568601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcport_enable(bfad, iocmd);
2569601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
2570601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	case IOCMD_FCPORT_DISABLE:
2571601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		rc = bfad_iocmd_fcport_disable(bfad, iocmd);
2572601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		break;
25731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_IOC_PCIFN_CFG:
25741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_ioc_get_pcifn_cfg(bfad, iocmd);
25751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
25761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PCIFN_CREATE:
25771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_pcifn_create(bfad, iocmd);
25781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
25791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PCIFN_DELETE:
25801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_pcifn_delete(bfad, iocmd);
25811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
25821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PCIFN_BW:
25831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_pcifn_bw(bfad, iocmd);
25841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
25851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_ADAPTER_CFG_MODE:
25861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_adapter_cfg_mode(bfad, iocmd);
25871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
25881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_PORT_CFG_MODE:
25891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_port_cfg_mode(bfad, iocmd);
25901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
25911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_FLASH_ENABLE_OPTROM:
25921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case IOCMD_FLASH_DISABLE_OPTROM:
25931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		rc = bfad_iocmd_ablk_optrom(bfad, cmd, iocmd);
25941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
2595a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	case IOCMD_FAA_QUERY:
2596a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		rc = bfad_iocmd_faa_query(bfad, iocmd);
2597a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		break;
2598148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case IOCMD_CEE_GET_ATTR:
2599148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		rc = bfad_iocmd_cee_attr(bfad, iocmd, payload_len);
2600148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
2601148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case IOCMD_CEE_GET_STATS:
2602148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		rc = bfad_iocmd_cee_get_stats(bfad, iocmd, payload_len);
2603148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
2604148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	case IOCMD_CEE_RESET_STATS:
2605148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		rc = bfad_iocmd_cee_reset_stats(bfad, iocmd);
2606148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati		break;
260751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	case IOCMD_SFP_MEDIA:
260851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		rc = bfad_iocmd_sfp_media(bfad, iocmd);
260951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		 break;
261051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	case IOCMD_SFP_SPEED:
261151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		rc = bfad_iocmd_sfp_speed(bfad, iocmd);
261251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		break;
26135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_GET_ATTR:
26145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_get_attr(bfad, iocmd);
26155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
26165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_ERASE_PART:
26175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_erase_part(bfad, iocmd);
26185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
26195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_UPDATE_PART:
26205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_update_part(bfad, iocmd, payload_len);
26215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
26225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case IOCMD_FLASH_READ_PART:
26235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		rc = bfad_iocmd_flash_read_part(bfad, iocmd, payload_len);
26245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
26253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_TEMP:
26263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_temp(bfad, iocmd);
26273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
26283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_MEMTEST:
26293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_memtest(bfad, iocmd);
26303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
26313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_LOOPBACK:
26323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_loopback(bfad, iocmd);
26333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
26343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_FWPING:
26353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_fwping(bfad, iocmd);
26363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
26373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_QUEUETEST:
26383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_queuetest(bfad, iocmd);
26393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
26403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_SFP:
26413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_sfp(bfad, iocmd);
26423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
26433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_LED:
26443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_led(bfad, iocmd);
26453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
26463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_BEACON_LPORT:
26473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_beacon_lport(bfad, iocmd);
26483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
26493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case IOCMD_DIAG_LB_STAT:
26503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		rc = bfad_iocmd_diag_lb_stat(bfad, iocmd);
26513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
26523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case IOCMD_PHY_GET_ATTR:
26533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		rc = bfad_iocmd_phy_get_attr(bfad, iocmd);
26543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
26553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case IOCMD_PHY_GET_STATS:
26563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		rc = bfad_iocmd_phy_get_stats(bfad, iocmd);
26573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
26583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case IOCMD_PHY_UPDATE_FW:
26593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		rc = bfad_iocmd_phy_update(bfad, iocmd, payload_len);
26603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
26613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case IOCMD_PHY_READ_FW:
26623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		rc = bfad_iocmd_phy_read(bfad, iocmd, payload_len);
26633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
266461e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	case IOCMD_VHBA_QUERY:
266561e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati		rc = bfad_iocmd_vhba_query(bfad, iocmd);
266661e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati		break;
266761e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati	case IOCMD_DEBUG_PORTLOG:
266861e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati		rc = bfad_iocmd_porglog_get(bfad, iocmd);
266961e62e21afe469854e04546ea10b7a6f4cfd1142Krishna Gudipati		break;
2670f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_DEBUG_FW_CORE:
2671f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_debug_fw_core(bfad, iocmd, payload_len);
2672f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2673f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_DEBUG_FW_STATE_CLR:
2674f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_DEBUG_PORTLOG_CLR:
2675f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_DEBUG_START_DTRC:
2676f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_DEBUG_STOP_DTRC:
2677f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_debug_ctl(bfad, iocmd, cmd);
2678f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
2679f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati	case IOCMD_DEBUG_PORTLOG_CTL:
2680f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		rc = bfad_iocmd_porglog_ctl(bfad, iocmd);
2681f2ee76017b30c84f128dfbf716950ffc0e4d949aKrishna Gudipati		break;
268242a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	case IOCMD_FCPIM_PROFILE_ON:
268342a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	case IOCMD_FCPIM_PROFILE_OFF:
268442a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		rc = bfad_iocmd_fcpim_cfg_profile(bfad, iocmd, cmd);
268542a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		break;
268642a8e6e298f39518445785c53a16357267db37efKrishna Gudipati	case IOCMD_ITNIM_GET_IOPROFILE:
268742a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		rc = bfad_iocmd_itnim_get_ioprofile(bfad, iocmd);
268842a8e6e298f39518445785c53a16357267db37efKrishna Gudipati		break;
268937ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	case IOCMD_FCPORT_GET_STATS:
269037ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		rc = bfad_iocmd_fcport_get_stats(bfad, iocmd);
269137ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		break;
269237ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	case IOCMD_FCPORT_RESET_STATS:
269337ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		rc = bfad_iocmd_fcport_reset_stats(bfad, iocmd);
269437ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		break;
2695a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	case IOCMD_BOOT_CFG:
2696a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		rc = bfad_iocmd_boot_cfg(bfad, iocmd);
2697a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		break;
2698a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	case IOCMD_BOOT_QUERY:
2699a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		rc = bfad_iocmd_boot_query(bfad, iocmd);
2700a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		break;
2701a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	case IOCMD_PREBOOT_QUERY:
2702a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		rc = bfad_iocmd_preboot_query(bfad, iocmd);
2703a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		break;
2704a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	case IOCMD_ETHBOOT_CFG:
2705a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		rc = bfad_iocmd_ethboot_cfg(bfad, iocmd);
2706a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		break;
2707a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati	case IOCMD_ETHBOOT_QUERY:
2708a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		rc = bfad_iocmd_ethboot_query(bfad, iocmd);
2709a46bd300e191d5a1a7367a799a9f5268c5e6aafdKrishna Gudipati		break;
271045191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	case IOCMD_TRUNK_ENABLE:
271145191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	case IOCMD_TRUNK_DISABLE:
271245191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		rc = bfad_iocmd_cfg_trunk(bfad, iocmd, cmd);
271345191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		break;
271445191236b179877d259a40e13c5144628d4df37fKrishna Gudipati	case IOCMD_TRUNK_GET_ATTR:
271545191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		rc = bfad_iocmd_trunk_get_attr(bfad, iocmd);
271645191236b179877d259a40e13c5144628d4df37fKrishna Gudipati		break;
27173ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	case IOCMD_QOS_ENABLE:
27183ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	case IOCMD_QOS_DISABLE:
27193ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		rc = bfad_iocmd_qos(bfad, iocmd, cmd);
27203ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		break;
27213ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	case IOCMD_QOS_GET_ATTR:
27223ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		rc = bfad_iocmd_qos_get_attr(bfad, iocmd);
27233ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		break;
27243ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	case IOCMD_QOS_GET_VC_ATTR:
27253ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		rc = bfad_iocmd_qos_get_vc_attr(bfad, iocmd);
27263ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		break;
27273ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	case IOCMD_QOS_GET_STATS:
27283ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		rc = bfad_iocmd_qos_get_stats(bfad, iocmd);
27293ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		break;
27303ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati	case IOCMD_QOS_RESET_STATS:
27313ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		rc = bfad_iocmd_qos_reset_stats(bfad, iocmd);
27323ec4f2c8bff2568e5a51ba083db2c073321ca2c1Krishna Gudipati		break;
2733c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	case IOCMD_VF_GET_STATS:
2734c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		rc = bfad_iocmd_vf_get_stats(bfad, iocmd);
2735c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		break;
2736c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati	case IOCMD_VF_RESET_STATS:
2737c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		rc = bfad_iocmd_vf_clr_stats(bfad, iocmd);
2738c0350bf57445b9e2a4369668127ecc4431472d26Krishna Gudipati		break;
27394c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	case IOCMD_FCPIM_LUNMASK_ENABLE:
27404c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	case IOCMD_FCPIM_LUNMASK_DISABLE:
27414c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	case IOCMD_FCPIM_LUNMASK_CLEAR:
27424c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		rc = bfad_iocmd_lunmask(bfad, iocmd, cmd);
27434c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		break;
27444c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	case IOCMD_FCPIM_LUNMASK_QUERY:
27454c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		rc = bfad_iocmd_fcpim_lunmask_query(bfad, iocmd);
27464c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		break;
27474c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	case IOCMD_FCPIM_LUNMASK_ADD:
27484c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati	case IOCMD_FCPIM_LUNMASK_DELETE:
27494c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		rc = bfad_iocmd_fcpim_cfg_lunmask(bfad, iocmd, cmd);
27504c5d22bf7bdea68d3d449f6a8e1835da84909346Krishna Gudipati		break;
2751b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	default:
27529afbcfab74d26051702862b57c0115f71477a3ccKrishna Gudipati		rc = -EINVAL;
2753b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
2754b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
27559afbcfab74d26051702862b57c0115f71477a3ccKrishna Gudipati	return rc;
2756b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2757b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2758b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistatic int
2759b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_vendor_request(struct fc_bsg_job *job)
2760b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2761b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t vendor_cmd = job->request->rqst_data.h_vendor.vendor_cmd[0];
2762b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_im_port_s *im_port =
2763b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(struct bfad_im_port_s *) job->shost->hostdata[0];
2764b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_s *bfad = im_port->bfad;
2765bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati	struct request_queue *request_q = job->req->q;
2766b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	void *payload_kbuf;
2767b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int rc = -EINVAL;
2768b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2769bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati	/*
2770bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati	 * Set the BSG device request_queue size to 256 to support
2771bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati	 * payloads larger than 512*1024K bytes.
2772bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati	 */
2773bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati	blk_queue_max_segments(request_q, 256);
2774bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati
2775b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Allocate a temp buffer to hold the passed in user space command */
2776b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	payload_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL);
2777b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!payload_kbuf) {
2778b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
2779b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
2780b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
2781b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2782b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Copy the sg_list passed in to a linear buffer: holds the cmnd data */
2783b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_to_buffer(job->request_payload.sg_list,
2784b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.sg_cnt, payload_kbuf,
2785b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.payload_len);
2786b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2787b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Invoke IOCMD handler - to handle all the vendor command requests */
2788b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rc = bfad_iocmd_handler(bfad, vendor_cmd, payload_kbuf,
2789b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				job->request_payload.payload_len);
2790b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (rc != BFA_STATUS_OK)
2791b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto error;
2792b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2793b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Copy the response data to the job->reply_payload sg_list */
2794b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_from_buffer(job->reply_payload.sg_list,
2795b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.sg_cnt,
2796b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    payload_kbuf,
2797b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.payload_len);
2798b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2799b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* free the command buffer */
2800b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(payload_kbuf);
2801b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2802b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Fill the BSG job reply data */
2803b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply_len = job->reply_payload.payload_len;
2804b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->reply_payload_rcv_len = job->reply_payload.payload_len;
2805b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->result = rc;
2806b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2807b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->job_done(job);
2808b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
2809b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatierror:
2810b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* free the command buffer */
2811b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(payload_kbuf);
2812b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
2813b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->result = rc;
2814b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply_len = sizeof(uint32_t);
2815b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->reply_payload_rcv_len = 0;
2816b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
2817b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2818b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2819b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati/* FC passthru call backs */
2820b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu64
2821b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_req_sgaddr_cb(void *bfad_fcxp, int sgeid)
2822b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2823b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
2824b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s  *sge;
2825b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	u64	addr;
2826b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2827b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->req_sge + sgeid;
2828b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	addr = (u64)(size_t) sge->sg_addr;
2829b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return addr;
2830b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2831b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2832b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu32
2833b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_req_sglen_cb(void *bfad_fcxp, int sgeid)
2834b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2835b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
2836b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sge;
2837b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2838b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->req_sge + sgeid;
2839b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return sge->sg_len;
2840b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2841b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2842b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu64
2843b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_rsp_sgaddr_cb(void *bfad_fcxp, int sgeid)
2844b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2845b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
2846b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sge;
2847b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	u64	addr;
2848b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2849b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->rsp_sge + sgeid;
2850b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	addr = (u64)(size_t) sge->sg_addr;
2851b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return addr;
2852b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2853b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2854b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiu32
2855b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_get_rsp_sglen_cb(void *bfad_fcxp, int sgeid)
2856b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2857b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
2858b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sge;
2859b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2860b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sge = drv_fcxp->rsp_sge + sgeid;
2861b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return sge->sg_len;
2862b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2863b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2864b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipativoid
2865b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_send_fcpt_cb(void *bfad_fcxp, struct bfa_fcxp_s *fcxp, void *cbarg,
2866b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_status_t req_status, u32 rsp_len, u32 resid_len,
2867b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		struct fchs_s *rsp_fchs)
2868b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2869b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp *drv_fcxp = bfad_fcxp;
2870b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2871b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->req_status = req_status;
2872b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->rsp_len = rsp_len;
2873b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2874b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* bfa_fcxp will be automatically freed by BFA */
2875b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->bfa_fcxp = NULL;
2876b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	complete(&drv_fcxp->comp);
2877b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2878b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2879b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatistruct bfad_buf_info *
2880b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_map_sg(struct bfad_s *bfad, void *payload_kbuf,
2881b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		 uint32_t payload_len, uint32_t *num_sgles)
2882b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2883b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_buf_info	*buf_base, *buf_info;
2884b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_sge_s	*sg_table;
2885b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int sge_num = 1;
2886b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2887b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_base = kzalloc((sizeof(struct bfad_buf_info) +
2888b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			   sizeof(struct bfa_sge_s)) * sge_num, GFP_KERNEL);
2889b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!buf_base)
2890b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		return NULL;
2891b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2892b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_table = (struct bfa_sge_s *) (((uint8_t *)buf_base) +
2893b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(sizeof(struct bfad_buf_info) * sge_num));
2894b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2895b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Allocate dma coherent memory */
2896b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_info = buf_base;
2897b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_info->size = payload_len;
2898b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	buf_info->virt = dma_alloc_coherent(&bfad->pcidev->dev, buf_info->size,
2899b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					&buf_info->phys, GFP_KERNEL);
2900b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!buf_info->virt)
2901b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
2902b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2903b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* copy the linear bsg buffer to buf_info */
2904b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	memset(buf_info->virt, 0, buf_info->size);
2905b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	memcpy(buf_info->virt, payload_kbuf, buf_info->size);
2906b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2907b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/*
2908b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * Setup SG table
2909b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 */
2910b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_table->sg_len = buf_info->size;
2911b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_table->sg_addr = (void *)(size_t) buf_info->phys;
2912b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2913b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	*num_sgles = sge_num;
2914b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2915b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return buf_base;
2916b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2917b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout_free_mem:
2918b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(buf_base);
2919b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return NULL;
2920b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2921b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2922b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipativoid
2923b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_free_mem(struct bfad_s *bfad, struct bfad_buf_info *buf_base,
2924b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   uint32_t num_sgles)
2925b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2926b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int i;
2927b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_buf_info *buf_info = buf_base;
2928b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2929b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (buf_base) {
2930b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		for (i = 0; i < num_sgles; buf_info++, i++) {
2931b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			if (buf_info->virt != NULL)
2932b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				dma_free_coherent(&bfad->pcidev->dev,
2933b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					buf_info->size, buf_info->virt,
2934b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					buf_info->phys);
2935b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		}
2936b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		kfree(buf_base);
2937b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
2938b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2939b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2940b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
2941b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_fcxp_bsg_send(struct fc_bsg_job *job, struct bfad_fcxp *drv_fcxp,
2942b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   bfa_bsg_fcpt_t *bsg_fcpt)
2943b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2944b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcxp_s *hal_fcxp;
2945b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_s	*bfad = drv_fcxp->port->bfad;
2946b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long	flags;
2947b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint8_t	lp_tag;
2948b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2949b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
2950b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2951b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Allocate bfa_fcxp structure */
2952b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	hal_fcxp = bfa_fcxp_alloc(drv_fcxp, &bfad->bfa,
2953b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  drv_fcxp->num_req_sgles,
2954b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  drv_fcxp->num_rsp_sgles,
2955b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_req_sgaddr_cb,
2956b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_req_sglen_cb,
2957b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_rsp_sgaddr_cb,
2958b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				  bfad_fcxp_get_rsp_sglen_cb);
2959b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!hal_fcxp) {
2960b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bfa_trc(bfad, 0);
2961b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2962b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		return BFA_STATUS_ENOMEM;
2963b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
2964b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2965b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->bfa_fcxp = hal_fcxp;
2966b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2967b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	lp_tag = bfa_lps_get_tag_from_pid(&bfad->bfa, bsg_fcpt->fchs.s_id);
2968b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2969b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_fcxp_send(hal_fcxp, drv_fcxp->bfa_rport, bsg_fcpt->vf_id, lp_tag,
2970b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      bsg_fcpt->cts, bsg_fcpt->cos,
2971b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      job->request_payload.payload_len,
2972b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      &bsg_fcpt->fchs, bfad_send_fcpt_cb, bfad,
2973b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		      job->reply_payload.payload_len, bsg_fcpt->tsecs);
2974b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2975b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2976b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2977b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return BFA_STATUS_OK;
2978b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
2979b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2980b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
2981b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_els_ct_request(struct fc_bsg_job *job)
2982b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
2983b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_bsg_data *bsg_data;
2984b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_im_port_s *im_port =
2985b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			(struct bfad_im_port_s *) job->shost->hostdata[0];
2986b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_s *bfad = im_port->bfad;
2987b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfa_bsg_fcpt_t *bsg_fcpt;
2988b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_fcxp    *drv_fcxp;
2989b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_lport_s *fcs_port;
2990b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfa_fcs_rport_s *fcs_rport;
2991b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t command_type = job->request->msgcode;
2992b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	unsigned long flags;
2993b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	struct bfad_buf_info *rsp_buf_info;
2994b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	void *req_kbuf = NULL, *rsp_kbuf = NULL;
2995b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	int rc = -EINVAL;
2996b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
2997b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply_len  = sizeof(uint32_t);	/* Atleast uint32_t reply_len */
2998b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->reply_payload_rcv_len = 0;
2999b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3000b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Get the payload passed in from userspace */
3001b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bsg_data = (struct bfa_bsg_data *) (((char *)job->request) +
3002b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					sizeof(struct fc_bsg_request));
3003b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (bsg_data == NULL)
3004b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
3005b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3006b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/*
3007b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * Allocate buffer for bsg_fcpt and do a copy_from_user op for payload
3008b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * buffer of size bsg_data->payload_len
3009b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 */
301064b8aa75bc101eb73e2c76a66fb5432b4c83ffb2Jesper Juhl	bsg_fcpt = kzalloc(bsg_data->payload_len, GFP_KERNEL);
3011b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!bsg_fcpt)
3012b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
3013b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3014b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (copy_from_user((uint8_t *)bsg_fcpt, bsg_data->payload,
3015b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bsg_data->payload_len)) {
3016b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		kfree(bsg_fcpt);
3017b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
3018b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3019b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3020b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp = kzalloc(sizeof(struct bfad_fcxp), GFP_KERNEL);
3021b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_fcxp == NULL) {
302264b8aa75bc101eb73e2c76a66fb5432b4c83ffb2Jesper Juhl		kfree(bsg_fcpt);
3023b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
3024b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out;
3025b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3026b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3027b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_lock_irqsave(&bfad->bfad_lock, flags);
3028b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, bsg_fcpt->vf_id,
3029b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					bsg_fcpt->lpwwn);
3030b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (fcs_port == NULL) {
3031b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = BFA_STATUS_UNKNOWN_LWWN;
3032b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3033b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
3034b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3035b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3036b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Check if the port is online before sending FC Passthru cmd */
3037b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!bfa_fcs_lport_is_online(fcs_port)) {
3038b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = BFA_STATUS_PORT_OFFLINE;
3039b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3040b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
3041b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3042b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3043b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->port = fcs_port->bfad_port;
3044b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3045b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_fcxp->port->bfad == 0)
3046b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		drv_fcxp->port->bfad = bfad;
3047b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3048b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Fetch the bfa_rport - if nexus needed */
3049b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (command_type == FC_BSG_HST_ELS_NOLOGIN ||
3050b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	    command_type == FC_BSG_HST_CT) {
3051b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* BSG HST commands: no nexus needed */
3052b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		drv_fcxp->bfa_rport = NULL;
3053b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3054b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else if (command_type == FC_BSG_RPT_ELS ||
3055b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		   command_type == FC_BSG_RPT_CT) {
3056b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* BSG RPT commands: nexus needed */
3057b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		fcs_rport = bfa_fcs_lport_get_rport_by_pwwn(fcs_port,
3058b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati							    bsg_fcpt->dpwwn);
3059b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		if (fcs_rport == NULL) {
3060b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			bsg_fcpt->status = BFA_STATUS_UNKNOWN_RWWN;
3061b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3062b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			goto out_free_mem;
3063b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		}
3064b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3065b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		drv_fcxp->bfa_rport = fcs_rport->bfa_rport;
3066b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3067b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else { /* Unknown BSG msgcode; return -EINVAL */
3068b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3069b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
3070b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3071b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3072b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3073b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3074b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* allocate memory for req / rsp buffers */
3075b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	req_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL);
3076b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!req_kbuf) {
3077b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt request buffer alloc failed\n",
3078b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
3079b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
3080b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
3081b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3082b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3083b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rsp_kbuf = kzalloc(job->reply_payload.payload_len, GFP_KERNEL);
3084b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!rsp_kbuf) {
3085b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt response buffer alloc failed\n",
3086b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
3087b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
3088b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
3089b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3090b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3091b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* map req sg - copy the sg_list passed in to the linear buffer */
3092b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_to_buffer(job->request_payload.sg_list,
3093b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.sg_cnt, req_kbuf,
3094b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			  job->request_payload.payload_len);
3095b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3096b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->reqbuf_info = bfad_fcxp_map_sg(bfad, req_kbuf,
3097b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					job->request_payload.payload_len,
3098b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					&drv_fcxp->num_req_sgles);
3099b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!drv_fcxp->reqbuf_info) {
3100b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt request fcxp_map_sg failed\n",
3101b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
3102b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
3103b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
3104b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3105b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3106b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->req_sge = (struct bfa_sge_s *)
3107b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (((uint8_t *)drv_fcxp->reqbuf_info) +
3108b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (sizeof(struct bfad_buf_info) *
3109b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					drv_fcxp->num_req_sgles));
3110b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3111b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* map rsp sg */
3112b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->rspbuf_info = bfad_fcxp_map_sg(bfad, rsp_kbuf,
3113b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					job->reply_payload.payload_len,
3114b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					&drv_fcxp->num_rsp_sgles);
3115b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (!drv_fcxp->rspbuf_info) {
3116b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		printk(KERN_INFO "bfa %s: fcpt response fcxp_map_sg failed\n",
3117b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati				bfad->pci_name);
3118b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -ENOMEM;
3119b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
3120b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3121b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3122b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rsp_buf_info = (struct bfad_buf_info *)drv_fcxp->rspbuf_info;
3123b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	drv_fcxp->rsp_sge = (struct bfa_sge_s  *)
3124b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (((uint8_t *)drv_fcxp->rspbuf_info) +
3125b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (sizeof(struct bfad_buf_info) *
3126b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					drv_fcxp->num_rsp_sgles));
3127b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3128b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* fcxp send */
3129b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	init_completion(&drv_fcxp->comp);
3130b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	rc = bfad_fcxp_bsg_send(job, drv_fcxp, bsg_fcpt);
3131b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (rc == BFA_STATUS_OK) {
3132b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		wait_for_completion(&drv_fcxp->comp);
3133b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = drv_fcxp->req_status;
3134b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else {
3135b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		bsg_fcpt->status = rc;
3136b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		goto out_free_mem;
3137b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3138b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3139b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* fill the job->reply data */
3140b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (drv_fcxp->req_status == BFA_STATUS_OK) {
3141b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply_len = drv_fcxp->rsp_len;
3142b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_payload_rcv_len = drv_fcxp->rsp_len;
3143b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
3144b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	} else {
3145b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_payload_rcv_len =
3146b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati					sizeof(struct fc_bsg_ctels_reply);
3147b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply_len = sizeof(uint32_t);
3148b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_data.ctels_reply.status =
3149b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati						FC_CTELS_STATUS_REJECT;
3150b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3151b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3152b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Copy the response data to the reply_payload sg list */
3153b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	sg_copy_from_buffer(job->reply_payload.sg_list,
3154b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.sg_cnt,
3155b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    (uint8_t *)rsp_buf_info->virt,
3156b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			    job->reply_payload.payload_len);
3157b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3158b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout_free_mem:
3159b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfad_fcxp_free_mem(bfad, drv_fcxp->rspbuf_info,
3160b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			   drv_fcxp->num_rsp_sgles);
3161b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	bfad_fcxp_free_mem(bfad, drv_fcxp->reqbuf_info,
3162b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			   drv_fcxp->num_req_sgles);
3163b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(req_kbuf);
3164b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(rsp_kbuf);
3165b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3166b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Need a copy to user op */
3167b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (copy_to_user(bsg_data->payload, (void *) bsg_fcpt,
3168b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati			 bsg_data->payload_len))
3169b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = -EIO;
3170b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3171b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(bsg_fcpt);
3172b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	kfree(drv_fcxp);
3173b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiout:
3174b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	job->reply->result = rc;
3175b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3176b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	if (rc == BFA_STATUS_OK)
3177b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->job_done(job);
3178b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3179b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
3180b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
3181b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3182b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
3183b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_request(struct fc_bsg_job *job)
3184b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
3185b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	uint32_t rc = BFA_STATUS_OK;
3186b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3187b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	switch (job->request->msgcode) {
3188b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_HST_VENDOR:
3189b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* Process BSG HST Vendor requests */
3190b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_im_bsg_vendor_request(job);
3191b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
3192b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_HST_ELS_NOLOGIN:
3193b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_RPT_ELS:
3194b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_HST_CT:
3195b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	case FC_BSG_RPT_CT:
3196b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		/* Process BSG ELS/CT commands */
3197b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		rc = bfad_im_bsg_els_ct_request(job);
3198b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
3199b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	default:
3200b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->result = rc = -EINVAL;
3201b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		job->reply->reply_payload_rcv_len = 0;
3202b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati		break;
3203b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	}
3204b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3205b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return rc;
3206b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
3207b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati
3208b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatiint
3209b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipatibfad_im_bsg_timeout(struct fc_bsg_job *job)
3210b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati{
3211b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	/* Don't complete the BSG job request - return -EAGAIN
3212b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * to reset bsg job timeout : for ELS/CT pass thru we
3213b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 * already have timer to track the request.
3214b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	 */
3215b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati	return -EAGAIN;
3216b85daafe46eeb0a9ad32c4b2c3a4e09ffcae9599Krishna Gudipati}
3217