xref: /linux/drivers/scsi/bfa/bfad_bsg.c (revision 0ea8a56de21be24cb79abb03dee79aabcd60a316)
152fa7bf9SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2b85daafeSKrishna Gudipati /*
3889d0d42SAnil Gurumurthy  * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
4889d0d42SAnil Gurumurthy  * Copyright (c) 2014- QLogic Corporation.
5b85daafeSKrishna Gudipati  * All rights reserved
6889d0d42SAnil Gurumurthy  * www.qlogic.com
7b85daafeSKrishna Gudipati  *
831e1d569SAnil Gurumurthy  * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
9b85daafeSKrishna Gudipati  */
10b85daafeSKrishna Gudipati 
11b85daafeSKrishna Gudipati #include <linux/uaccess.h>
12b85daafeSKrishna Gudipati #include "bfad_drv.h"
13b85daafeSKrishna Gudipati #include "bfad_im.h"
14b85daafeSKrishna Gudipati #include "bfad_bsg.h"
15b85daafeSKrishna Gudipati 
16b85daafeSKrishna Gudipati BFA_TRC_FILE(LDRV, BSG);
17b85daafeSKrishna Gudipati 
18*3bbd8ef9SLee Jones static int
1960138066SKrishna Gudipati bfad_iocmd_ioc_enable(struct bfad_s *bfad, void *cmd)
2060138066SKrishna Gudipati {
2160138066SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
2260138066SKrishna Gudipati 	unsigned long	flags;
2360138066SKrishna Gudipati 
2460138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2560138066SKrishna Gudipati 	/* If IOC is not in disabled state - return */
2660138066SKrishna Gudipati 	if (!bfa_ioc_is_disabled(&bfad->bfa.ioc)) {
2760138066SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
281a1297c6SKrishna Gudipati 		iocmd->status = BFA_STATUS_OK;
290e772b33SPeter Senna Tschudin 		return 0;
3060138066SKrishna Gudipati 	}
3160138066SKrishna Gudipati 
3260138066SKrishna Gudipati 	init_completion(&bfad->enable_comp);
3360138066SKrishna Gudipati 	bfa_iocfc_enable(&bfad->bfa);
3460138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
3560138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3660138066SKrishna Gudipati 	wait_for_completion(&bfad->enable_comp);
3760138066SKrishna Gudipati 
380e772b33SPeter Senna Tschudin 	return 0;
3960138066SKrishna Gudipati }
4060138066SKrishna Gudipati 
41*3bbd8ef9SLee Jones static int
4260138066SKrishna Gudipati bfad_iocmd_ioc_disable(struct bfad_s *bfad, void *cmd)
4360138066SKrishna Gudipati {
4460138066SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
4560138066SKrishna Gudipati 	unsigned long	flags;
4660138066SKrishna Gudipati 
4760138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
481a1297c6SKrishna Gudipati 	if (bfa_ioc_is_disabled(&bfad->bfa.ioc)) {
491a1297c6SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
501a1297c6SKrishna Gudipati 		iocmd->status = BFA_STATUS_OK;
510e772b33SPeter Senna Tschudin 		return 0;
521a1297c6SKrishna Gudipati 	}
531a1297c6SKrishna Gudipati 
5460138066SKrishna Gudipati 	if (bfad->disable_active) {
5560138066SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
569afbcfabSKrishna Gudipati 		return -EBUSY;
5760138066SKrishna Gudipati 	}
5860138066SKrishna Gudipati 
5960138066SKrishna Gudipati 	bfad->disable_active = BFA_TRUE;
6060138066SKrishna Gudipati 	init_completion(&bfad->disable_comp);
6160138066SKrishna Gudipati 	bfa_iocfc_disable(&bfad->bfa);
6260138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
6360138066SKrishna Gudipati 
6460138066SKrishna Gudipati 	wait_for_completion(&bfad->disable_comp);
6560138066SKrishna Gudipati 	bfad->disable_active = BFA_FALSE;
6660138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
6760138066SKrishna Gudipati 
680e772b33SPeter Senna Tschudin 	return 0;
6960138066SKrishna Gudipati }
7060138066SKrishna Gudipati 
71b85daafeSKrishna Gudipati static int
72b85daafeSKrishna Gudipati bfad_iocmd_ioc_get_info(struct bfad_s *bfad, void *cmd)
73b85daafeSKrishna Gudipati {
74b85daafeSKrishna Gudipati 	int	i;
75b85daafeSKrishna Gudipati 	struct bfa_bsg_ioc_info_s *iocmd = (struct bfa_bsg_ioc_info_s *)cmd;
76b85daafeSKrishna Gudipati 	struct bfad_im_port_s	*im_port;
77b85daafeSKrishna Gudipati 	struct bfa_port_attr_s	pattr;
78b85daafeSKrishna Gudipati 	unsigned long	flags;
79b85daafeSKrishna Gudipati 
80b85daafeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
81b85daafeSKrishna Gudipati 	bfa_fcport_get_attr(&bfad->bfa, &pattr);
82b85daafeSKrishna Gudipati 	iocmd->nwwn = pattr.nwwn;
83b85daafeSKrishna Gudipati 	iocmd->pwwn = pattr.pwwn;
84b85daafeSKrishna Gudipati 	iocmd->ioc_type = bfa_get_type(&bfad->bfa);
85b85daafeSKrishna Gudipati 	iocmd->mac = bfa_get_mac(&bfad->bfa);
86b85daafeSKrishna Gudipati 	iocmd->factory_mac = bfa_get_mfg_mac(&bfad->bfa);
87b85daafeSKrishna Gudipati 	bfa_get_adapter_serial_num(&bfad->bfa, iocmd->serialnum);
88b85daafeSKrishna Gudipati 	iocmd->factorynwwn = pattr.factorynwwn;
89b85daafeSKrishna Gudipati 	iocmd->factorypwwn = pattr.factorypwwn;
907826f304SKrishna Gudipati 	iocmd->bfad_num = bfad->inst_no;
91b85daafeSKrishna Gudipati 	im_port = bfad->pport.im_port;
92b85daafeSKrishna Gudipati 	iocmd->host = im_port->shost->host_no;
93b85daafeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
94b85daafeSKrishna Gudipati 
95b85daafeSKrishna Gudipati 	strcpy(iocmd->name, bfad->adapter_name);
96b85daafeSKrishna Gudipati 	strcpy(iocmd->port_name, bfad->port_name);
97b85daafeSKrishna Gudipati 	strcpy(iocmd->hwpath, bfad->pci_name);
98b85daafeSKrishna Gudipati 
99b85daafeSKrishna Gudipati 	/* set adapter hw path */
100b85daafeSKrishna Gudipati 	strcpy(iocmd->adapter_hwpath, bfad->pci_name);
101e6826c96SKrishna Gudipati 	for (i = 0; iocmd->adapter_hwpath[i] != ':' && i < BFA_STRING_32; i++)
102e6826c96SKrishna Gudipati 		;
103e6826c96SKrishna Gudipati 	for (; iocmd->adapter_hwpath[++i] != ':' && i < BFA_STRING_32; )
104e6826c96SKrishna Gudipati 		;
105b85daafeSKrishna Gudipati 	iocmd->adapter_hwpath[i] = '\0';
106b85daafeSKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
107b85daafeSKrishna Gudipati 	return 0;
108b85daafeSKrishna Gudipati }
109b85daafeSKrishna Gudipati 
110b85daafeSKrishna Gudipati static int
111b85daafeSKrishna Gudipati bfad_iocmd_ioc_get_attr(struct bfad_s *bfad, void *cmd)
112b85daafeSKrishna Gudipati {
113b85daafeSKrishna Gudipati 	struct bfa_bsg_ioc_attr_s *iocmd = (struct bfa_bsg_ioc_attr_s *)cmd;
114b85daafeSKrishna Gudipati 	unsigned long	flags;
115b85daafeSKrishna Gudipati 
116b85daafeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
117b85daafeSKrishna Gudipati 	bfa_ioc_get_attr(&bfad->bfa.ioc, &iocmd->ioc_attr);
118b85daafeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
119b85daafeSKrishna Gudipati 
120b85daafeSKrishna Gudipati 	/* fill in driver attr info */
121b85daafeSKrishna Gudipati 	strcpy(iocmd->ioc_attr.driver_attr.driver, BFAD_DRIVER_NAME);
1228c5a50e8SArnd Bergmann 	strlcpy(iocmd->ioc_attr.driver_attr.driver_ver,
123b85daafeSKrishna Gudipati 		BFAD_DRIVER_VERSION, BFA_VERSION_LEN);
124b85daafeSKrishna Gudipati 	strcpy(iocmd->ioc_attr.driver_attr.fw_ver,
125b85daafeSKrishna Gudipati 		iocmd->ioc_attr.adapter_attr.fw_ver);
126b85daafeSKrishna Gudipati 	strcpy(iocmd->ioc_attr.driver_attr.bios_ver,
127b85daafeSKrishna Gudipati 		iocmd->ioc_attr.adapter_attr.optrom_ver);
128b85daafeSKrishna Gudipati 
129b85daafeSKrishna Gudipati 	/* copy chip rev info first otherwise it will be overwritten */
130b85daafeSKrishna Gudipati 	memcpy(bfad->pci_attr.chip_rev, iocmd->ioc_attr.pci_attr.chip_rev,
131b85daafeSKrishna Gudipati 		sizeof(bfad->pci_attr.chip_rev));
132b85daafeSKrishna Gudipati 	memcpy(&iocmd->ioc_attr.pci_attr, &bfad->pci_attr,
133b85daafeSKrishna Gudipati 		sizeof(struct bfa_ioc_pci_attr_s));
134b85daafeSKrishna Gudipati 
135b85daafeSKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
136b85daafeSKrishna Gudipati 	return 0;
137b85daafeSKrishna Gudipati }
138b85daafeSKrishna Gudipati 
13910202648SJason Yan static int
14060138066SKrishna Gudipati bfad_iocmd_ioc_get_stats(struct bfad_s *bfad, void *cmd)
14160138066SKrishna Gudipati {
14260138066SKrishna Gudipati 	struct bfa_bsg_ioc_stats_s *iocmd = (struct bfa_bsg_ioc_stats_s *)cmd;
14360138066SKrishna Gudipati 
14460138066SKrishna Gudipati 	bfa_ioc_get_stats(&bfad->bfa, &iocmd->ioc_stats);
14560138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
14660138066SKrishna Gudipati 	return 0;
14760138066SKrishna Gudipati }
14860138066SKrishna Gudipati 
149*3bbd8ef9SLee Jones static int
15060138066SKrishna Gudipati bfad_iocmd_ioc_get_fwstats(struct bfad_s *bfad, void *cmd,
15160138066SKrishna Gudipati 			unsigned int payload_len)
15260138066SKrishna Gudipati {
15360138066SKrishna Gudipati 	struct bfa_bsg_ioc_fwstats_s *iocmd =
15460138066SKrishna Gudipati 			(struct bfa_bsg_ioc_fwstats_s *)cmd;
15560138066SKrishna Gudipati 	void	*iocmd_bufptr;
15660138066SKrishna Gudipati 	unsigned long	flags;
15760138066SKrishna Gudipati 
15860138066SKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len,
15960138066SKrishna Gudipati 			sizeof(struct bfa_bsg_ioc_fwstats_s),
16060138066SKrishna Gudipati 			sizeof(struct bfa_fw_stats_s)) != BFA_STATUS_OK) {
16160138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
16260138066SKrishna Gudipati 		goto out;
16360138066SKrishna Gudipati 	}
16460138066SKrishna Gudipati 
16560138066SKrishna Gudipati 	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_ioc_fwstats_s);
16660138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
16760138066SKrishna Gudipati 	iocmd->status = bfa_ioc_fw_stats_get(&bfad->bfa.ioc, iocmd_bufptr);
16860138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16960138066SKrishna Gudipati 
17060138066SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
17160138066SKrishna Gudipati 		bfa_trc(bfad, iocmd->status);
17260138066SKrishna Gudipati 		goto out;
17360138066SKrishna Gudipati 	}
17460138066SKrishna Gudipati out:
17560138066SKrishna Gudipati 	bfa_trc(bfad, 0x6666);
17660138066SKrishna Gudipati 	return 0;
17760138066SKrishna Gudipati }
17860138066SKrishna Gudipati 
179*3bbd8ef9SLee Jones static int
180f2ee7601SKrishna Gudipati bfad_iocmd_ioc_reset_stats(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
181f2ee7601SKrishna Gudipati {
182f2ee7601SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
183f2ee7601SKrishna Gudipati 	unsigned long	flags;
184f2ee7601SKrishna Gudipati 
185f2ee7601SKrishna Gudipati 	if (v_cmd == IOCMD_IOC_RESET_STATS) {
186f2ee7601SKrishna Gudipati 		bfa_ioc_clear_stats(&bfad->bfa);
187f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_OK;
188f2ee7601SKrishna Gudipati 	} else if (v_cmd == IOCMD_IOC_RESET_FWSTATS) {
189f2ee7601SKrishna Gudipati 		spin_lock_irqsave(&bfad->bfad_lock, flags);
190f2ee7601SKrishna Gudipati 		iocmd->status = bfa_ioc_fw_stats_clear(&bfad->bfa.ioc);
191f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
192f2ee7601SKrishna Gudipati 	}
193f2ee7601SKrishna Gudipati 
194f2ee7601SKrishna Gudipati 	return 0;
195f2ee7601SKrishna Gudipati }
196f2ee7601SKrishna Gudipati 
197*3bbd8ef9SLee Jones static int
198f2ee7601SKrishna Gudipati bfad_iocmd_ioc_set_name(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
199f2ee7601SKrishna Gudipati {
200f2ee7601SKrishna Gudipati 	struct bfa_bsg_ioc_name_s *iocmd = (struct bfa_bsg_ioc_name_s *) cmd;
201f2ee7601SKrishna Gudipati 
202f2ee7601SKrishna Gudipati 	if (v_cmd == IOCMD_IOC_SET_ADAPTER_NAME)
203f2ee7601SKrishna Gudipati 		strcpy(bfad->adapter_name, iocmd->name);
204f2ee7601SKrishna Gudipati 	else if (v_cmd == IOCMD_IOC_SET_PORT_NAME)
205f2ee7601SKrishna Gudipati 		strcpy(bfad->port_name, iocmd->name);
206f2ee7601SKrishna Gudipati 
207f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
208f2ee7601SKrishna Gudipati 	return 0;
209f2ee7601SKrishna Gudipati }
210f2ee7601SKrishna Gudipati 
211*3bbd8ef9SLee Jones static int
21260138066SKrishna Gudipati bfad_iocmd_iocfc_get_attr(struct bfad_s *bfad, void *cmd)
21360138066SKrishna Gudipati {
21460138066SKrishna Gudipati 	struct bfa_bsg_iocfc_attr_s *iocmd = (struct bfa_bsg_iocfc_attr_s *)cmd;
21560138066SKrishna Gudipati 
21660138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
21760138066SKrishna Gudipati 	bfa_iocfc_get_attr(&bfad->bfa, &iocmd->iocfc_attr);
21860138066SKrishna Gudipati 
21960138066SKrishna Gudipati 	return 0;
22060138066SKrishna Gudipati }
22160138066SKrishna Gudipati 
222*3bbd8ef9SLee Jones static int
22328d358d0SVijaya Mohan Guvva bfad_iocmd_ioc_fw_sig_inv(struct bfad_s *bfad, void *cmd)
22428d358d0SVijaya Mohan Guvva {
22528d358d0SVijaya Mohan Guvva 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
22628d358d0SVijaya Mohan Guvva 	unsigned long flags;
22728d358d0SVijaya Mohan Guvva 
22828d358d0SVijaya Mohan Guvva 	spin_lock_irqsave(&bfad->bfad_lock, flags);
22928d358d0SVijaya Mohan Guvva 	iocmd->status = bfa_ioc_fwsig_invalidate(&bfad->bfa.ioc);
23028d358d0SVijaya Mohan Guvva 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
23128d358d0SVijaya Mohan Guvva 	return 0;
23228d358d0SVijaya Mohan Guvva }
23328d358d0SVijaya Mohan Guvva 
234*3bbd8ef9SLee Jones static int
23560138066SKrishna Gudipati bfad_iocmd_iocfc_set_intr(struct bfad_s *bfad, void *cmd)
23660138066SKrishna Gudipati {
23760138066SKrishna Gudipati 	struct bfa_bsg_iocfc_intr_s *iocmd = (struct bfa_bsg_iocfc_intr_s *)cmd;
23860138066SKrishna Gudipati 	unsigned long	flags;
23960138066SKrishna Gudipati 
24060138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
24160138066SKrishna Gudipati 	iocmd->status = bfa_iocfc_israttr_set(&bfad->bfa, &iocmd->attr);
24260138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
24360138066SKrishna Gudipati 
24460138066SKrishna Gudipati 	return 0;
24560138066SKrishna Gudipati }
24660138066SKrishna Gudipati 
247*3bbd8ef9SLee Jones static int
24860138066SKrishna Gudipati bfad_iocmd_port_enable(struct bfad_s *bfad, void *cmd)
24960138066SKrishna Gudipati {
25060138066SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
25160138066SKrishna Gudipati 	struct bfad_hal_comp fcomp;
25260138066SKrishna Gudipati 	unsigned long flags;
25360138066SKrishna Gudipati 
25460138066SKrishna Gudipati 	init_completion(&fcomp.comp);
25560138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
25660138066SKrishna Gudipati 	iocmd->status = bfa_port_enable(&bfad->bfa.modules.port,
25760138066SKrishna Gudipati 					bfad_hcb_comp, &fcomp);
25860138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
25960138066SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
26060138066SKrishna Gudipati 		bfa_trc(bfad, iocmd->status);
26160138066SKrishna Gudipati 		return 0;
26260138066SKrishna Gudipati 	}
26360138066SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
26460138066SKrishna Gudipati 	iocmd->status = fcomp.status;
26560138066SKrishna Gudipati 	return 0;
26660138066SKrishna Gudipati }
26760138066SKrishna Gudipati 
268*3bbd8ef9SLee Jones static int
26960138066SKrishna Gudipati bfad_iocmd_port_disable(struct bfad_s *bfad, void *cmd)
27060138066SKrishna Gudipati {
27160138066SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
27260138066SKrishna Gudipati 	struct bfad_hal_comp fcomp;
27360138066SKrishna Gudipati 	unsigned long flags;
27460138066SKrishna Gudipati 
27560138066SKrishna Gudipati 	init_completion(&fcomp.comp);
27660138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
27760138066SKrishna Gudipati 	iocmd->status = bfa_port_disable(&bfad->bfa.modules.port,
27860138066SKrishna Gudipati 				bfad_hcb_comp, &fcomp);
27960138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
28060138066SKrishna Gudipati 
28160138066SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
28260138066SKrishna Gudipati 		bfa_trc(bfad, iocmd->status);
28360138066SKrishna Gudipati 		return 0;
28460138066SKrishna Gudipati 	}
28560138066SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
28660138066SKrishna Gudipati 	iocmd->status = fcomp.status;
28760138066SKrishna Gudipati 	return 0;
28860138066SKrishna Gudipati }
28960138066SKrishna Gudipati 
290b85daafeSKrishna Gudipati static int
291b85daafeSKrishna Gudipati bfad_iocmd_port_get_attr(struct bfad_s *bfad, void *cmd)
292b85daafeSKrishna Gudipati {
293b85daafeSKrishna Gudipati 	struct bfa_bsg_port_attr_s *iocmd = (struct bfa_bsg_port_attr_s *)cmd;
294b85daafeSKrishna Gudipati 	struct bfa_lport_attr_s	port_attr;
295b85daafeSKrishna Gudipati 	unsigned long	flags;
296b85daafeSKrishna Gudipati 
297b85daafeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
298b85daafeSKrishna Gudipati 	bfa_fcport_get_attr(&bfad->bfa, &iocmd->attr);
299b85daafeSKrishna Gudipati 	bfa_fcs_lport_get_attr(&bfad->bfa_fcs.fabric.bport, &port_attr);
300b85daafeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
301b85daafeSKrishna Gudipati 
302b85daafeSKrishna Gudipati 	if (iocmd->attr.topology != BFA_PORT_TOPOLOGY_NONE)
303b85daafeSKrishna Gudipati 		iocmd->attr.pid = port_attr.pid;
304b85daafeSKrishna Gudipati 	else
305b85daafeSKrishna Gudipati 		iocmd->attr.pid = 0;
306b85daafeSKrishna Gudipati 
307b85daafeSKrishna Gudipati 	iocmd->attr.port_type = port_attr.port_type;
308b85daafeSKrishna Gudipati 	iocmd->attr.loopback = port_attr.loopback;
309b85daafeSKrishna Gudipati 	iocmd->attr.authfail = port_attr.authfail;
3108c5a50e8SArnd Bergmann 	strlcpy(iocmd->attr.port_symname.symname,
311b85daafeSKrishna Gudipati 		port_attr.port_cfg.sym_name.symname,
3128c5a50e8SArnd Bergmann 		sizeof(iocmd->attr.port_symname.symname));
313b85daafeSKrishna Gudipati 
314b85daafeSKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
315b85daafeSKrishna Gudipati 	return 0;
316b85daafeSKrishna Gudipati }
317b85daafeSKrishna Gudipati 
318*3bbd8ef9SLee Jones static int
31960138066SKrishna Gudipati bfad_iocmd_port_get_stats(struct bfad_s *bfad, void *cmd,
32060138066SKrishna Gudipati 			unsigned int payload_len)
32160138066SKrishna Gudipati {
32260138066SKrishna Gudipati 	struct bfa_bsg_port_stats_s *iocmd = (struct bfa_bsg_port_stats_s *)cmd;
32360138066SKrishna Gudipati 	struct bfad_hal_comp fcomp;
32460138066SKrishna Gudipati 	void	*iocmd_bufptr;
32560138066SKrishna Gudipati 	unsigned long	flags;
32660138066SKrishna Gudipati 
32760138066SKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len,
32860138066SKrishna Gudipati 			sizeof(struct bfa_bsg_port_stats_s),
32960138066SKrishna Gudipati 			sizeof(union bfa_port_stats_u)) != BFA_STATUS_OK) {
33060138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
33160138066SKrishna Gudipati 		return 0;
33260138066SKrishna Gudipati 	}
33360138066SKrishna Gudipati 
33460138066SKrishna Gudipati 	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_port_stats_s);
33560138066SKrishna Gudipati 
33660138066SKrishna Gudipati 	init_completion(&fcomp.comp);
33760138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
33860138066SKrishna Gudipati 	iocmd->status = bfa_port_get_stats(&bfad->bfa.modules.port,
33960138066SKrishna Gudipati 				iocmd_bufptr, bfad_hcb_comp, &fcomp);
34060138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
34160138066SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
34260138066SKrishna Gudipati 		bfa_trc(bfad, iocmd->status);
34360138066SKrishna Gudipati 		goto out;
34460138066SKrishna Gudipati 	}
34560138066SKrishna Gudipati 
34660138066SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
34760138066SKrishna Gudipati 	iocmd->status = fcomp.status;
34860138066SKrishna Gudipati out:
34960138066SKrishna Gudipati 	return 0;
35060138066SKrishna Gudipati }
35160138066SKrishna Gudipati 
352*3bbd8ef9SLee Jones static int
353f2ee7601SKrishna Gudipati bfad_iocmd_port_reset_stats(struct bfad_s *bfad, void *cmd)
354f2ee7601SKrishna Gudipati {
355f2ee7601SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
356f2ee7601SKrishna Gudipati 	struct bfad_hal_comp fcomp;
357f2ee7601SKrishna Gudipati 	unsigned long	flags;
358f2ee7601SKrishna Gudipati 
359f2ee7601SKrishna Gudipati 	init_completion(&fcomp.comp);
360f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
361f2ee7601SKrishna Gudipati 	iocmd->status = bfa_port_clear_stats(&bfad->bfa.modules.port,
362f2ee7601SKrishna Gudipati 					bfad_hcb_comp, &fcomp);
363f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
364f2ee7601SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
365f2ee7601SKrishna Gudipati 		bfa_trc(bfad, iocmd->status);
366f2ee7601SKrishna Gudipati 		return 0;
367f2ee7601SKrishna Gudipati 	}
368f2ee7601SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
369f2ee7601SKrishna Gudipati 	iocmd->status = fcomp.status;
370f2ee7601SKrishna Gudipati 	return 0;
371f2ee7601SKrishna Gudipati }
372f2ee7601SKrishna Gudipati 
373*3bbd8ef9SLee Jones static int
374f2ee7601SKrishna Gudipati bfad_iocmd_set_port_cfg(struct bfad_s *bfad, void *iocmd, unsigned int v_cmd)
375f2ee7601SKrishna Gudipati {
376f2ee7601SKrishna Gudipati 	struct bfa_bsg_port_cfg_s *cmd = (struct bfa_bsg_port_cfg_s *)iocmd;
377f2ee7601SKrishna Gudipati 	unsigned long	flags;
378f2ee7601SKrishna Gudipati 
379f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
380f2ee7601SKrishna Gudipati 	if (v_cmd == IOCMD_PORT_CFG_TOPO)
381f2ee7601SKrishna Gudipati 		cmd->status = bfa_fcport_cfg_topology(&bfad->bfa, cmd->param);
382f2ee7601SKrishna Gudipati 	else if (v_cmd == IOCMD_PORT_CFG_SPEED)
383f2ee7601SKrishna Gudipati 		cmd->status = bfa_fcport_cfg_speed(&bfad->bfa, cmd->param);
384f2ee7601SKrishna Gudipati 	else if (v_cmd == IOCMD_PORT_CFG_ALPA)
385f2ee7601SKrishna Gudipati 		cmd->status = bfa_fcport_cfg_hardalpa(&bfad->bfa, cmd->param);
386f2ee7601SKrishna Gudipati 	else if (v_cmd == IOCMD_PORT_CLR_ALPA)
387f2ee7601SKrishna Gudipati 		cmd->status = bfa_fcport_clr_hardalpa(&bfad->bfa);
388f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
389f2ee7601SKrishna Gudipati 
390f2ee7601SKrishna Gudipati 	return 0;
391f2ee7601SKrishna Gudipati }
392f2ee7601SKrishna Gudipati 
393*3bbd8ef9SLee Jones static int
394f2ee7601SKrishna Gudipati bfad_iocmd_port_cfg_maxfrsize(struct bfad_s *bfad, void *cmd)
395f2ee7601SKrishna Gudipati {
396f2ee7601SKrishna Gudipati 	struct bfa_bsg_port_cfg_maxfrsize_s *iocmd =
397f2ee7601SKrishna Gudipati 				(struct bfa_bsg_port_cfg_maxfrsize_s *)cmd;
398f2ee7601SKrishna Gudipati 	unsigned long	flags;
399f2ee7601SKrishna Gudipati 
400f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
401f2ee7601SKrishna Gudipati 	iocmd->status = bfa_fcport_cfg_maxfrsize(&bfad->bfa, iocmd->maxfrsize);
402f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
403f2ee7601SKrishna Gudipati 
404f2ee7601SKrishna Gudipati 	return 0;
405f2ee7601SKrishna Gudipati }
406f2ee7601SKrishna Gudipati 
407*3bbd8ef9SLee Jones static int
408bbe37a67SVijaya Mohan Guvva bfad_iocmd_port_cfg_bbcr(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
409f2ee7601SKrishna Gudipati {
410bbe37a67SVijaya Mohan Guvva 	struct bfa_bsg_bbcr_enable_s *iocmd =
411bbe37a67SVijaya Mohan Guvva 			(struct bfa_bsg_bbcr_enable_s *)pcmd;
412f2ee7601SKrishna Gudipati 	unsigned long flags;
413bbe37a67SVijaya Mohan Guvva 	int rc;
414f2ee7601SKrishna Gudipati 
415f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
416bbe37a67SVijaya Mohan Guvva 	if (cmd == IOCMD_PORT_BBCR_ENABLE)
417bbe37a67SVijaya Mohan Guvva 		rc = bfa_fcport_cfg_bbcr(&bfad->bfa, BFA_TRUE, iocmd->bb_scn);
418bbe37a67SVijaya Mohan Guvva 	else if (cmd == IOCMD_PORT_BBCR_DISABLE)
419bbe37a67SVijaya Mohan Guvva 		rc = bfa_fcport_cfg_bbcr(&bfad->bfa, BFA_FALSE, 0);
420bbe37a67SVijaya Mohan Guvva 	else {
421bbe37a67SVijaya Mohan Guvva 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
422bbe37a67SVijaya Mohan Guvva 		return -EINVAL;
423f2ee7601SKrishna Gudipati 	}
424f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
425f2ee7601SKrishna Gudipati 
426bbe37a67SVijaya Mohan Guvva 	iocmd->status = rc;
427f2ee7601SKrishna Gudipati 	return 0;
428f2ee7601SKrishna Gudipati }
429f2ee7601SKrishna Gudipati 
430*3bbd8ef9SLee Jones static int
431bbe37a67SVijaya Mohan Guvva bfad_iocmd_port_get_bbcr_attr(struct bfad_s *bfad, void *pcmd)
432bbe37a67SVijaya Mohan Guvva {
433bbe37a67SVijaya Mohan Guvva 	struct bfa_bsg_bbcr_attr_s *iocmd = (struct bfa_bsg_bbcr_attr_s *) pcmd;
434bbe37a67SVijaya Mohan Guvva 	unsigned long flags;
435bbe37a67SVijaya Mohan Guvva 
436bbe37a67SVijaya Mohan Guvva 	spin_lock_irqsave(&bfad->bfad_lock, flags);
437bbe37a67SVijaya Mohan Guvva 	iocmd->status =
438bbe37a67SVijaya Mohan Guvva 		bfa_fcport_get_bbcr_attr(&bfad->bfa, &iocmd->attr);
439bbe37a67SVijaya Mohan Guvva 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
440bbe37a67SVijaya Mohan Guvva 
441bbe37a67SVijaya Mohan Guvva 	return 0;
442bbe37a67SVijaya Mohan Guvva }
443bbe37a67SVijaya Mohan Guvva 
444bbe37a67SVijaya Mohan Guvva 
445b85daafeSKrishna Gudipati static int
446b85daafeSKrishna Gudipati bfad_iocmd_lport_get_attr(struct bfad_s *bfad, void *cmd)
447b85daafeSKrishna Gudipati {
448b85daafeSKrishna Gudipati 	struct bfa_fcs_lport_s	*fcs_port;
449b85daafeSKrishna Gudipati 	struct bfa_bsg_lport_attr_s *iocmd = (struct bfa_bsg_lport_attr_s *)cmd;
450b85daafeSKrishna Gudipati 	unsigned long	flags;
451b85daafeSKrishna Gudipati 
452b85daafeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
453b85daafeSKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
454b85daafeSKrishna Gudipati 				iocmd->vf_id, iocmd->pwwn);
455b85daafeSKrishna Gudipati 	if (fcs_port == NULL) {
456b85daafeSKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
457b85daafeSKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
458b85daafeSKrishna Gudipati 		goto out;
459b85daafeSKrishna Gudipati 	}
460b85daafeSKrishna Gudipati 
461b85daafeSKrishna Gudipati 	bfa_fcs_lport_get_attr(fcs_port, &iocmd->port_attr);
462b85daafeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
463b85daafeSKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
464b85daafeSKrishna Gudipati out:
465b85daafeSKrishna Gudipati 	return 0;
466b85daafeSKrishna Gudipati }
467b85daafeSKrishna Gudipati 
468*3bbd8ef9SLee Jones static int
46960138066SKrishna Gudipati bfad_iocmd_lport_get_stats(struct bfad_s *bfad, void *cmd)
47060138066SKrishna Gudipati {
47160138066SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
47260138066SKrishna Gudipati 	struct bfa_bsg_lport_stats_s *iocmd =
47360138066SKrishna Gudipati 			(struct bfa_bsg_lport_stats_s *)cmd;
47460138066SKrishna Gudipati 	unsigned long	flags;
47560138066SKrishna Gudipati 
47660138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
47760138066SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
47860138066SKrishna Gudipati 				iocmd->vf_id, iocmd->pwwn);
47960138066SKrishna Gudipati 	if (fcs_port == NULL) {
48060138066SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
48160138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
48260138066SKrishna Gudipati 		goto out;
48360138066SKrishna Gudipati 	}
48460138066SKrishna Gudipati 
48560138066SKrishna Gudipati 	bfa_fcs_lport_get_stats(fcs_port, &iocmd->port_stats);
48660138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
48760138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
48860138066SKrishna Gudipati out:
48960138066SKrishna Gudipati 	return 0;
49060138066SKrishna Gudipati }
49160138066SKrishna Gudipati 
492*3bbd8ef9SLee Jones static int
493f2ee7601SKrishna Gudipati bfad_iocmd_lport_reset_stats(struct bfad_s *bfad, void *cmd)
494f2ee7601SKrishna Gudipati {
495f2ee7601SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
496f2ee7601SKrishna Gudipati 	struct bfa_bsg_reset_stats_s *iocmd =
497f2ee7601SKrishna Gudipati 			(struct bfa_bsg_reset_stats_s *)cmd;
498f2ee7601SKrishna Gudipati 	struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
499f2ee7601SKrishna Gudipati 	struct list_head *qe, *qen;
500f2ee7601SKrishna Gudipati 	struct bfa_itnim_s *itnim;
501f2ee7601SKrishna Gudipati 	unsigned long	flags;
502f2ee7601SKrishna Gudipati 
503f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
504f2ee7601SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
505f2ee7601SKrishna Gudipati 				iocmd->vf_id, iocmd->vpwwn);
506f2ee7601SKrishna Gudipati 	if (fcs_port == NULL) {
507f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
508f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
509f2ee7601SKrishna Gudipati 		goto out;
510f2ee7601SKrishna Gudipati 	}
511f2ee7601SKrishna Gudipati 
512f2ee7601SKrishna Gudipati 	bfa_fcs_lport_clear_stats(fcs_port);
513f2ee7601SKrishna Gudipati 	/* clear IO stats from all active itnims */
514f2ee7601SKrishna Gudipati 	list_for_each_safe(qe, qen, &fcpim->itnim_q) {
515f2ee7601SKrishna Gudipati 		itnim = (struct bfa_itnim_s *) qe;
516f2ee7601SKrishna Gudipati 		if (itnim->rport->rport_info.lp_tag != fcs_port->lp_tag)
517f2ee7601SKrishna Gudipati 			continue;
518f2ee7601SKrishna Gudipati 		bfa_itnim_clear_stats(itnim);
519f2ee7601SKrishna Gudipati 	}
520f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
521f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
522f2ee7601SKrishna Gudipati out:
523f2ee7601SKrishna Gudipati 	return 0;
524f2ee7601SKrishna Gudipati }
525f2ee7601SKrishna Gudipati 
526*3bbd8ef9SLee Jones static int
52760138066SKrishna Gudipati bfad_iocmd_lport_get_iostats(struct bfad_s *bfad, void *cmd)
52860138066SKrishna Gudipati {
52960138066SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
53060138066SKrishna Gudipati 	struct bfa_bsg_lport_iostats_s *iocmd =
53160138066SKrishna Gudipati 			(struct bfa_bsg_lport_iostats_s *)cmd;
53260138066SKrishna Gudipati 	unsigned long	flags;
53360138066SKrishna Gudipati 
53460138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
53560138066SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
53660138066SKrishna Gudipati 				iocmd->vf_id, iocmd->pwwn);
53760138066SKrishna Gudipati 	if (fcs_port == NULL) {
53860138066SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
53960138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
54060138066SKrishna Gudipati 		goto out;
54160138066SKrishna Gudipati 	}
54260138066SKrishna Gudipati 
54360138066SKrishna Gudipati 	bfa_fcpim_port_iostats(&bfad->bfa, &iocmd->iostats,
54460138066SKrishna Gudipati 			fcs_port->lp_tag);
54560138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
54660138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
54760138066SKrishna Gudipati out:
54860138066SKrishna Gudipati 	return 0;
54960138066SKrishna Gudipati }
55060138066SKrishna Gudipati 
551*3bbd8ef9SLee Jones static int
55260138066SKrishna Gudipati bfad_iocmd_lport_get_rports(struct bfad_s *bfad, void *cmd,
55360138066SKrishna Gudipati 			unsigned int payload_len)
55460138066SKrishna Gudipati {
55560138066SKrishna Gudipati 	struct bfa_bsg_lport_get_rports_s *iocmd =
55660138066SKrishna Gudipati 			(struct bfa_bsg_lport_get_rports_s *)cmd;
55760138066SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
55860138066SKrishna Gudipati 	unsigned long	flags;
55960138066SKrishna Gudipati 	void	*iocmd_bufptr;
56060138066SKrishna Gudipati 
56160138066SKrishna Gudipati 	if (iocmd->nrports == 0)
5629afbcfabSKrishna Gudipati 		return -EINVAL;
56360138066SKrishna Gudipati 
56460138066SKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len,
56560138066SKrishna Gudipati 			sizeof(struct bfa_bsg_lport_get_rports_s),
566ee1a4a42SKrishna Gudipati 			sizeof(struct bfa_rport_qualifier_s) * iocmd->nrports)
567ee1a4a42SKrishna Gudipati 			!= BFA_STATUS_OK) {
56860138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
56960138066SKrishna Gudipati 		return 0;
57060138066SKrishna Gudipati 	}
57160138066SKrishna Gudipati 
57260138066SKrishna Gudipati 	iocmd_bufptr = (char *)iocmd +
57360138066SKrishna Gudipati 			sizeof(struct bfa_bsg_lport_get_rports_s);
57460138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
57560138066SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
57660138066SKrishna Gudipati 				iocmd->vf_id, iocmd->pwwn);
57760138066SKrishna Gudipati 	if (fcs_port == NULL) {
57860138066SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
57960138066SKrishna Gudipati 		bfa_trc(bfad, 0);
58060138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
58160138066SKrishna Gudipati 		goto out;
58260138066SKrishna Gudipati 	}
58360138066SKrishna Gudipati 
584ee1a4a42SKrishna Gudipati 	bfa_fcs_lport_get_rport_quals(fcs_port,
585ee1a4a42SKrishna Gudipati 			(struct bfa_rport_qualifier_s *)iocmd_bufptr,
58660138066SKrishna Gudipati 			&iocmd->nrports);
58760138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
58860138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
58960138066SKrishna Gudipati out:
59060138066SKrishna Gudipati 	return 0;
59160138066SKrishna Gudipati }
59260138066SKrishna Gudipati 
593*3bbd8ef9SLee Jones static int
59460138066SKrishna Gudipati bfad_iocmd_rport_get_attr(struct bfad_s *bfad, void *cmd)
59560138066SKrishna Gudipati {
59660138066SKrishna Gudipati 	struct bfa_bsg_rport_attr_s *iocmd = (struct bfa_bsg_rport_attr_s *)cmd;
59760138066SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
59860138066SKrishna Gudipati 	struct bfa_fcs_rport_s *fcs_rport;
59960138066SKrishna Gudipati 	unsigned long	flags;
60060138066SKrishna Gudipati 
60160138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
60260138066SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
60360138066SKrishna Gudipati 				iocmd->vf_id, iocmd->pwwn);
60460138066SKrishna Gudipati 	if (fcs_port == NULL) {
60560138066SKrishna Gudipati 		bfa_trc(bfad, 0);
60660138066SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
60760138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
60860138066SKrishna Gudipati 		goto out;
60960138066SKrishna Gudipati 	}
61060138066SKrishna Gudipati 
611ee1a4a42SKrishna Gudipati 	if (iocmd->pid)
612ee1a4a42SKrishna Gudipati 		fcs_rport = bfa_fcs_lport_get_rport_by_qualifier(fcs_port,
613ee1a4a42SKrishna Gudipati 						iocmd->rpwwn, iocmd->pid);
614ee1a4a42SKrishna Gudipati 	else
61560138066SKrishna Gudipati 		fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
61660138066SKrishna Gudipati 	if (fcs_rport == NULL) {
61760138066SKrishna Gudipati 		bfa_trc(bfad, 0);
61860138066SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
61960138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
62060138066SKrishna Gudipati 		goto out;
62160138066SKrishna Gudipati 	}
62260138066SKrishna Gudipati 
62360138066SKrishna Gudipati 	bfa_fcs_rport_get_attr(fcs_rport, &iocmd->attr);
62460138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
62560138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
62660138066SKrishna Gudipati out:
62760138066SKrishna Gudipati 	return 0;
62860138066SKrishna Gudipati }
62960138066SKrishna Gudipati 
630b85daafeSKrishna Gudipati static int
631b85daafeSKrishna Gudipati bfad_iocmd_rport_get_addr(struct bfad_s *bfad, void *cmd)
632b85daafeSKrishna Gudipati {
633b85daafeSKrishna Gudipati 	struct bfa_bsg_rport_scsi_addr_s *iocmd =
634b85daafeSKrishna Gudipati 			(struct bfa_bsg_rport_scsi_addr_s *)cmd;
635b85daafeSKrishna Gudipati 	struct bfa_fcs_lport_s	*fcs_port;
636b85daafeSKrishna Gudipati 	struct bfa_fcs_itnim_s	*fcs_itnim;
637b85daafeSKrishna Gudipati 	struct bfad_itnim_s	*drv_itnim;
638b85daafeSKrishna Gudipati 	unsigned long	flags;
639b85daafeSKrishna Gudipati 
640b85daafeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
641b85daafeSKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
642b85daafeSKrishna Gudipati 				iocmd->vf_id, iocmd->pwwn);
643b85daafeSKrishna Gudipati 	if (fcs_port == NULL) {
644b85daafeSKrishna Gudipati 		bfa_trc(bfad, 0);
645b85daafeSKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
646b85daafeSKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
647b85daafeSKrishna Gudipati 		goto out;
648b85daafeSKrishna Gudipati 	}
649b85daafeSKrishna Gudipati 
650b85daafeSKrishna Gudipati 	fcs_itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
651b85daafeSKrishna Gudipati 	if (fcs_itnim == NULL) {
652b85daafeSKrishna Gudipati 		bfa_trc(bfad, 0);
653b85daafeSKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
654b85daafeSKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
655b85daafeSKrishna Gudipati 		goto out;
656b85daafeSKrishna Gudipati 	}
657b85daafeSKrishna Gudipati 
658b85daafeSKrishna Gudipati 	drv_itnim = fcs_itnim->itnim_drv;
659b85daafeSKrishna Gudipati 
660b85daafeSKrishna Gudipati 	if (drv_itnim && drv_itnim->im_port)
661b85daafeSKrishna Gudipati 		iocmd->host = drv_itnim->im_port->shost->host_no;
662b85daafeSKrishna Gudipati 	else {
663b85daafeSKrishna Gudipati 		bfa_trc(bfad, 0);
664b85daafeSKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
665b85daafeSKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
666b85daafeSKrishna Gudipati 		goto out;
667b85daafeSKrishna Gudipati 	}
668b85daafeSKrishna Gudipati 
669b85daafeSKrishna Gudipati 	iocmd->target = drv_itnim->scsi_tgt_id;
670b85daafeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
671b85daafeSKrishna Gudipati 
672b85daafeSKrishna Gudipati 	iocmd->bus = 0;
673b85daafeSKrishna Gudipati 	iocmd->lun = 0;
674b85daafeSKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
675b85daafeSKrishna Gudipati out:
676b85daafeSKrishna Gudipati 	return 0;
677b85daafeSKrishna Gudipati }
678b85daafeSKrishna Gudipati 
679*3bbd8ef9SLee Jones static int
68060138066SKrishna Gudipati bfad_iocmd_rport_get_stats(struct bfad_s *bfad, void *cmd)
68160138066SKrishna Gudipati {
68260138066SKrishna Gudipati 	struct bfa_bsg_rport_stats_s *iocmd =
68360138066SKrishna Gudipati 			(struct bfa_bsg_rport_stats_s *)cmd;
68460138066SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
68560138066SKrishna Gudipati 	struct bfa_fcs_rport_s *fcs_rport;
68660138066SKrishna Gudipati 	unsigned long	flags;
68760138066SKrishna Gudipati 
68860138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
68960138066SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
69060138066SKrishna Gudipati 				iocmd->vf_id, iocmd->pwwn);
69160138066SKrishna Gudipati 	if (fcs_port == NULL) {
69260138066SKrishna Gudipati 		bfa_trc(bfad, 0);
69360138066SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
69460138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
69560138066SKrishna Gudipati 		goto out;
69660138066SKrishna Gudipati 	}
69760138066SKrishna Gudipati 
69860138066SKrishna Gudipati 	fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
69960138066SKrishna Gudipati 	if (fcs_rport == NULL) {
70060138066SKrishna Gudipati 		bfa_trc(bfad, 0);
70160138066SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
70260138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
70360138066SKrishna Gudipati 		goto out;
70460138066SKrishna Gudipati 	}
70560138066SKrishna Gudipati 
70660138066SKrishna Gudipati 	memcpy((void *)&iocmd->stats, (void *)&fcs_rport->stats,
70760138066SKrishna Gudipati 		sizeof(struct bfa_rport_stats_s));
70861ba4394SKrishna Gudipati 	if (bfa_fcs_rport_get_halrport(fcs_rport)) {
70960138066SKrishna Gudipati 		memcpy((void *)&iocmd->stats.hal_stats,
71060138066SKrishna Gudipati 		       (void *)&(bfa_fcs_rport_get_halrport(fcs_rport)->stats),
71160138066SKrishna Gudipati 			sizeof(struct bfa_rport_hal_stats_s));
71261ba4394SKrishna Gudipati 	}
71360138066SKrishna Gudipati 
71460138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
71560138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
71660138066SKrishna Gudipati out:
71760138066SKrishna Gudipati 	return 0;
71860138066SKrishna Gudipati }
71960138066SKrishna Gudipati 
720*3bbd8ef9SLee Jones static int
721f2ee7601SKrishna Gudipati bfad_iocmd_rport_clr_stats(struct bfad_s *bfad, void *cmd)
722f2ee7601SKrishna Gudipati {
723f2ee7601SKrishna Gudipati 	struct bfa_bsg_rport_reset_stats_s *iocmd =
724f2ee7601SKrishna Gudipati 				(struct bfa_bsg_rport_reset_stats_s *)cmd;
725f2ee7601SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
726f2ee7601SKrishna Gudipati 	struct bfa_fcs_rport_s *fcs_rport;
727f2ee7601SKrishna Gudipati 	struct bfa_rport_s *rport;
728f2ee7601SKrishna Gudipati 	unsigned long	flags;
729f2ee7601SKrishna Gudipati 
730f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
731f2ee7601SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
732f2ee7601SKrishna Gudipati 				iocmd->vf_id, iocmd->pwwn);
733f2ee7601SKrishna Gudipati 	if (fcs_port == NULL) {
734f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
735f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
736f2ee7601SKrishna Gudipati 		goto out;
737f2ee7601SKrishna Gudipati 	}
738f2ee7601SKrishna Gudipati 
739f2ee7601SKrishna Gudipati 	fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
740f2ee7601SKrishna Gudipati 	if (fcs_rport == NULL) {
741f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
742f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
743f2ee7601SKrishna Gudipati 		goto out;
744f2ee7601SKrishna Gudipati 	}
745f2ee7601SKrishna Gudipati 
746f2ee7601SKrishna Gudipati 	memset((char *)&fcs_rport->stats, 0, sizeof(struct bfa_rport_stats_s));
747f2ee7601SKrishna Gudipati 	rport = bfa_fcs_rport_get_halrport(fcs_rport);
74861ba4394SKrishna Gudipati 	if (rport)
749f2ee7601SKrishna Gudipati 		memset(&rport->stats, 0, sizeof(rport->stats));
750f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
751f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
752f2ee7601SKrishna Gudipati out:
753f2ee7601SKrishna Gudipati 	return 0;
754f2ee7601SKrishna Gudipati }
755f2ee7601SKrishna Gudipati 
756*3bbd8ef9SLee Jones static int
757f2ee7601SKrishna Gudipati bfad_iocmd_rport_set_speed(struct bfad_s *bfad, void *cmd)
758f2ee7601SKrishna Gudipati {
759f2ee7601SKrishna Gudipati 	struct bfa_bsg_rport_set_speed_s *iocmd =
760f2ee7601SKrishna Gudipati 				(struct bfa_bsg_rport_set_speed_s *)cmd;
761f2ee7601SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
762f2ee7601SKrishna Gudipati 	struct bfa_fcs_rport_s *fcs_rport;
763f2ee7601SKrishna Gudipati 	unsigned long	flags;
764f2ee7601SKrishna Gudipati 
765f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
766f2ee7601SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
767f2ee7601SKrishna Gudipati 				iocmd->vf_id, iocmd->pwwn);
768f2ee7601SKrishna Gudipati 	if (fcs_port == NULL) {
769f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
770f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
771f2ee7601SKrishna Gudipati 		goto out;
772f2ee7601SKrishna Gudipati 	}
773f2ee7601SKrishna Gudipati 
774f2ee7601SKrishna Gudipati 	fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
775f2ee7601SKrishna Gudipati 	if (fcs_rport == NULL) {
776f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
777f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
778f2ee7601SKrishna Gudipati 		goto out;
779f2ee7601SKrishna Gudipati 	}
780f2ee7601SKrishna Gudipati 
781f2ee7601SKrishna Gudipati 	fcs_rport->rpf.assigned_speed  = iocmd->speed;
782f2ee7601SKrishna Gudipati 	/* Set this speed in f/w only if the RPSC speed is not available */
783f2ee7601SKrishna Gudipati 	if (fcs_rport->rpf.rpsc_speed == BFA_PORT_SPEED_UNKNOWN)
78461ba4394SKrishna Gudipati 		if (fcs_rport->bfa_rport)
785f2ee7601SKrishna Gudipati 			bfa_rport_speed(fcs_rport->bfa_rport, iocmd->speed);
786f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
787f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
788f2ee7601SKrishna Gudipati out:
789f2ee7601SKrishna Gudipati 	return 0;
790f2ee7601SKrishna Gudipati }
791f2ee7601SKrishna Gudipati 
792*3bbd8ef9SLee Jones static int
793f2ee7601SKrishna Gudipati bfad_iocmd_vport_get_attr(struct bfad_s *bfad, void *cmd)
794f2ee7601SKrishna Gudipati {
795f2ee7601SKrishna Gudipati 	struct bfa_fcs_vport_s *fcs_vport;
796f2ee7601SKrishna Gudipati 	struct bfa_bsg_vport_attr_s *iocmd = (struct bfa_bsg_vport_attr_s *)cmd;
797f2ee7601SKrishna Gudipati 	unsigned long	flags;
798f2ee7601SKrishna Gudipati 
799f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
800f2ee7601SKrishna Gudipati 	fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs,
801f2ee7601SKrishna Gudipati 				iocmd->vf_id, iocmd->vpwwn);
802f2ee7601SKrishna Gudipati 	if (fcs_vport == NULL) {
803f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
804f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_VWWN;
805f2ee7601SKrishna Gudipati 		goto out;
806f2ee7601SKrishna Gudipati 	}
807f2ee7601SKrishna Gudipati 
808f2ee7601SKrishna Gudipati 	bfa_fcs_vport_get_attr(fcs_vport, &iocmd->vport_attr);
809f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
810f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
811f2ee7601SKrishna Gudipati out:
812f2ee7601SKrishna Gudipati 	return 0;
813f2ee7601SKrishna Gudipati }
814f2ee7601SKrishna Gudipati 
815*3bbd8ef9SLee Jones static int
816f2ee7601SKrishna Gudipati bfad_iocmd_vport_get_stats(struct bfad_s *bfad, void *cmd)
817f2ee7601SKrishna Gudipati {
818f2ee7601SKrishna Gudipati 	struct bfa_fcs_vport_s *fcs_vport;
819f2ee7601SKrishna Gudipati 	struct bfa_bsg_vport_stats_s *iocmd =
820f2ee7601SKrishna Gudipati 				(struct bfa_bsg_vport_stats_s *)cmd;
821f2ee7601SKrishna Gudipati 	unsigned long	flags;
822f2ee7601SKrishna Gudipati 
823f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
824f2ee7601SKrishna Gudipati 	fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs,
825f2ee7601SKrishna Gudipati 				iocmd->vf_id, iocmd->vpwwn);
826f2ee7601SKrishna Gudipati 	if (fcs_vport == NULL) {
827f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
828f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_VWWN;
829f2ee7601SKrishna Gudipati 		goto out;
830f2ee7601SKrishna Gudipati 	}
831f2ee7601SKrishna Gudipati 
832f2ee7601SKrishna Gudipati 	memcpy((void *)&iocmd->vport_stats, (void *)&fcs_vport->vport_stats,
833f2ee7601SKrishna Gudipati 		sizeof(struct bfa_vport_stats_s));
834f2ee7601SKrishna Gudipati 	memcpy((void *)&iocmd->vport_stats.port_stats,
835f2ee7601SKrishna Gudipati 	       (void *)&fcs_vport->lport.stats,
836f2ee7601SKrishna Gudipati 		sizeof(struct bfa_lport_stats_s));
837f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
838f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
839f2ee7601SKrishna Gudipati out:
840f2ee7601SKrishna Gudipati 	return 0;
841f2ee7601SKrishna Gudipati }
842f2ee7601SKrishna Gudipati 
843*3bbd8ef9SLee Jones static int
844f2ee7601SKrishna Gudipati bfad_iocmd_vport_clr_stats(struct bfad_s *bfad, void *cmd)
845f2ee7601SKrishna Gudipati {
846f2ee7601SKrishna Gudipati 	struct bfa_fcs_vport_s *fcs_vport;
847f2ee7601SKrishna Gudipati 	struct bfa_bsg_reset_stats_s *iocmd =
848f2ee7601SKrishna Gudipati 				(struct bfa_bsg_reset_stats_s *)cmd;
849f2ee7601SKrishna Gudipati 	unsigned long	flags;
850f2ee7601SKrishna Gudipati 
851f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
852f2ee7601SKrishna Gudipati 	fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs,
853f2ee7601SKrishna Gudipati 				iocmd->vf_id, iocmd->vpwwn);
854f2ee7601SKrishna Gudipati 	if (fcs_vport == NULL) {
855f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
856f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_VWWN;
857f2ee7601SKrishna Gudipati 		goto out;
858f2ee7601SKrishna Gudipati 	}
859f2ee7601SKrishna Gudipati 
860f2ee7601SKrishna Gudipati 	memset(&fcs_vport->vport_stats, 0, sizeof(struct bfa_vport_stats_s));
861f2ee7601SKrishna Gudipati 	memset(&fcs_vport->lport.stats, 0, sizeof(struct bfa_lport_stats_s));
862f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
863f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
864f2ee7601SKrishna Gudipati out:
865f2ee7601SKrishna Gudipati 	return 0;
866f2ee7601SKrishna Gudipati }
867f2ee7601SKrishna Gudipati 
868b85daafeSKrishna Gudipati static int
869b85daafeSKrishna Gudipati bfad_iocmd_fabric_get_lports(struct bfad_s *bfad, void *cmd,
870b85daafeSKrishna Gudipati 			unsigned int payload_len)
871b85daafeSKrishna Gudipati {
872b85daafeSKrishna Gudipati 	struct bfa_bsg_fabric_get_lports_s *iocmd =
873b85daafeSKrishna Gudipati 			(struct bfa_bsg_fabric_get_lports_s *)cmd;
874b85daafeSKrishna Gudipati 	bfa_fcs_vf_t	*fcs_vf;
875b85daafeSKrishna Gudipati 	uint32_t	nports = iocmd->nports;
876b85daafeSKrishna Gudipati 	unsigned long	flags;
877b85daafeSKrishna Gudipati 	void	*iocmd_bufptr;
878b85daafeSKrishna Gudipati 
879b85daafeSKrishna Gudipati 	if (nports == 0) {
880b85daafeSKrishna Gudipati 		iocmd->status = BFA_STATUS_EINVAL;
881b85daafeSKrishna Gudipati 		goto out;
882b85daafeSKrishna Gudipati 	}
883b85daafeSKrishna Gudipati 
884b85daafeSKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len,
885b85daafeSKrishna Gudipati 		sizeof(struct bfa_bsg_fabric_get_lports_s),
8861929e82eSStephen Kitt 		sizeof(wwn_t) * iocmd->nports) != BFA_STATUS_OK) {
887b85daafeSKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
888b85daafeSKrishna Gudipati 		goto out;
889b85daafeSKrishna Gudipati 	}
890b85daafeSKrishna Gudipati 
891b85daafeSKrishna Gudipati 	iocmd_bufptr = (char *)iocmd +
892b85daafeSKrishna Gudipati 			sizeof(struct bfa_bsg_fabric_get_lports_s);
893b85daafeSKrishna Gudipati 
894b85daafeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
895b85daafeSKrishna Gudipati 	fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id);
896b85daafeSKrishna Gudipati 	if (fcs_vf == NULL) {
897b85daafeSKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
898b85daafeSKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_VFID;
899b85daafeSKrishna Gudipati 		goto out;
900b85daafeSKrishna Gudipati 	}
901b85daafeSKrishna Gudipati 	bfa_fcs_vf_get_ports(fcs_vf, (wwn_t *)iocmd_bufptr, &nports);
902b85daafeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
903b85daafeSKrishna Gudipati 
904b85daafeSKrishna Gudipati 	iocmd->nports = nports;
905b85daafeSKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
906b85daafeSKrishna Gudipati out:
907b85daafeSKrishna Gudipati 	return 0;
908b85daafeSKrishna Gudipati }
909b85daafeSKrishna Gudipati 
910*3bbd8ef9SLee Jones static int
9116894f013SKrishna Gudipati bfad_iocmd_qos_set_bw(struct bfad_s *bfad, void *pcmd)
9126894f013SKrishna Gudipati {
9136894f013SKrishna Gudipati 	struct bfa_bsg_qos_bw_s *iocmd = (struct bfa_bsg_qos_bw_s *)pcmd;
9146894f013SKrishna Gudipati 	unsigned long	flags;
9156894f013SKrishna Gudipati 
9166894f013SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
9176894f013SKrishna Gudipati 	iocmd->status = bfa_fcport_set_qos_bw(&bfad->bfa, &iocmd->qos_bw);
9186894f013SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
9196894f013SKrishna Gudipati 
9206894f013SKrishna Gudipati 	return 0;
9216894f013SKrishna Gudipati }
9226894f013SKrishna Gudipati 
923*3bbd8ef9SLee Jones static int
924f2ee7601SKrishna Gudipati bfad_iocmd_ratelim(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
925f2ee7601SKrishna Gudipati {
926f2ee7601SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
927f2ee7601SKrishna Gudipati 	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
928f2ee7601SKrishna Gudipati 	unsigned long	flags;
929f2ee7601SKrishna Gudipati 
930f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
931f2ee7601SKrishna Gudipati 
932bc0e2c2aSKrishna Gudipati 	if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
933bc0e2c2aSKrishna Gudipati 		(fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
934bc0e2c2aSKrishna Gudipati 		iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
935bc0e2c2aSKrishna Gudipati 	else {
936f2ee7601SKrishna Gudipati 		if (cmd == IOCMD_RATELIM_ENABLE)
937f2ee7601SKrishna Gudipati 			fcport->cfg.ratelimit = BFA_TRUE;
938f2ee7601SKrishna Gudipati 		else if (cmd == IOCMD_RATELIM_DISABLE)
939f2ee7601SKrishna Gudipati 			fcport->cfg.ratelimit = BFA_FALSE;
940f2ee7601SKrishna Gudipati 
941f2ee7601SKrishna Gudipati 		if (fcport->cfg.trl_def_speed == BFA_PORT_SPEED_UNKNOWN)
942f2ee7601SKrishna Gudipati 			fcport->cfg.trl_def_speed = BFA_PORT_SPEED_1GBPS;
943f2ee7601SKrishna Gudipati 
944f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_OK;
945bc0e2c2aSKrishna Gudipati 	}
946bc0e2c2aSKrishna Gudipati 
947bc0e2c2aSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
948f2ee7601SKrishna Gudipati 
949f2ee7601SKrishna Gudipati 	return 0;
950f2ee7601SKrishna Gudipati }
951f2ee7601SKrishna Gudipati 
952*3bbd8ef9SLee Jones static int
953f2ee7601SKrishna Gudipati bfad_iocmd_ratelim_speed(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
954f2ee7601SKrishna Gudipati {
955f2ee7601SKrishna Gudipati 	struct bfa_bsg_trl_speed_s *iocmd = (struct bfa_bsg_trl_speed_s *)pcmd;
956f2ee7601SKrishna Gudipati 	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
957f2ee7601SKrishna Gudipati 	unsigned long	flags;
958f2ee7601SKrishna Gudipati 
959f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
960f2ee7601SKrishna Gudipati 
961f2ee7601SKrishna Gudipati 	/* Auto and speeds greater than the supported speed, are invalid */
962f2ee7601SKrishna Gudipati 	if ((iocmd->speed == BFA_PORT_SPEED_AUTO) ||
963f2ee7601SKrishna Gudipati 	    (iocmd->speed > fcport->speed_sup)) {
964f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNSUPP_SPEED;
965f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
966f2ee7601SKrishna Gudipati 		return 0;
967f2ee7601SKrishna Gudipati 	}
968f2ee7601SKrishna Gudipati 
969bc0e2c2aSKrishna Gudipati 	if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
970bc0e2c2aSKrishna Gudipati 		(fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
971bc0e2c2aSKrishna Gudipati 		iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
972bc0e2c2aSKrishna Gudipati 	else {
973f2ee7601SKrishna Gudipati 		fcport->cfg.trl_def_speed = iocmd->speed;
974f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_OK;
975bc0e2c2aSKrishna Gudipati 	}
976f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
977f2ee7601SKrishna Gudipati 
978f2ee7601SKrishna Gudipati 	return 0;
979f2ee7601SKrishna Gudipati }
980f2ee7601SKrishna Gudipati 
981*3bbd8ef9SLee Jones static int
982f2ee7601SKrishna Gudipati bfad_iocmd_cfg_fcpim(struct bfad_s *bfad, void *cmd)
983f2ee7601SKrishna Gudipati {
984f2ee7601SKrishna Gudipati 	struct bfa_bsg_fcpim_s *iocmd = (struct bfa_bsg_fcpim_s *)cmd;
985f2ee7601SKrishna Gudipati 	unsigned long	flags;
986f2ee7601SKrishna Gudipati 
987f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
988f2ee7601SKrishna Gudipati 	bfa_fcpim_path_tov_set(&bfad->bfa, iocmd->param);
989f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
990f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
991f2ee7601SKrishna Gudipati 	return 0;
992f2ee7601SKrishna Gudipati }
993f2ee7601SKrishna Gudipati 
994*3bbd8ef9SLee Jones static int
99560138066SKrishna Gudipati bfad_iocmd_fcpim_get_modstats(struct bfad_s *bfad, void *cmd)
99660138066SKrishna Gudipati {
99760138066SKrishna Gudipati 	struct bfa_bsg_fcpim_modstats_s *iocmd =
99860138066SKrishna Gudipati 			(struct bfa_bsg_fcpim_modstats_s *)cmd;
99960138066SKrishna Gudipati 	struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
100060138066SKrishna Gudipati 	struct list_head *qe, *qen;
100160138066SKrishna Gudipati 	struct bfa_itnim_s *itnim;
100260138066SKrishna Gudipati 	unsigned long	flags;
100360138066SKrishna Gudipati 
100460138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
100560138066SKrishna Gudipati 	/* accumulate IO stats from itnim */
100660138066SKrishna Gudipati 	memset((void *)&iocmd->modstats, 0, sizeof(struct bfa_itnim_iostats_s));
100760138066SKrishna Gudipati 	list_for_each_safe(qe, qen, &fcpim->itnim_q) {
100860138066SKrishna Gudipati 		itnim = (struct bfa_itnim_s *) qe;
100960138066SKrishna Gudipati 		bfa_fcpim_add_stats(&iocmd->modstats, &(itnim->stats));
101060138066SKrishna Gudipati 	}
101160138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
101260138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
101360138066SKrishna Gudipati 	return 0;
101460138066SKrishna Gudipati }
101560138066SKrishna Gudipati 
1016*3bbd8ef9SLee Jones static int
1017f2ee7601SKrishna Gudipati bfad_iocmd_fcpim_clr_modstats(struct bfad_s *bfad, void *cmd)
1018f2ee7601SKrishna Gudipati {
1019f2ee7601SKrishna Gudipati 	struct bfa_bsg_fcpim_modstatsclr_s *iocmd =
1020f2ee7601SKrishna Gudipati 				(struct bfa_bsg_fcpim_modstatsclr_s *)cmd;
1021f2ee7601SKrishna Gudipati 	struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
1022f2ee7601SKrishna Gudipati 	struct list_head *qe, *qen;
1023f2ee7601SKrishna Gudipati 	struct bfa_itnim_s *itnim;
1024f2ee7601SKrishna Gudipati 	unsigned long	flags;
1025f2ee7601SKrishna Gudipati 
1026f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
1027f2ee7601SKrishna Gudipati 	list_for_each_safe(qe, qen, &fcpim->itnim_q) {
1028f2ee7601SKrishna Gudipati 		itnim = (struct bfa_itnim_s *) qe;
1029f2ee7601SKrishna Gudipati 		bfa_itnim_clear_stats(itnim);
1030f2ee7601SKrishna Gudipati 	}
1031f2ee7601SKrishna Gudipati 	memset(&fcpim->del_itn_stats, 0,
1032f2ee7601SKrishna Gudipati 		sizeof(struct bfa_fcpim_del_itn_stats_s));
1033f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1034f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
1035f2ee7601SKrishna Gudipati 	return 0;
1036f2ee7601SKrishna Gudipati }
1037f2ee7601SKrishna Gudipati 
1038*3bbd8ef9SLee Jones static int
103960138066SKrishna Gudipati bfad_iocmd_fcpim_get_del_itn_stats(struct bfad_s *bfad, void *cmd)
104060138066SKrishna Gudipati {
104160138066SKrishna Gudipati 	struct bfa_bsg_fcpim_del_itn_stats_s *iocmd =
104260138066SKrishna Gudipati 			(struct bfa_bsg_fcpim_del_itn_stats_s *)cmd;
104360138066SKrishna Gudipati 	struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
104460138066SKrishna Gudipati 	unsigned long	flags;
104560138066SKrishna Gudipati 
104660138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
104760138066SKrishna Gudipati 	memcpy((void *)&iocmd->modstats, (void *)&fcpim->del_itn_stats,
104860138066SKrishna Gudipati 		sizeof(struct bfa_fcpim_del_itn_stats_s));
104960138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
105060138066SKrishna Gudipati 
105160138066SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
105260138066SKrishna Gudipati 	return 0;
105360138066SKrishna Gudipati }
105460138066SKrishna Gudipati 
1055b85daafeSKrishna Gudipati static int
1056b85daafeSKrishna Gudipati bfad_iocmd_itnim_get_attr(struct bfad_s *bfad, void *cmd)
1057b85daafeSKrishna Gudipati {
1058b85daafeSKrishna Gudipati 	struct bfa_bsg_itnim_attr_s *iocmd = (struct bfa_bsg_itnim_attr_s *)cmd;
1059b85daafeSKrishna Gudipati 	struct bfa_fcs_lport_s	*fcs_port;
1060b85daafeSKrishna Gudipati 	unsigned long	flags;
1061b85daafeSKrishna Gudipati 
1062b85daafeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
1063b85daafeSKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
1064b85daafeSKrishna Gudipati 				iocmd->vf_id, iocmd->lpwwn);
1065b85daafeSKrishna Gudipati 	if (!fcs_port)
1066b85daafeSKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
1067b85daafeSKrishna Gudipati 	else
1068b85daafeSKrishna Gudipati 		iocmd->status = bfa_fcs_itnim_attr_get(fcs_port,
1069b85daafeSKrishna Gudipati 					iocmd->rpwwn, &iocmd->attr);
1070b85daafeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1071b85daafeSKrishna Gudipati 	return 0;
1072b85daafeSKrishna Gudipati }
1073b85daafeSKrishna Gudipati 
107460138066SKrishna Gudipati static int
107560138066SKrishna Gudipati bfad_iocmd_itnim_get_iostats(struct bfad_s *bfad, void *cmd)
107660138066SKrishna Gudipati {
107760138066SKrishna Gudipati 	struct bfa_bsg_itnim_iostats_s *iocmd =
107860138066SKrishna Gudipati 			(struct bfa_bsg_itnim_iostats_s *)cmd;
107960138066SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
108060138066SKrishna Gudipati 	struct bfa_fcs_itnim_s *itnim;
108160138066SKrishna Gudipati 	unsigned long	flags;
108260138066SKrishna Gudipati 
108360138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
108460138066SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
108560138066SKrishna Gudipati 				iocmd->vf_id, iocmd->lpwwn);
108660138066SKrishna Gudipati 	if (!fcs_port) {
108760138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
108860138066SKrishna Gudipati 		bfa_trc(bfad, 0);
108960138066SKrishna Gudipati 	} else {
109060138066SKrishna Gudipati 		itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
109160138066SKrishna Gudipati 		if (itnim == NULL)
109260138066SKrishna Gudipati 			iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
109360138066SKrishna Gudipati 		else {
109460138066SKrishna Gudipati 			iocmd->status = BFA_STATUS_OK;
109561ba4394SKrishna Gudipati 			if (bfa_fcs_itnim_get_halitn(itnim))
109660138066SKrishna Gudipati 				memcpy((void *)&iocmd->iostats, (void *)
109760138066SKrishna Gudipati 				&(bfa_fcs_itnim_get_halitn(itnim)->stats),
109860138066SKrishna Gudipati 				       sizeof(struct bfa_itnim_iostats_s));
109960138066SKrishna Gudipati 		}
110060138066SKrishna Gudipati 	}
110160138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
110260138066SKrishna Gudipati 	return 0;
110360138066SKrishna Gudipati }
110460138066SKrishna Gudipati 
110560138066SKrishna Gudipati static int
1106f2ee7601SKrishna Gudipati bfad_iocmd_itnim_reset_stats(struct bfad_s *bfad, void *cmd)
1107f2ee7601SKrishna Gudipati {
1108f2ee7601SKrishna Gudipati 	struct bfa_bsg_rport_reset_stats_s *iocmd =
1109f2ee7601SKrishna Gudipati 			(struct bfa_bsg_rport_reset_stats_s *)cmd;
1110f2ee7601SKrishna Gudipati 	struct bfa_fcs_lport_s	*fcs_port;
1111f2ee7601SKrishna Gudipati 	struct bfa_fcs_itnim_s	*itnim;
1112f2ee7601SKrishna Gudipati 	unsigned long	flags;
1113f2ee7601SKrishna Gudipati 
1114f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
1115f2ee7601SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
1116f2ee7601SKrishna Gudipati 				iocmd->vf_id, iocmd->pwwn);
1117f2ee7601SKrishna Gudipati 	if (!fcs_port)
1118f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
1119f2ee7601SKrishna Gudipati 	else {
1120f2ee7601SKrishna Gudipati 		itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
1121f2ee7601SKrishna Gudipati 		if (itnim == NULL)
1122f2ee7601SKrishna Gudipati 			iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
1123f2ee7601SKrishna Gudipati 		else {
1124f2ee7601SKrishna Gudipati 			iocmd->status = BFA_STATUS_OK;
1125f2ee7601SKrishna Gudipati 			bfa_fcs_itnim_stats_clear(fcs_port, iocmd->rpwwn);
1126f2ee7601SKrishna Gudipati 			bfa_itnim_clear_stats(bfa_fcs_itnim_get_halitn(itnim));
1127f2ee7601SKrishna Gudipati 		}
1128f2ee7601SKrishna Gudipati 	}
1129f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1130f2ee7601SKrishna Gudipati 
1131f2ee7601SKrishna Gudipati 	return 0;
1132f2ee7601SKrishna Gudipati }
1133f2ee7601SKrishna Gudipati 
1134f2ee7601SKrishna Gudipati static int
113560138066SKrishna Gudipati bfad_iocmd_itnim_get_itnstats(struct bfad_s *bfad, void *cmd)
113660138066SKrishna Gudipati {
113760138066SKrishna Gudipati 	struct bfa_bsg_itnim_itnstats_s *iocmd =
113860138066SKrishna Gudipati 			(struct bfa_bsg_itnim_itnstats_s *)cmd;
113960138066SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
114060138066SKrishna Gudipati 	struct bfa_fcs_itnim_s *itnim;
114160138066SKrishna Gudipati 	unsigned long	flags;
114260138066SKrishna Gudipati 
114360138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
114460138066SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
114560138066SKrishna Gudipati 				iocmd->vf_id, iocmd->lpwwn);
114660138066SKrishna Gudipati 	if (!fcs_port) {
114760138066SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
114860138066SKrishna Gudipati 		bfa_trc(bfad, 0);
114960138066SKrishna Gudipati 	} else {
115060138066SKrishna Gudipati 		itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
115160138066SKrishna Gudipati 		if (itnim == NULL)
115260138066SKrishna Gudipati 			iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
115360138066SKrishna Gudipati 		else {
115460138066SKrishna Gudipati 			iocmd->status = BFA_STATUS_OK;
115560138066SKrishna Gudipati 			bfa_fcs_itnim_stats_get(fcs_port, iocmd->rpwwn,
115660138066SKrishna Gudipati 					&iocmd->itnstats);
115760138066SKrishna Gudipati 		}
115860138066SKrishna Gudipati 	}
115960138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
116060138066SKrishna Gudipati 	return 0;
116160138066SKrishna Gudipati }
116260138066SKrishna Gudipati 
1163*3bbd8ef9SLee Jones static int
116460138066SKrishna Gudipati bfad_iocmd_fcport_enable(struct bfad_s *bfad, void *cmd)
116560138066SKrishna Gudipati {
116660138066SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
116760138066SKrishna Gudipati 	unsigned long flags;
116860138066SKrishna Gudipati 
116960138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
117060138066SKrishna Gudipati 	iocmd->status = bfa_fcport_enable(&bfad->bfa);
117160138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
117260138066SKrishna Gudipati 
117360138066SKrishna Gudipati 	return 0;
117460138066SKrishna Gudipati }
117560138066SKrishna Gudipati 
1176*3bbd8ef9SLee Jones static int
117760138066SKrishna Gudipati bfad_iocmd_fcport_disable(struct bfad_s *bfad, void *cmd)
117860138066SKrishna Gudipati {
117960138066SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
118060138066SKrishna Gudipati 	unsigned long flags;
118160138066SKrishna Gudipati 
118260138066SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
118360138066SKrishna Gudipati 	iocmd->status = bfa_fcport_disable(&bfad->bfa);
118460138066SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
118560138066SKrishna Gudipati 
118660138066SKrishna Gudipati 	return 0;
118760138066SKrishna Gudipati }
118860138066SKrishna Gudipati 
1189*3bbd8ef9SLee Jones static int
11901a4d8e1bSKrishna Gudipati bfad_iocmd_ioc_get_pcifn_cfg(struct bfad_s *bfad, void *cmd)
11911a4d8e1bSKrishna Gudipati {
11921a4d8e1bSKrishna Gudipati 	struct bfa_bsg_pcifn_cfg_s *iocmd = (struct bfa_bsg_pcifn_cfg_s *)cmd;
11931a4d8e1bSKrishna Gudipati 	struct bfad_hal_comp fcomp;
11941a4d8e1bSKrishna Gudipati 	unsigned long flags;
11951a4d8e1bSKrishna Gudipati 
11961a4d8e1bSKrishna Gudipati 	init_completion(&fcomp.comp);
11971a4d8e1bSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
11981a4d8e1bSKrishna Gudipati 	iocmd->status = bfa_ablk_query(&bfad->bfa.modules.ablk,
11991a4d8e1bSKrishna Gudipati 				&iocmd->pcifn_cfg,
12001a4d8e1bSKrishna Gudipati 				bfad_hcb_comp, &fcomp);
12011a4d8e1bSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12021a4d8e1bSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
12031a4d8e1bSKrishna Gudipati 		goto out;
12041a4d8e1bSKrishna Gudipati 
12051a4d8e1bSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
12061a4d8e1bSKrishna Gudipati 	iocmd->status = fcomp.status;
12071a4d8e1bSKrishna Gudipati out:
12081a4d8e1bSKrishna Gudipati 	return 0;
12091a4d8e1bSKrishna Gudipati }
12101a4d8e1bSKrishna Gudipati 
1211*3bbd8ef9SLee Jones static int
12121a4d8e1bSKrishna Gudipati bfad_iocmd_pcifn_create(struct bfad_s *bfad, void *cmd)
12131a4d8e1bSKrishna Gudipati {
12141a4d8e1bSKrishna Gudipati 	struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
12151a4d8e1bSKrishna Gudipati 	struct bfad_hal_comp fcomp;
12161a4d8e1bSKrishna Gudipati 	unsigned long flags;
12171a4d8e1bSKrishna Gudipati 
12181a4d8e1bSKrishna Gudipati 	init_completion(&fcomp.comp);
12191a4d8e1bSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
12201a4d8e1bSKrishna Gudipati 	iocmd->status = bfa_ablk_pf_create(&bfad->bfa.modules.ablk,
12211a4d8e1bSKrishna Gudipati 				&iocmd->pcifn_id, iocmd->port,
12221a1297c6SKrishna Gudipati 				iocmd->pcifn_class, iocmd->bw_min,
12231a1297c6SKrishna Gudipati 				iocmd->bw_max, bfad_hcb_comp, &fcomp);
12241a4d8e1bSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12251a4d8e1bSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
12261a4d8e1bSKrishna Gudipati 		goto out;
12271a4d8e1bSKrishna Gudipati 
12281a4d8e1bSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
12291a4d8e1bSKrishna Gudipati 	iocmd->status = fcomp.status;
12301a4d8e1bSKrishna Gudipati out:
12311a4d8e1bSKrishna Gudipati 	return 0;
12321a4d8e1bSKrishna Gudipati }
12331a4d8e1bSKrishna Gudipati 
1234*3bbd8ef9SLee Jones static int
12351a4d8e1bSKrishna Gudipati bfad_iocmd_pcifn_delete(struct bfad_s *bfad, void *cmd)
12361a4d8e1bSKrishna Gudipati {
12371a4d8e1bSKrishna Gudipati 	struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
12381a4d8e1bSKrishna Gudipati 	struct bfad_hal_comp fcomp;
12391a4d8e1bSKrishna Gudipati 	unsigned long flags;
12401a4d8e1bSKrishna Gudipati 
12411a4d8e1bSKrishna Gudipati 	init_completion(&fcomp.comp);
12421a4d8e1bSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
12431a4d8e1bSKrishna Gudipati 	iocmd->status = bfa_ablk_pf_delete(&bfad->bfa.modules.ablk,
12441a4d8e1bSKrishna Gudipati 				iocmd->pcifn_id,
12451a4d8e1bSKrishna Gudipati 				bfad_hcb_comp, &fcomp);
12461a4d8e1bSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12471a4d8e1bSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
12481a4d8e1bSKrishna Gudipati 		goto out;
12491a4d8e1bSKrishna Gudipati 
12501a4d8e1bSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
12511a4d8e1bSKrishna Gudipati 	iocmd->status = fcomp.status;
12521a4d8e1bSKrishna Gudipati out:
12531a4d8e1bSKrishna Gudipati 	return 0;
12541a4d8e1bSKrishna Gudipati }
12551a4d8e1bSKrishna Gudipati 
1256*3bbd8ef9SLee Jones static int
12571a4d8e1bSKrishna Gudipati bfad_iocmd_pcifn_bw(struct bfad_s *bfad, void *cmd)
12581a4d8e1bSKrishna Gudipati {
12591a4d8e1bSKrishna Gudipati 	struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
12601a4d8e1bSKrishna Gudipati 	struct bfad_hal_comp fcomp;
12611a4d8e1bSKrishna Gudipati 	unsigned long flags;
12621a4d8e1bSKrishna Gudipati 
12631a4d8e1bSKrishna Gudipati 	init_completion(&fcomp.comp);
12641a4d8e1bSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
12651a4d8e1bSKrishna Gudipati 	iocmd->status = bfa_ablk_pf_update(&bfad->bfa.modules.ablk,
12661a1297c6SKrishna Gudipati 				iocmd->pcifn_id, iocmd->bw_min,
12671a1297c6SKrishna Gudipati 				iocmd->bw_max, bfad_hcb_comp, &fcomp);
12681a4d8e1bSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12691a4d8e1bSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
12701a4d8e1bSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
12711a4d8e1bSKrishna Gudipati 		goto out;
12721a4d8e1bSKrishna Gudipati 
12731a4d8e1bSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
12741a4d8e1bSKrishna Gudipati 	iocmd->status = fcomp.status;
12751a4d8e1bSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
12761a4d8e1bSKrishna Gudipati out:
12771a4d8e1bSKrishna Gudipati 	return 0;
12781a4d8e1bSKrishna Gudipati }
12791a4d8e1bSKrishna Gudipati 
1280*3bbd8ef9SLee Jones static int
12811a4d8e1bSKrishna Gudipati bfad_iocmd_adapter_cfg_mode(struct bfad_s *bfad, void *cmd)
12821a4d8e1bSKrishna Gudipati {
12831a4d8e1bSKrishna Gudipati 	struct bfa_bsg_adapter_cfg_mode_s *iocmd =
12841a4d8e1bSKrishna Gudipati 			(struct bfa_bsg_adapter_cfg_mode_s *)cmd;
12851a4d8e1bSKrishna Gudipati 	struct bfad_hal_comp fcomp;
12861a4d8e1bSKrishna Gudipati 	unsigned long flags = 0;
12871a4d8e1bSKrishna Gudipati 
12881a4d8e1bSKrishna Gudipati 	init_completion(&fcomp.comp);
12891a4d8e1bSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
12901a4d8e1bSKrishna Gudipati 	iocmd->status = bfa_ablk_adapter_config(&bfad->bfa.modules.ablk,
12911a4d8e1bSKrishna Gudipati 				iocmd->cfg.mode, iocmd->cfg.max_pf,
12921a4d8e1bSKrishna Gudipati 				iocmd->cfg.max_vf, bfad_hcb_comp, &fcomp);
12931a4d8e1bSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
12941a4d8e1bSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
12951a4d8e1bSKrishna Gudipati 		goto out;
12961a4d8e1bSKrishna Gudipati 
12971a4d8e1bSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
12981a4d8e1bSKrishna Gudipati 	iocmd->status = fcomp.status;
12991a4d8e1bSKrishna Gudipati out:
13001a4d8e1bSKrishna Gudipati 	return 0;
13011a4d8e1bSKrishna Gudipati }
13021a4d8e1bSKrishna Gudipati 
1303*3bbd8ef9SLee Jones static int
13041a4d8e1bSKrishna Gudipati bfad_iocmd_port_cfg_mode(struct bfad_s *bfad, void *cmd)
13051a4d8e1bSKrishna Gudipati {
13061a4d8e1bSKrishna Gudipati 	struct bfa_bsg_port_cfg_mode_s *iocmd =
13071a4d8e1bSKrishna Gudipati 			(struct bfa_bsg_port_cfg_mode_s *)cmd;
13081a4d8e1bSKrishna Gudipati 	struct bfad_hal_comp fcomp;
13091a4d8e1bSKrishna Gudipati 	unsigned long flags = 0;
13101a4d8e1bSKrishna Gudipati 
13111a4d8e1bSKrishna Gudipati 	init_completion(&fcomp.comp);
13121a4d8e1bSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
13131a4d8e1bSKrishna Gudipati 	iocmd->status = bfa_ablk_port_config(&bfad->bfa.modules.ablk,
13141a4d8e1bSKrishna Gudipati 				iocmd->instance, iocmd->cfg.mode,
13151a4d8e1bSKrishna Gudipati 				iocmd->cfg.max_pf, iocmd->cfg.max_vf,
13161a4d8e1bSKrishna Gudipati 				bfad_hcb_comp, &fcomp);
13171a4d8e1bSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
13181a4d8e1bSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
13191a4d8e1bSKrishna Gudipati 		goto out;
13201a4d8e1bSKrishna Gudipati 
13211a4d8e1bSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
13221a4d8e1bSKrishna Gudipati 	iocmd->status = fcomp.status;
13231a4d8e1bSKrishna Gudipati out:
13241a4d8e1bSKrishna Gudipati 	return 0;
13251a4d8e1bSKrishna Gudipati }
13261a4d8e1bSKrishna Gudipati 
1327*3bbd8ef9SLee Jones static int
13281a4d8e1bSKrishna Gudipati bfad_iocmd_ablk_optrom(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
13291a4d8e1bSKrishna Gudipati {
13301a4d8e1bSKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
13311a4d8e1bSKrishna Gudipati 	struct bfad_hal_comp fcomp;
13321a4d8e1bSKrishna Gudipati 	unsigned long   flags;
13331a4d8e1bSKrishna Gudipati 
13341a4d8e1bSKrishna Gudipati 	init_completion(&fcomp.comp);
13351a4d8e1bSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
13361a4d8e1bSKrishna Gudipati 	if (cmd == IOCMD_FLASH_ENABLE_OPTROM)
13371a4d8e1bSKrishna Gudipati 		iocmd->status = bfa_ablk_optrom_en(&bfad->bfa.modules.ablk,
13381a4d8e1bSKrishna Gudipati 					bfad_hcb_comp, &fcomp);
13391a4d8e1bSKrishna Gudipati 	else
13401a4d8e1bSKrishna Gudipati 		iocmd->status = bfa_ablk_optrom_dis(&bfad->bfa.modules.ablk,
13411a4d8e1bSKrishna Gudipati 					bfad_hcb_comp, &fcomp);
13421a4d8e1bSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
13431a4d8e1bSKrishna Gudipati 
13441a4d8e1bSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
13451a4d8e1bSKrishna Gudipati 		goto out;
13461a4d8e1bSKrishna Gudipati 
13471a4d8e1bSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
13481a4d8e1bSKrishna Gudipati 	iocmd->status = fcomp.status;
13491a4d8e1bSKrishna Gudipati out:
13501a4d8e1bSKrishna Gudipati 	return 0;
13511a4d8e1bSKrishna Gudipati }
13521a4d8e1bSKrishna Gudipati 
1353*3bbd8ef9SLee Jones static int
1354a714134aSKrishna Gudipati bfad_iocmd_faa_query(struct bfad_s *bfad, void *cmd)
1355a714134aSKrishna Gudipati {
1356a714134aSKrishna Gudipati 	struct bfa_bsg_faa_attr_s *iocmd = (struct bfa_bsg_faa_attr_s *)cmd;
1357a714134aSKrishna Gudipati 	struct bfad_hal_comp    fcomp;
1358a714134aSKrishna Gudipati 	unsigned long   flags;
1359a714134aSKrishna Gudipati 
1360a714134aSKrishna Gudipati 	init_completion(&fcomp.comp);
1361a714134aSKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
1362a714134aSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
1363a714134aSKrishna Gudipati 	iocmd->status = bfa_faa_query(&bfad->bfa, &iocmd->faa_attr,
1364a714134aSKrishna Gudipati 				bfad_hcb_comp, &fcomp);
1365a714134aSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1366a714134aSKrishna Gudipati 
1367a714134aSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
1368a714134aSKrishna Gudipati 		goto out;
1369a714134aSKrishna Gudipati 
1370a714134aSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
1371a714134aSKrishna Gudipati 	iocmd->status = fcomp.status;
1372a714134aSKrishna Gudipati out:
1373a714134aSKrishna Gudipati 	return 0;
1374a714134aSKrishna Gudipati }
1375a714134aSKrishna Gudipati 
1376*3bbd8ef9SLee Jones static int
1377148d6103SKrishna Gudipati bfad_iocmd_cee_attr(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
1378148d6103SKrishna Gudipati {
1379148d6103SKrishna Gudipati 	struct bfa_bsg_cee_attr_s *iocmd =
1380148d6103SKrishna Gudipati 				(struct bfa_bsg_cee_attr_s *)cmd;
1381148d6103SKrishna Gudipati 	void	*iocmd_bufptr;
1382148d6103SKrishna Gudipati 	struct bfad_hal_comp	cee_comp;
1383148d6103SKrishna Gudipati 	unsigned long	flags;
1384148d6103SKrishna Gudipati 
1385148d6103SKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len,
1386148d6103SKrishna Gudipati 			sizeof(struct bfa_bsg_cee_attr_s),
1387148d6103SKrishna Gudipati 			sizeof(struct bfa_cee_attr_s)) != BFA_STATUS_OK) {
1388148d6103SKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
1389148d6103SKrishna Gudipati 		return 0;
1390148d6103SKrishna Gudipati 	}
1391148d6103SKrishna Gudipati 
1392148d6103SKrishna Gudipati 	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_attr_s);
1393148d6103SKrishna Gudipati 
1394148d6103SKrishna Gudipati 	cee_comp.status = 0;
1395148d6103SKrishna Gudipati 	init_completion(&cee_comp.comp);
1396148d6103SKrishna Gudipati 	mutex_lock(&bfad_mutex);
1397148d6103SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
1398148d6103SKrishna Gudipati 	iocmd->status = bfa_cee_get_attr(&bfad->bfa.modules.cee, iocmd_bufptr,
1399148d6103SKrishna Gudipati 					 bfad_hcb_comp, &cee_comp);
1400148d6103SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1401148d6103SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
1402148d6103SKrishna Gudipati 		mutex_unlock(&bfad_mutex);
1403148d6103SKrishna Gudipati 		bfa_trc(bfad, 0x5555);
1404148d6103SKrishna Gudipati 		goto out;
1405148d6103SKrishna Gudipati 	}
1406148d6103SKrishna Gudipati 	wait_for_completion(&cee_comp.comp);
1407148d6103SKrishna Gudipati 	mutex_unlock(&bfad_mutex);
1408148d6103SKrishna Gudipati out:
1409148d6103SKrishna Gudipati 	return 0;
1410148d6103SKrishna Gudipati }
1411148d6103SKrishna Gudipati 
1412*3bbd8ef9SLee Jones static int
1413148d6103SKrishna Gudipati bfad_iocmd_cee_get_stats(struct bfad_s *bfad, void *cmd,
1414148d6103SKrishna Gudipati 			unsigned int payload_len)
1415148d6103SKrishna Gudipati {
1416148d6103SKrishna Gudipati 	struct bfa_bsg_cee_stats_s *iocmd =
1417148d6103SKrishna Gudipati 				(struct bfa_bsg_cee_stats_s *)cmd;
1418148d6103SKrishna Gudipati 	void	*iocmd_bufptr;
1419148d6103SKrishna Gudipati 	struct bfad_hal_comp	cee_comp;
1420148d6103SKrishna Gudipati 	unsigned long	flags;
1421148d6103SKrishna Gudipati 
1422148d6103SKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len,
1423148d6103SKrishna Gudipati 			sizeof(struct bfa_bsg_cee_stats_s),
1424148d6103SKrishna Gudipati 			sizeof(struct bfa_cee_stats_s)) != BFA_STATUS_OK) {
1425148d6103SKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
1426148d6103SKrishna Gudipati 		return 0;
1427148d6103SKrishna Gudipati 	}
1428148d6103SKrishna Gudipati 
1429148d6103SKrishna Gudipati 	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_stats_s);
1430148d6103SKrishna Gudipati 
1431148d6103SKrishna Gudipati 	cee_comp.status = 0;
1432148d6103SKrishna Gudipati 	init_completion(&cee_comp.comp);
1433148d6103SKrishna Gudipati 	mutex_lock(&bfad_mutex);
1434148d6103SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
1435148d6103SKrishna Gudipati 	iocmd->status = bfa_cee_get_stats(&bfad->bfa.modules.cee, iocmd_bufptr,
1436148d6103SKrishna Gudipati 					bfad_hcb_comp, &cee_comp);
1437148d6103SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1438148d6103SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
1439148d6103SKrishna Gudipati 		mutex_unlock(&bfad_mutex);
1440148d6103SKrishna Gudipati 		bfa_trc(bfad, 0x5555);
1441148d6103SKrishna Gudipati 		goto out;
1442148d6103SKrishna Gudipati 	}
1443148d6103SKrishna Gudipati 	wait_for_completion(&cee_comp.comp);
1444148d6103SKrishna Gudipati 	mutex_unlock(&bfad_mutex);
1445148d6103SKrishna Gudipati out:
1446148d6103SKrishna Gudipati 	return 0;
1447148d6103SKrishna Gudipati }
1448148d6103SKrishna Gudipati 
1449*3bbd8ef9SLee Jones static int
1450148d6103SKrishna Gudipati bfad_iocmd_cee_reset_stats(struct bfad_s *bfad, void *cmd)
1451148d6103SKrishna Gudipati {
1452148d6103SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
1453148d6103SKrishna Gudipati 	unsigned long	flags;
1454148d6103SKrishna Gudipati 
1455148d6103SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
1456148d6103SKrishna Gudipati 	iocmd->status = bfa_cee_reset_stats(&bfad->bfa.modules.cee, NULL, NULL);
1457148d6103SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1458148d6103SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
1459148d6103SKrishna Gudipati 		bfa_trc(bfad, 0x5555);
1460148d6103SKrishna Gudipati 	return 0;
1461148d6103SKrishna Gudipati }
1462148d6103SKrishna Gudipati 
1463*3bbd8ef9SLee Jones static int
146451e569aaSKrishna Gudipati bfad_iocmd_sfp_media(struct bfad_s *bfad, void *cmd)
146551e569aaSKrishna Gudipati {
146651e569aaSKrishna Gudipati 	struct bfa_bsg_sfp_media_s *iocmd = (struct bfa_bsg_sfp_media_s *)cmd;
146751e569aaSKrishna Gudipati 	struct bfad_hal_comp	fcomp;
146851e569aaSKrishna Gudipati 	unsigned long	flags;
146951e569aaSKrishna Gudipati 
147051e569aaSKrishna Gudipati 	init_completion(&fcomp.comp);
147151e569aaSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
147251e569aaSKrishna Gudipati 	iocmd->status = bfa_sfp_media(BFA_SFP_MOD(&bfad->bfa), &iocmd->media,
147351e569aaSKrishna Gudipati 				bfad_hcb_comp, &fcomp);
147451e569aaSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
147551e569aaSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
147651e569aaSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_SFP_NOT_READY)
147751e569aaSKrishna Gudipati 		goto out;
147851e569aaSKrishna Gudipati 
147951e569aaSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
148051e569aaSKrishna Gudipati 	iocmd->status = fcomp.status;
148151e569aaSKrishna Gudipati out:
148251e569aaSKrishna Gudipati 	return 0;
148351e569aaSKrishna Gudipati }
148451e569aaSKrishna Gudipati 
1485*3bbd8ef9SLee Jones static int
148651e569aaSKrishna Gudipati bfad_iocmd_sfp_speed(struct bfad_s *bfad, void *cmd)
148751e569aaSKrishna Gudipati {
148851e569aaSKrishna Gudipati 	struct bfa_bsg_sfp_speed_s *iocmd = (struct bfa_bsg_sfp_speed_s *)cmd;
148951e569aaSKrishna Gudipati 	struct bfad_hal_comp	fcomp;
149051e569aaSKrishna Gudipati 	unsigned long	flags;
149151e569aaSKrishna Gudipati 
149251e569aaSKrishna Gudipati 	init_completion(&fcomp.comp);
149351e569aaSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
149451e569aaSKrishna Gudipati 	iocmd->status = bfa_sfp_speed(BFA_SFP_MOD(&bfad->bfa), iocmd->speed,
149551e569aaSKrishna Gudipati 				bfad_hcb_comp, &fcomp);
149651e569aaSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
149751e569aaSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
149851e569aaSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_SFP_NOT_READY)
149951e569aaSKrishna Gudipati 		goto out;
150051e569aaSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
150151e569aaSKrishna Gudipati 	iocmd->status = fcomp.status;
150251e569aaSKrishna Gudipati out:
150351e569aaSKrishna Gudipati 	return 0;
150451e569aaSKrishna Gudipati }
150551e569aaSKrishna Gudipati 
1506*3bbd8ef9SLee Jones static int
15075a54b1d5SKrishna Gudipati bfad_iocmd_flash_get_attr(struct bfad_s *bfad, void *cmd)
15085a54b1d5SKrishna Gudipati {
15095a54b1d5SKrishna Gudipati 	struct bfa_bsg_flash_attr_s *iocmd =
15105a54b1d5SKrishna Gudipati 			(struct bfa_bsg_flash_attr_s *)cmd;
15115a54b1d5SKrishna Gudipati 	struct bfad_hal_comp fcomp;
15125a54b1d5SKrishna Gudipati 	unsigned long	flags;
15135a54b1d5SKrishna Gudipati 
15145a54b1d5SKrishna Gudipati 	init_completion(&fcomp.comp);
15155a54b1d5SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
15165a54b1d5SKrishna Gudipati 	iocmd->status = bfa_flash_get_attr(BFA_FLASH(&bfad->bfa), &iocmd->attr,
15175a54b1d5SKrishna Gudipati 				bfad_hcb_comp, &fcomp);
15185a54b1d5SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
15195a54b1d5SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
15205a54b1d5SKrishna Gudipati 		goto out;
15215a54b1d5SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
15225a54b1d5SKrishna Gudipati 	iocmd->status = fcomp.status;
15235a54b1d5SKrishna Gudipati out:
15245a54b1d5SKrishna Gudipati 	return 0;
15255a54b1d5SKrishna Gudipati }
15265a54b1d5SKrishna Gudipati 
1527*3bbd8ef9SLee Jones static int
15285a54b1d5SKrishna Gudipati bfad_iocmd_flash_erase_part(struct bfad_s *bfad, void *cmd)
15295a54b1d5SKrishna Gudipati {
15305a54b1d5SKrishna Gudipati 	struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
15315a54b1d5SKrishna Gudipati 	struct bfad_hal_comp fcomp;
15325a54b1d5SKrishna Gudipati 	unsigned long	flags;
15335a54b1d5SKrishna Gudipati 
15345a54b1d5SKrishna Gudipati 	init_completion(&fcomp.comp);
15355a54b1d5SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
15365a54b1d5SKrishna Gudipati 	iocmd->status = bfa_flash_erase_part(BFA_FLASH(&bfad->bfa), iocmd->type,
15375a54b1d5SKrishna Gudipati 				iocmd->instance, bfad_hcb_comp, &fcomp);
15385a54b1d5SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
15395a54b1d5SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
15405a54b1d5SKrishna Gudipati 		goto out;
15415a54b1d5SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
15425a54b1d5SKrishna Gudipati 	iocmd->status = fcomp.status;
15435a54b1d5SKrishna Gudipati out:
15445a54b1d5SKrishna Gudipati 	return 0;
15455a54b1d5SKrishna Gudipati }
15465a54b1d5SKrishna Gudipati 
1547*3bbd8ef9SLee Jones static int
15485a54b1d5SKrishna Gudipati bfad_iocmd_flash_update_part(struct bfad_s *bfad, void *cmd,
15495a54b1d5SKrishna Gudipati 			unsigned int payload_len)
15505a54b1d5SKrishna Gudipati {
15515a54b1d5SKrishna Gudipati 	struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
15525a54b1d5SKrishna Gudipati 	void	*iocmd_bufptr;
15535a54b1d5SKrishna Gudipati 	struct bfad_hal_comp fcomp;
15545a54b1d5SKrishna Gudipati 	unsigned long	flags;
15555a54b1d5SKrishna Gudipati 
15565a54b1d5SKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len,
15575a54b1d5SKrishna Gudipati 			sizeof(struct bfa_bsg_flash_s),
15585a54b1d5SKrishna Gudipati 			iocmd->bufsz) != BFA_STATUS_OK) {
15595a54b1d5SKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
15605a54b1d5SKrishna Gudipati 		return 0;
15615a54b1d5SKrishna Gudipati 	}
15625a54b1d5SKrishna Gudipati 
15635a54b1d5SKrishna Gudipati 	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s);
15645a54b1d5SKrishna Gudipati 
15655a54b1d5SKrishna Gudipati 	init_completion(&fcomp.comp);
15665a54b1d5SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
15675a54b1d5SKrishna Gudipati 	iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
15685a54b1d5SKrishna Gudipati 				iocmd->type, iocmd->instance, iocmd_bufptr,
15695a54b1d5SKrishna Gudipati 				iocmd->bufsz, 0, bfad_hcb_comp, &fcomp);
15705a54b1d5SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
15715a54b1d5SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
15725a54b1d5SKrishna Gudipati 		goto out;
15735a54b1d5SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
15745a54b1d5SKrishna Gudipati 	iocmd->status = fcomp.status;
15755a54b1d5SKrishna Gudipati out:
15765a54b1d5SKrishna Gudipati 	return 0;
15775a54b1d5SKrishna Gudipati }
15785a54b1d5SKrishna Gudipati 
1579*3bbd8ef9SLee Jones static int
15805a54b1d5SKrishna Gudipati bfad_iocmd_flash_read_part(struct bfad_s *bfad, void *cmd,
15815a54b1d5SKrishna Gudipati 			unsigned int payload_len)
15825a54b1d5SKrishna Gudipati {
15835a54b1d5SKrishna Gudipati 	struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
15845a54b1d5SKrishna Gudipati 	struct bfad_hal_comp fcomp;
15855a54b1d5SKrishna Gudipati 	void	*iocmd_bufptr;
15865a54b1d5SKrishna Gudipati 	unsigned long	flags;
15875a54b1d5SKrishna Gudipati 
15885a54b1d5SKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len,
15895a54b1d5SKrishna Gudipati 			sizeof(struct bfa_bsg_flash_s),
15905a54b1d5SKrishna Gudipati 			iocmd->bufsz) != BFA_STATUS_OK) {
15915a54b1d5SKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
15925a54b1d5SKrishna Gudipati 		return 0;
15935a54b1d5SKrishna Gudipati 	}
15945a54b1d5SKrishna Gudipati 
15955a54b1d5SKrishna Gudipati 	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s);
15965a54b1d5SKrishna Gudipati 
15975a54b1d5SKrishna Gudipati 	init_completion(&fcomp.comp);
15985a54b1d5SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
15995a54b1d5SKrishna Gudipati 	iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), iocmd->type,
16005a54b1d5SKrishna Gudipati 				iocmd->instance, iocmd_bufptr, iocmd->bufsz, 0,
16015a54b1d5SKrishna Gudipati 				bfad_hcb_comp, &fcomp);
16025a54b1d5SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16035a54b1d5SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
16045a54b1d5SKrishna Gudipati 		goto out;
16055a54b1d5SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
16065a54b1d5SKrishna Gudipati 	iocmd->status = fcomp.status;
16075a54b1d5SKrishna Gudipati out:
16085a54b1d5SKrishna Gudipati 	return 0;
16095a54b1d5SKrishna Gudipati }
16105a54b1d5SKrishna Gudipati 
1611*3bbd8ef9SLee Jones static int
16123d7fc66dSKrishna Gudipati bfad_iocmd_diag_temp(struct bfad_s *bfad, void *cmd)
16133d7fc66dSKrishna Gudipati {
16143d7fc66dSKrishna Gudipati 	struct bfa_bsg_diag_get_temp_s *iocmd =
16153d7fc66dSKrishna Gudipati 			(struct bfa_bsg_diag_get_temp_s *)cmd;
16163d7fc66dSKrishna Gudipati 	struct bfad_hal_comp fcomp;
16173d7fc66dSKrishna Gudipati 	unsigned long	flags;
16183d7fc66dSKrishna Gudipati 
16193d7fc66dSKrishna Gudipati 	init_completion(&fcomp.comp);
16203d7fc66dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
16213d7fc66dSKrishna Gudipati 	iocmd->status = bfa_diag_tsensor_query(BFA_DIAG_MOD(&bfad->bfa),
16223d7fc66dSKrishna Gudipati 				&iocmd->result, bfad_hcb_comp, &fcomp);
16233d7fc66dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16243d7fc66dSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
16253d7fc66dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
16263d7fc66dSKrishna Gudipati 		goto out;
16273d7fc66dSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
16283d7fc66dSKrishna Gudipati 	iocmd->status = fcomp.status;
16293d7fc66dSKrishna Gudipati out:
16303d7fc66dSKrishna Gudipati 	return 0;
16313d7fc66dSKrishna Gudipati }
16323d7fc66dSKrishna Gudipati 
1633*3bbd8ef9SLee Jones static int
16343d7fc66dSKrishna Gudipati bfad_iocmd_diag_memtest(struct bfad_s *bfad, void *cmd)
16353d7fc66dSKrishna Gudipati {
16363d7fc66dSKrishna Gudipati 	struct bfa_bsg_diag_memtest_s *iocmd =
16373d7fc66dSKrishna Gudipati 			(struct bfa_bsg_diag_memtest_s *)cmd;
16383d7fc66dSKrishna Gudipati 	struct bfad_hal_comp fcomp;
16393d7fc66dSKrishna Gudipati 	unsigned long   flags;
16403d7fc66dSKrishna Gudipati 
16413d7fc66dSKrishna Gudipati 	init_completion(&fcomp.comp);
16423d7fc66dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
16433d7fc66dSKrishna Gudipati 	iocmd->status = bfa_diag_memtest(BFA_DIAG_MOD(&bfad->bfa),
16443d7fc66dSKrishna Gudipati 				&iocmd->memtest, iocmd->pat,
16453d7fc66dSKrishna Gudipati 				&iocmd->result, bfad_hcb_comp, &fcomp);
16463d7fc66dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16473d7fc66dSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
16483d7fc66dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
16493d7fc66dSKrishna Gudipati 		goto out;
16503d7fc66dSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
16513d7fc66dSKrishna Gudipati 	iocmd->status = fcomp.status;
16523d7fc66dSKrishna Gudipati out:
16533d7fc66dSKrishna Gudipati 	return 0;
16543d7fc66dSKrishna Gudipati }
16553d7fc66dSKrishna Gudipati 
1656*3bbd8ef9SLee Jones static int
16573d7fc66dSKrishna Gudipati bfad_iocmd_diag_loopback(struct bfad_s *bfad, void *cmd)
16583d7fc66dSKrishna Gudipati {
16593d7fc66dSKrishna Gudipati 	struct bfa_bsg_diag_loopback_s *iocmd =
16603d7fc66dSKrishna Gudipati 			(struct bfa_bsg_diag_loopback_s *)cmd;
16613d7fc66dSKrishna Gudipati 	struct bfad_hal_comp fcomp;
16623d7fc66dSKrishna Gudipati 	unsigned long   flags;
16633d7fc66dSKrishna Gudipati 
16643d7fc66dSKrishna Gudipati 	init_completion(&fcomp.comp);
16653d7fc66dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
16663d7fc66dSKrishna Gudipati 	iocmd->status = bfa_fcdiag_loopback(&bfad->bfa, iocmd->opmode,
16673d7fc66dSKrishna Gudipati 				iocmd->speed, iocmd->lpcnt, iocmd->pat,
16683d7fc66dSKrishna Gudipati 				&iocmd->result, bfad_hcb_comp, &fcomp);
16693d7fc66dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16703d7fc66dSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
16713d7fc66dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
16723d7fc66dSKrishna Gudipati 		goto out;
16733d7fc66dSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
16743d7fc66dSKrishna Gudipati 	iocmd->status = fcomp.status;
16753d7fc66dSKrishna Gudipati out:
16763d7fc66dSKrishna Gudipati 	return 0;
16773d7fc66dSKrishna Gudipati }
16783d7fc66dSKrishna Gudipati 
1679*3bbd8ef9SLee Jones static int
16803d7fc66dSKrishna Gudipati bfad_iocmd_diag_fwping(struct bfad_s *bfad, void *cmd)
16813d7fc66dSKrishna Gudipati {
16823d7fc66dSKrishna Gudipati 	struct bfa_bsg_diag_fwping_s *iocmd =
16833d7fc66dSKrishna Gudipati 			(struct bfa_bsg_diag_fwping_s *)cmd;
16843d7fc66dSKrishna Gudipati 	struct bfad_hal_comp fcomp;
16853d7fc66dSKrishna Gudipati 	unsigned long   flags;
16863d7fc66dSKrishna Gudipati 
16873d7fc66dSKrishna Gudipati 	init_completion(&fcomp.comp);
16883d7fc66dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
16893d7fc66dSKrishna Gudipati 	iocmd->status = bfa_diag_fwping(BFA_DIAG_MOD(&bfad->bfa), iocmd->cnt,
16903d7fc66dSKrishna Gudipati 				iocmd->pattern, &iocmd->result,
16913d7fc66dSKrishna Gudipati 				bfad_hcb_comp, &fcomp);
16923d7fc66dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
16933d7fc66dSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
16943d7fc66dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
16953d7fc66dSKrishna Gudipati 		goto out;
16963d7fc66dSKrishna Gudipati 	bfa_trc(bfad, 0x77771);
16973d7fc66dSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
16983d7fc66dSKrishna Gudipati 	iocmd->status = fcomp.status;
16993d7fc66dSKrishna Gudipati out:
17003d7fc66dSKrishna Gudipati 	return 0;
17013d7fc66dSKrishna Gudipati }
17023d7fc66dSKrishna Gudipati 
1703*3bbd8ef9SLee Jones static int
17043d7fc66dSKrishna Gudipati bfad_iocmd_diag_queuetest(struct bfad_s *bfad, void *cmd)
17053d7fc66dSKrishna Gudipati {
17063d7fc66dSKrishna Gudipati 	struct bfa_bsg_diag_qtest_s *iocmd = (struct bfa_bsg_diag_qtest_s *)cmd;
17073d7fc66dSKrishna Gudipati 	struct bfad_hal_comp fcomp;
17083d7fc66dSKrishna Gudipati 	unsigned long   flags;
17093d7fc66dSKrishna Gudipati 
17103d7fc66dSKrishna Gudipati 	init_completion(&fcomp.comp);
17113d7fc66dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
17123d7fc66dSKrishna Gudipati 	iocmd->status = bfa_fcdiag_queuetest(&bfad->bfa, iocmd->force,
17133d7fc66dSKrishna Gudipati 				iocmd->queue, &iocmd->result,
17143d7fc66dSKrishna Gudipati 				bfad_hcb_comp, &fcomp);
17153d7fc66dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
17163d7fc66dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
17173d7fc66dSKrishna Gudipati 		goto out;
17183d7fc66dSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
17193d7fc66dSKrishna Gudipati 	iocmd->status = fcomp.status;
17203d7fc66dSKrishna Gudipati out:
17213d7fc66dSKrishna Gudipati 	return 0;
17223d7fc66dSKrishna Gudipati }
17233d7fc66dSKrishna Gudipati 
1724*3bbd8ef9SLee Jones static int
17253d7fc66dSKrishna Gudipati bfad_iocmd_diag_sfp(struct bfad_s *bfad, void *cmd)
17263d7fc66dSKrishna Gudipati {
17273d7fc66dSKrishna Gudipati 	struct bfa_bsg_sfp_show_s *iocmd =
17283d7fc66dSKrishna Gudipati 			(struct bfa_bsg_sfp_show_s *)cmd;
17293d7fc66dSKrishna Gudipati 	struct bfad_hal_comp fcomp;
17303d7fc66dSKrishna Gudipati 	unsigned long   flags;
17313d7fc66dSKrishna Gudipati 
17323d7fc66dSKrishna Gudipati 	init_completion(&fcomp.comp);
17333d7fc66dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
17343d7fc66dSKrishna Gudipati 	iocmd->status = bfa_sfp_show(BFA_SFP_MOD(&bfad->bfa), &iocmd->sfp,
17353d7fc66dSKrishna Gudipati 				bfad_hcb_comp, &fcomp);
17363d7fc66dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
17373d7fc66dSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
17383d7fc66dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
17393d7fc66dSKrishna Gudipati 		goto out;
17403d7fc66dSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
17413d7fc66dSKrishna Gudipati 	iocmd->status = fcomp.status;
17423d7fc66dSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
17433d7fc66dSKrishna Gudipati out:
17443d7fc66dSKrishna Gudipati 	return 0;
17453d7fc66dSKrishna Gudipati }
17463d7fc66dSKrishna Gudipati 
1747*3bbd8ef9SLee Jones static int
17483d7fc66dSKrishna Gudipati bfad_iocmd_diag_led(struct bfad_s *bfad, void *cmd)
17493d7fc66dSKrishna Gudipati {
17503d7fc66dSKrishna Gudipati 	struct bfa_bsg_diag_led_s *iocmd = (struct bfa_bsg_diag_led_s *)cmd;
17513d7fc66dSKrishna Gudipati 	unsigned long   flags;
17523d7fc66dSKrishna Gudipati 
17533d7fc66dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
17543d7fc66dSKrishna Gudipati 	iocmd->status = bfa_diag_ledtest(BFA_DIAG_MOD(&bfad->bfa),
17553d7fc66dSKrishna Gudipati 				&iocmd->ledtest);
17563d7fc66dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
17573d7fc66dSKrishna Gudipati 	return 0;
17583d7fc66dSKrishna Gudipati }
17593d7fc66dSKrishna Gudipati 
1760*3bbd8ef9SLee Jones static int
17613d7fc66dSKrishna Gudipati bfad_iocmd_diag_beacon_lport(struct bfad_s *bfad, void *cmd)
17623d7fc66dSKrishna Gudipati {
17633d7fc66dSKrishna Gudipati 	struct bfa_bsg_diag_beacon_s *iocmd =
17643d7fc66dSKrishna Gudipati 			(struct bfa_bsg_diag_beacon_s *)cmd;
17653d7fc66dSKrishna Gudipati 	unsigned long	flags;
17663d7fc66dSKrishna Gudipati 
17673d7fc66dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
17683d7fc66dSKrishna Gudipati 	iocmd->status = bfa_diag_beacon_port(BFA_DIAG_MOD(&bfad->bfa),
17693d7fc66dSKrishna Gudipati 				iocmd->beacon, iocmd->link_e2e_beacon,
17703d7fc66dSKrishna Gudipati 				iocmd->second);
17713d7fc66dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
17723d7fc66dSKrishna Gudipati 	return 0;
17733d7fc66dSKrishna Gudipati }
17743d7fc66dSKrishna Gudipati 
1775*3bbd8ef9SLee Jones static int
17763d7fc66dSKrishna Gudipati bfad_iocmd_diag_lb_stat(struct bfad_s *bfad, void *cmd)
17773d7fc66dSKrishna Gudipati {
17783d7fc66dSKrishna Gudipati 	struct bfa_bsg_diag_lb_stat_s *iocmd =
17793d7fc66dSKrishna Gudipati 			(struct bfa_bsg_diag_lb_stat_s *)cmd;
17803d7fc66dSKrishna Gudipati 	unsigned long	flags;
17813d7fc66dSKrishna Gudipati 
17823d7fc66dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
17833d7fc66dSKrishna Gudipati 	iocmd->status = bfa_fcdiag_lb_is_running(&bfad->bfa);
17843d7fc66dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
17853d7fc66dSKrishna Gudipati 	bfa_trc(bfad, iocmd->status);
17863d7fc66dSKrishna Gudipati 
17873d7fc66dSKrishna Gudipati 	return 0;
17883d7fc66dSKrishna Gudipati }
17893d7fc66dSKrishna Gudipati 
1790*3bbd8ef9SLee Jones static int
17911a898a79SVijaya Mohan Guvva bfad_iocmd_diag_dport_enable(struct bfad_s *bfad, void *pcmd)
17921a898a79SVijaya Mohan Guvva {
17931a898a79SVijaya Mohan Guvva 	struct bfa_bsg_dport_enable_s *iocmd =
17941a898a79SVijaya Mohan Guvva 				(struct bfa_bsg_dport_enable_s *)pcmd;
17951a898a79SVijaya Mohan Guvva 	unsigned long	flags;
17961a898a79SVijaya Mohan Guvva 	struct bfad_hal_comp fcomp;
17971a898a79SVijaya Mohan Guvva 
17981a898a79SVijaya Mohan Guvva 	init_completion(&fcomp.comp);
17991a898a79SVijaya Mohan Guvva 	spin_lock_irqsave(&bfad->bfad_lock, flags);
18001a898a79SVijaya Mohan Guvva 	iocmd->status = bfa_dport_enable(&bfad->bfa, iocmd->lpcnt,
18011a898a79SVijaya Mohan Guvva 					iocmd->pat, bfad_hcb_comp, &fcomp);
18021a898a79SVijaya Mohan Guvva 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
18031a898a79SVijaya Mohan Guvva 	if (iocmd->status != BFA_STATUS_OK)
18041a898a79SVijaya Mohan Guvva 		bfa_trc(bfad, iocmd->status);
18051a898a79SVijaya Mohan Guvva 	else {
18061a898a79SVijaya Mohan Guvva 		wait_for_completion(&fcomp.comp);
18071a898a79SVijaya Mohan Guvva 		iocmd->status = fcomp.status;
18081a898a79SVijaya Mohan Guvva 	}
18091a898a79SVijaya Mohan Guvva 	return 0;
18101a898a79SVijaya Mohan Guvva }
18111a898a79SVijaya Mohan Guvva 
1812*3bbd8ef9SLee Jones static int
18131a898a79SVijaya Mohan Guvva bfad_iocmd_diag_dport_disable(struct bfad_s *bfad, void *pcmd)
1814e353546eSKrishna Gudipati {
1815e353546eSKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
1816e353546eSKrishna Gudipati 	unsigned long	flags;
1817e353546eSKrishna Gudipati 	struct bfad_hal_comp fcomp;
1818e353546eSKrishna Gudipati 
1819e353546eSKrishna Gudipati 	init_completion(&fcomp.comp);
1820e353546eSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
18211a898a79SVijaya Mohan Guvva 	iocmd->status = bfa_dport_disable(&bfad->bfa, bfad_hcb_comp, &fcomp);
1822e353546eSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1823e353546eSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
1824e353546eSKrishna Gudipati 		bfa_trc(bfad, iocmd->status);
1825e353546eSKrishna Gudipati 	else {
1826e353546eSKrishna Gudipati 		wait_for_completion(&fcomp.comp);
1827e353546eSKrishna Gudipati 		iocmd->status = fcomp.status;
1828e353546eSKrishna Gudipati 	}
18291a898a79SVijaya Mohan Guvva 	return 0;
18301a898a79SVijaya Mohan Guvva }
18311a898a79SVijaya Mohan Guvva 
1832*3bbd8ef9SLee Jones static int
18331a898a79SVijaya Mohan Guvva bfad_iocmd_diag_dport_start(struct bfad_s *bfad, void *pcmd)
18341a898a79SVijaya Mohan Guvva {
18351a898a79SVijaya Mohan Guvva 	struct bfa_bsg_dport_enable_s *iocmd =
18361a898a79SVijaya Mohan Guvva 				(struct bfa_bsg_dport_enable_s *)pcmd;
18371a898a79SVijaya Mohan Guvva 	unsigned long   flags;
18381a898a79SVijaya Mohan Guvva 	struct bfad_hal_comp fcomp;
18391a898a79SVijaya Mohan Guvva 
18401a898a79SVijaya Mohan Guvva 	init_completion(&fcomp.comp);
18411a898a79SVijaya Mohan Guvva 	spin_lock_irqsave(&bfad->bfad_lock, flags);
18421a898a79SVijaya Mohan Guvva 	iocmd->status = bfa_dport_start(&bfad->bfa, iocmd->lpcnt,
18431a898a79SVijaya Mohan Guvva 					iocmd->pat, bfad_hcb_comp,
18441a898a79SVijaya Mohan Guvva 					&fcomp);
18451a898a79SVijaya Mohan Guvva 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
18461a898a79SVijaya Mohan Guvva 
18471a898a79SVijaya Mohan Guvva 	if (iocmd->status != BFA_STATUS_OK) {
18481a898a79SVijaya Mohan Guvva 		bfa_trc(bfad, iocmd->status);
18491a898a79SVijaya Mohan Guvva 	} else {
18501a898a79SVijaya Mohan Guvva 		wait_for_completion(&fcomp.comp);
18511a898a79SVijaya Mohan Guvva 		iocmd->status = fcomp.status;
18521a898a79SVijaya Mohan Guvva 	}
1853e353546eSKrishna Gudipati 
1854e353546eSKrishna Gudipati 	return 0;
1855e353546eSKrishna Gudipati }
1856e353546eSKrishna Gudipati 
1857*3bbd8ef9SLee Jones static int
18581a898a79SVijaya Mohan Guvva bfad_iocmd_diag_dport_show(struct bfad_s *bfad, void *pcmd)
1859e353546eSKrishna Gudipati {
18601a898a79SVijaya Mohan Guvva 	struct bfa_bsg_diag_dport_show_s *iocmd =
18611a898a79SVijaya Mohan Guvva 				(struct bfa_bsg_diag_dport_show_s *)pcmd;
1862e353546eSKrishna Gudipati 	unsigned long   flags;
1863e353546eSKrishna Gudipati 
1864e353546eSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
18651a898a79SVijaya Mohan Guvva 	iocmd->status = bfa_dport_show(&bfad->bfa, &iocmd->result);
1866e353546eSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1867e353546eSKrishna Gudipati 
1868e353546eSKrishna Gudipati 	return 0;
1869e353546eSKrishna Gudipati }
1870e353546eSKrishna Gudipati 
18711a898a79SVijaya Mohan Guvva 
1872*3bbd8ef9SLee Jones static int
18733350d98dSKrishna Gudipati bfad_iocmd_phy_get_attr(struct bfad_s *bfad, void *cmd)
18743350d98dSKrishna Gudipati {
18753350d98dSKrishna Gudipati 	struct bfa_bsg_phy_attr_s *iocmd =
18763350d98dSKrishna Gudipati 			(struct bfa_bsg_phy_attr_s *)cmd;
18773350d98dSKrishna Gudipati 	struct bfad_hal_comp fcomp;
18783350d98dSKrishna Gudipati 	unsigned long	flags;
18793350d98dSKrishna Gudipati 
18803350d98dSKrishna Gudipati 	init_completion(&fcomp.comp);
18813350d98dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
18823350d98dSKrishna Gudipati 	iocmd->status = bfa_phy_get_attr(BFA_PHY(&bfad->bfa), iocmd->instance,
18833350d98dSKrishna Gudipati 				&iocmd->attr, bfad_hcb_comp, &fcomp);
18843350d98dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
18853350d98dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
18863350d98dSKrishna Gudipati 		goto out;
18873350d98dSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
18883350d98dSKrishna Gudipati 	iocmd->status = fcomp.status;
18893350d98dSKrishna Gudipati out:
18903350d98dSKrishna Gudipati 	return 0;
18913350d98dSKrishna Gudipati }
18923350d98dSKrishna Gudipati 
1893*3bbd8ef9SLee Jones static int
18943350d98dSKrishna Gudipati bfad_iocmd_phy_get_stats(struct bfad_s *bfad, void *cmd)
18953350d98dSKrishna Gudipati {
18963350d98dSKrishna Gudipati 	struct bfa_bsg_phy_stats_s *iocmd =
18973350d98dSKrishna Gudipati 			(struct bfa_bsg_phy_stats_s *)cmd;
18983350d98dSKrishna Gudipati 	struct bfad_hal_comp fcomp;
18993350d98dSKrishna Gudipati 	unsigned long	flags;
19003350d98dSKrishna Gudipati 
19013350d98dSKrishna Gudipati 	init_completion(&fcomp.comp);
19023350d98dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
19033350d98dSKrishna Gudipati 	iocmd->status = bfa_phy_get_stats(BFA_PHY(&bfad->bfa), iocmd->instance,
19043350d98dSKrishna Gudipati 				&iocmd->stats, bfad_hcb_comp, &fcomp);
19053350d98dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
19063350d98dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
19073350d98dSKrishna Gudipati 		goto out;
19083350d98dSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
19093350d98dSKrishna Gudipati 	iocmd->status = fcomp.status;
19103350d98dSKrishna Gudipati out:
19113350d98dSKrishna Gudipati 	return 0;
19123350d98dSKrishna Gudipati }
19133350d98dSKrishna Gudipati 
1914*3bbd8ef9SLee Jones static int
19153350d98dSKrishna Gudipati bfad_iocmd_phy_read(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
19163350d98dSKrishna Gudipati {
19173350d98dSKrishna Gudipati 	struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd;
19183350d98dSKrishna Gudipati 	struct bfad_hal_comp fcomp;
19193350d98dSKrishna Gudipati 	void	*iocmd_bufptr;
19203350d98dSKrishna Gudipati 	unsigned long	flags;
19213350d98dSKrishna Gudipati 
19223350d98dSKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len,
19233350d98dSKrishna Gudipati 			sizeof(struct bfa_bsg_phy_s),
19243350d98dSKrishna Gudipati 			iocmd->bufsz) != BFA_STATUS_OK) {
19253350d98dSKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
19263350d98dSKrishna Gudipati 		return 0;
19273350d98dSKrishna Gudipati 	}
19283350d98dSKrishna Gudipati 
19293350d98dSKrishna Gudipati 	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s);
19303350d98dSKrishna Gudipati 	init_completion(&fcomp.comp);
19313350d98dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
19323350d98dSKrishna Gudipati 	iocmd->status = bfa_phy_read(BFA_PHY(&bfad->bfa),
19333350d98dSKrishna Gudipati 				iocmd->instance, iocmd_bufptr, iocmd->bufsz,
19343350d98dSKrishna Gudipati 				0, bfad_hcb_comp, &fcomp);
19353350d98dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
19363350d98dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
19373350d98dSKrishna Gudipati 		goto out;
19383350d98dSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
19393350d98dSKrishna Gudipati 	iocmd->status = fcomp.status;
19403350d98dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
19413350d98dSKrishna Gudipati 		goto out;
19423350d98dSKrishna Gudipati out:
19433350d98dSKrishna Gudipati 	return 0;
19443350d98dSKrishna Gudipati }
19453350d98dSKrishna Gudipati 
1946*3bbd8ef9SLee Jones static int
194761e62e21SKrishna Gudipati bfad_iocmd_vhba_query(struct bfad_s *bfad, void *cmd)
194861e62e21SKrishna Gudipati {
194961e62e21SKrishna Gudipati 	struct bfa_bsg_vhba_attr_s *iocmd =
195061e62e21SKrishna Gudipati 			(struct bfa_bsg_vhba_attr_s *)cmd;
195161e62e21SKrishna Gudipati 	struct bfa_vhba_attr_s *attr = &iocmd->attr;
195261e62e21SKrishna Gudipati 	unsigned long flags;
195361e62e21SKrishna Gudipati 
195461e62e21SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
195561e62e21SKrishna Gudipati 	attr->pwwn =  bfad->bfa.ioc.attr->pwwn;
195661e62e21SKrishna Gudipati 	attr->nwwn =  bfad->bfa.ioc.attr->nwwn;
195761e62e21SKrishna Gudipati 	attr->plog_enabled = (bfa_boolean_t)bfad->bfa.plog->plog_enabled;
195861e62e21SKrishna Gudipati 	attr->io_profile = bfa_fcpim_get_io_profile(&bfad->bfa);
195961e62e21SKrishna Gudipati 	attr->path_tov  = bfa_fcpim_path_tov_get(&bfad->bfa);
196061e62e21SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
196161e62e21SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
196261e62e21SKrishna Gudipati 	return 0;
196361e62e21SKrishna Gudipati }
196461e62e21SKrishna Gudipati 
1965*3bbd8ef9SLee Jones static int
19663350d98dSKrishna Gudipati bfad_iocmd_phy_update(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
19673350d98dSKrishna Gudipati {
19683350d98dSKrishna Gudipati 	struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd;
19693350d98dSKrishna Gudipati 	void	*iocmd_bufptr;
19703350d98dSKrishna Gudipati 	struct bfad_hal_comp fcomp;
19713350d98dSKrishna Gudipati 	unsigned long	flags;
19723350d98dSKrishna Gudipati 
19733350d98dSKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len,
19743350d98dSKrishna Gudipati 			sizeof(struct bfa_bsg_phy_s),
19753350d98dSKrishna Gudipati 			iocmd->bufsz) != BFA_STATUS_OK) {
19763350d98dSKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
19773350d98dSKrishna Gudipati 		return 0;
19783350d98dSKrishna Gudipati 	}
19793350d98dSKrishna Gudipati 
19803350d98dSKrishna Gudipati 	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s);
19813350d98dSKrishna Gudipati 	init_completion(&fcomp.comp);
19823350d98dSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
19833350d98dSKrishna Gudipati 	iocmd->status = bfa_phy_update(BFA_PHY(&bfad->bfa),
19843350d98dSKrishna Gudipati 				iocmd->instance, iocmd_bufptr, iocmd->bufsz,
19853350d98dSKrishna Gudipati 				0, bfad_hcb_comp, &fcomp);
19863350d98dSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
19873350d98dSKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
19883350d98dSKrishna Gudipati 		goto out;
19893350d98dSKrishna Gudipati 	wait_for_completion(&fcomp.comp);
19903350d98dSKrishna Gudipati 	iocmd->status = fcomp.status;
19913350d98dSKrishna Gudipati out:
19923350d98dSKrishna Gudipati 	return 0;
19933350d98dSKrishna Gudipati }
19943350d98dSKrishna Gudipati 
1995*3bbd8ef9SLee Jones static int
199661e62e21SKrishna Gudipati bfad_iocmd_porglog_get(struct bfad_s *bfad, void *cmd)
199761e62e21SKrishna Gudipati {
199861e62e21SKrishna Gudipati 	struct bfa_bsg_debug_s *iocmd = (struct bfa_bsg_debug_s *)cmd;
199961e62e21SKrishna Gudipati 	void *iocmd_bufptr;
200061e62e21SKrishna Gudipati 
200161e62e21SKrishna Gudipati 	if (iocmd->bufsz < sizeof(struct bfa_plog_s)) {
200261e62e21SKrishna Gudipati 		bfa_trc(bfad, sizeof(struct bfa_plog_s));
200361e62e21SKrishna Gudipati 		iocmd->status = BFA_STATUS_EINVAL;
200461e62e21SKrishna Gudipati 		goto out;
200561e62e21SKrishna Gudipati 	}
200661e62e21SKrishna Gudipati 
200761e62e21SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
200861e62e21SKrishna Gudipati 	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_debug_s);
200961e62e21SKrishna Gudipati 	memcpy(iocmd_bufptr, (u8 *) &bfad->plog_buf, sizeof(struct bfa_plog_s));
201061e62e21SKrishna Gudipati out:
201161e62e21SKrishna Gudipati 	return 0;
201261e62e21SKrishna Gudipati }
201361e62e21SKrishna Gudipati 
2014f2ee7601SKrishna Gudipati #define BFA_DEBUG_FW_CORE_CHUNK_SZ	0x4000U /* 16K chunks for FW dump */
2015*3bbd8ef9SLee Jones static int
2016f2ee7601SKrishna Gudipati bfad_iocmd_debug_fw_core(struct bfad_s *bfad, void *cmd,
2017f2ee7601SKrishna Gudipati 			unsigned int payload_len)
2018f2ee7601SKrishna Gudipati {
2019f2ee7601SKrishna Gudipati 	struct bfa_bsg_debug_s *iocmd = (struct bfa_bsg_debug_s *)cmd;
2020f2ee7601SKrishna Gudipati 	void	*iocmd_bufptr;
2021f2ee7601SKrishna Gudipati 	unsigned long	flags;
202276c8ae4bSSantosh Nayak 	u32 offset;
2023f2ee7601SKrishna Gudipati 
2024f2ee7601SKrishna Gudipati 	if (bfad_chk_iocmd_sz(payload_len, sizeof(struct bfa_bsg_debug_s),
2025f2ee7601SKrishna Gudipati 			BFA_DEBUG_FW_CORE_CHUNK_SZ) != BFA_STATUS_OK) {
2026f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_VERSION_FAIL;
2027f2ee7601SKrishna Gudipati 		return 0;
2028f2ee7601SKrishna Gudipati 	}
2029f2ee7601SKrishna Gudipati 
2030f2ee7601SKrishna Gudipati 	if (iocmd->bufsz < BFA_DEBUG_FW_CORE_CHUNK_SZ ||
2031f2ee7601SKrishna Gudipati 			!IS_ALIGNED(iocmd->bufsz, sizeof(u16)) ||
2032f2ee7601SKrishna Gudipati 			!IS_ALIGNED(iocmd->offset, sizeof(u32))) {
2033f2ee7601SKrishna Gudipati 		bfa_trc(bfad, BFA_DEBUG_FW_CORE_CHUNK_SZ);
2034f2ee7601SKrishna Gudipati 		iocmd->status = BFA_STATUS_EINVAL;
2035f2ee7601SKrishna Gudipati 		goto out;
2036f2ee7601SKrishna Gudipati 	}
2037f2ee7601SKrishna Gudipati 
2038f2ee7601SKrishna Gudipati 	iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_debug_s);
2039f2ee7601SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
204076c8ae4bSSantosh Nayak 	offset = iocmd->offset;
2041f2ee7601SKrishna Gudipati 	iocmd->status = bfa_ioc_debug_fwcore(&bfad->bfa.ioc, iocmd_bufptr,
204276c8ae4bSSantosh Nayak 				&offset, &iocmd->bufsz);
204376c8ae4bSSantosh Nayak 	iocmd->offset = offset;
2044f2ee7601SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2045f2ee7601SKrishna Gudipati out:
2046f2ee7601SKrishna Gudipati 	return 0;
2047f2ee7601SKrishna Gudipati }
2048f2ee7601SKrishna Gudipati 
2049*3bbd8ef9SLee Jones static int
2050f2ee7601SKrishna Gudipati bfad_iocmd_debug_ctl(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
2051f2ee7601SKrishna Gudipati {
2052f2ee7601SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
2053f2ee7601SKrishna Gudipati 	unsigned long	flags;
2054f2ee7601SKrishna Gudipati 
2055f2ee7601SKrishna Gudipati 	if (v_cmd == IOCMD_DEBUG_FW_STATE_CLR) {
2056f2ee7601SKrishna Gudipati 		spin_lock_irqsave(&bfad->bfad_lock, flags);
2057f2ee7601SKrishna Gudipati 		bfad->bfa.ioc.dbg_fwsave_once = BFA_TRUE;
2058f2ee7601SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2059f2ee7601SKrishna Gudipati 	} else if (v_cmd == IOCMD_DEBUG_PORTLOG_CLR)
2060f2ee7601SKrishna Gudipati 		bfad->plog_buf.head = bfad->plog_buf.tail = 0;
2061f2ee7601SKrishna Gudipati 	else if (v_cmd == IOCMD_DEBUG_START_DTRC)
2062f2ee7601SKrishna Gudipati 		bfa_trc_init(bfad->trcmod);
2063f2ee7601SKrishna Gudipati 	else if (v_cmd == IOCMD_DEBUG_STOP_DTRC)
2064f2ee7601SKrishna Gudipati 		bfa_trc_stop(bfad->trcmod);
2065f2ee7601SKrishna Gudipati 
2066f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
2067f2ee7601SKrishna Gudipati 	return 0;
2068f2ee7601SKrishna Gudipati }
2069f2ee7601SKrishna Gudipati 
2070*3bbd8ef9SLee Jones static int
2071f2ee7601SKrishna Gudipati bfad_iocmd_porglog_ctl(struct bfad_s *bfad, void *cmd)
2072f2ee7601SKrishna Gudipati {
2073f2ee7601SKrishna Gudipati 	struct bfa_bsg_portlogctl_s *iocmd = (struct bfa_bsg_portlogctl_s *)cmd;
2074f2ee7601SKrishna Gudipati 
2075f2ee7601SKrishna Gudipati 	if (iocmd->ctl == BFA_TRUE)
2076f2ee7601SKrishna Gudipati 		bfad->plog_buf.plog_enabled = 1;
2077f2ee7601SKrishna Gudipati 	else
2078f2ee7601SKrishna Gudipati 		bfad->plog_buf.plog_enabled = 0;
2079f2ee7601SKrishna Gudipati 
2080f2ee7601SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
2081f2ee7601SKrishna Gudipati 	return 0;
2082f2ee7601SKrishna Gudipati }
2083f2ee7601SKrishna Gudipati 
2084*3bbd8ef9SLee Jones static int
208542a8e6e2SKrishna Gudipati bfad_iocmd_fcpim_cfg_profile(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
208642a8e6e2SKrishna Gudipati {
208742a8e6e2SKrishna Gudipati 	struct bfa_bsg_fcpim_profile_s *iocmd =
208842a8e6e2SKrishna Gudipati 				(struct bfa_bsg_fcpim_profile_s *)cmd;
208942a8e6e2SKrishna Gudipati 	unsigned long	flags;
209042a8e6e2SKrishna Gudipati 
209142a8e6e2SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
209242a8e6e2SKrishna Gudipati 	if (v_cmd == IOCMD_FCPIM_PROFILE_ON)
2093aa22a52eSArnd Bergmann 		iocmd->status = bfa_fcpim_profile_on(&bfad->bfa, ktime_get_real_seconds());
209442a8e6e2SKrishna Gudipati 	else if (v_cmd == IOCMD_FCPIM_PROFILE_OFF)
209542a8e6e2SKrishna Gudipati 		iocmd->status = bfa_fcpim_profile_off(&bfad->bfa);
209642a8e6e2SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
209742a8e6e2SKrishna Gudipati 
209842a8e6e2SKrishna Gudipati 	return 0;
209942a8e6e2SKrishna Gudipati }
210042a8e6e2SKrishna Gudipati 
210142a8e6e2SKrishna Gudipati static int
210242a8e6e2SKrishna Gudipati bfad_iocmd_itnim_get_ioprofile(struct bfad_s *bfad, void *cmd)
210342a8e6e2SKrishna Gudipati {
210442a8e6e2SKrishna Gudipati 	struct bfa_bsg_itnim_ioprofile_s *iocmd =
210542a8e6e2SKrishna Gudipati 				(struct bfa_bsg_itnim_ioprofile_s *)cmd;
210642a8e6e2SKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
210742a8e6e2SKrishna Gudipati 	struct bfa_fcs_itnim_s *itnim;
210842a8e6e2SKrishna Gudipati 	unsigned long   flags;
210942a8e6e2SKrishna Gudipati 
211042a8e6e2SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
211142a8e6e2SKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
211242a8e6e2SKrishna Gudipati 				iocmd->vf_id, iocmd->lpwwn);
211342a8e6e2SKrishna Gudipati 	if (!fcs_port)
211442a8e6e2SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
211542a8e6e2SKrishna Gudipati 	else {
211642a8e6e2SKrishna Gudipati 		itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
211742a8e6e2SKrishna Gudipati 		if (itnim == NULL)
211842a8e6e2SKrishna Gudipati 			iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
211942a8e6e2SKrishna Gudipati 		else
212042a8e6e2SKrishna Gudipati 			iocmd->status = bfa_itnim_get_ioprofile(
212142a8e6e2SKrishna Gudipati 						bfa_fcs_itnim_get_halitn(itnim),
212242a8e6e2SKrishna Gudipati 						&iocmd->ioprofile);
212342a8e6e2SKrishna Gudipati 	}
212442a8e6e2SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
212542a8e6e2SKrishna Gudipati 	return 0;
212642a8e6e2SKrishna Gudipati }
212742a8e6e2SKrishna Gudipati 
2128*3bbd8ef9SLee Jones static int
212937ea0558SKrishna Gudipati bfad_iocmd_fcport_get_stats(struct bfad_s *bfad, void *cmd)
213037ea0558SKrishna Gudipati {
213137ea0558SKrishna Gudipati 	struct bfa_bsg_fcport_stats_s *iocmd =
213237ea0558SKrishna Gudipati 				(struct bfa_bsg_fcport_stats_s *)cmd;
213337ea0558SKrishna Gudipati 	struct bfad_hal_comp fcomp;
213437ea0558SKrishna Gudipati 	unsigned long	flags;
213537ea0558SKrishna Gudipati 	struct bfa_cb_pending_q_s cb_qe;
213637ea0558SKrishna Gudipati 
213737ea0558SKrishna Gudipati 	init_completion(&fcomp.comp);
213837ea0558SKrishna Gudipati 	bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
213937ea0558SKrishna Gudipati 			   &fcomp, &iocmd->stats);
214037ea0558SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
214137ea0558SKrishna Gudipati 	iocmd->status = bfa_fcport_get_stats(&bfad->bfa, &cb_qe);
214237ea0558SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
214337ea0558SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
214437ea0558SKrishna Gudipati 		bfa_trc(bfad, iocmd->status);
214537ea0558SKrishna Gudipati 		goto out;
214637ea0558SKrishna Gudipati 	}
214737ea0558SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
214837ea0558SKrishna Gudipati 	iocmd->status = fcomp.status;
214937ea0558SKrishna Gudipati out:
215037ea0558SKrishna Gudipati 	return 0;
215137ea0558SKrishna Gudipati }
215237ea0558SKrishna Gudipati 
2153*3bbd8ef9SLee Jones static int
215437ea0558SKrishna Gudipati bfad_iocmd_fcport_reset_stats(struct bfad_s *bfad, void *cmd)
215537ea0558SKrishna Gudipati {
215637ea0558SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
215737ea0558SKrishna Gudipati 	struct bfad_hal_comp fcomp;
215837ea0558SKrishna Gudipati 	unsigned long	flags;
215937ea0558SKrishna Gudipati 	struct bfa_cb_pending_q_s cb_qe;
216037ea0558SKrishna Gudipati 
216137ea0558SKrishna Gudipati 	init_completion(&fcomp.comp);
216237ea0558SKrishna Gudipati 	bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, &fcomp, NULL);
216337ea0558SKrishna Gudipati 
216437ea0558SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
216537ea0558SKrishna Gudipati 	iocmd->status = bfa_fcport_clear_stats(&bfad->bfa, &cb_qe);
216637ea0558SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
216737ea0558SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
216837ea0558SKrishna Gudipati 		bfa_trc(bfad, iocmd->status);
216937ea0558SKrishna Gudipati 		goto out;
217037ea0558SKrishna Gudipati 	}
217137ea0558SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
217237ea0558SKrishna Gudipati 	iocmd->status = fcomp.status;
217337ea0558SKrishna Gudipati out:
217437ea0558SKrishna Gudipati 	return 0;
217537ea0558SKrishna Gudipati }
217637ea0558SKrishna Gudipati 
2177*3bbd8ef9SLee Jones static int
2178a46bd300SKrishna Gudipati bfad_iocmd_boot_cfg(struct bfad_s *bfad, void *cmd)
2179a46bd300SKrishna Gudipati {
2180a46bd300SKrishna Gudipati 	struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd;
2181a46bd300SKrishna Gudipati 	struct bfad_hal_comp fcomp;
2182a46bd300SKrishna Gudipati 	unsigned long	flags;
2183a46bd300SKrishna Gudipati 
2184a46bd300SKrishna Gudipati 	init_completion(&fcomp.comp);
2185a46bd300SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2186a46bd300SKrishna Gudipati 	iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
21871a1297c6SKrishna Gudipati 			BFA_FLASH_PART_BOOT, bfad->bfa.ioc.port_id,
2188a46bd300SKrishna Gudipati 			&iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0,
2189a46bd300SKrishna Gudipati 			bfad_hcb_comp, &fcomp);
2190a46bd300SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2191a46bd300SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
2192a46bd300SKrishna Gudipati 		goto out;
2193a46bd300SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
2194a46bd300SKrishna Gudipati 	iocmd->status = fcomp.status;
2195a46bd300SKrishna Gudipati out:
2196a46bd300SKrishna Gudipati 	return 0;
2197a46bd300SKrishna Gudipati }
2198a46bd300SKrishna Gudipati 
2199*3bbd8ef9SLee Jones static int
2200a46bd300SKrishna Gudipati bfad_iocmd_boot_query(struct bfad_s *bfad, void *cmd)
2201a46bd300SKrishna Gudipati {
2202a46bd300SKrishna Gudipati 	struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd;
2203a46bd300SKrishna Gudipati 	struct bfad_hal_comp fcomp;
2204a46bd300SKrishna Gudipati 	unsigned long	flags;
2205a46bd300SKrishna Gudipati 
2206a46bd300SKrishna Gudipati 	init_completion(&fcomp.comp);
2207a46bd300SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2208a46bd300SKrishna Gudipati 	iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa),
22091a1297c6SKrishna Gudipati 			BFA_FLASH_PART_BOOT, bfad->bfa.ioc.port_id,
2210a46bd300SKrishna Gudipati 			&iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0,
2211a46bd300SKrishna Gudipati 			bfad_hcb_comp, &fcomp);
2212a46bd300SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2213a46bd300SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
2214a46bd300SKrishna Gudipati 		goto out;
2215a46bd300SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
2216a46bd300SKrishna Gudipati 	iocmd->status = fcomp.status;
2217a46bd300SKrishna Gudipati out:
2218a46bd300SKrishna Gudipati 	return 0;
2219a46bd300SKrishna Gudipati }
2220a46bd300SKrishna Gudipati 
2221*3bbd8ef9SLee Jones static int
2222a46bd300SKrishna Gudipati bfad_iocmd_preboot_query(struct bfad_s *bfad, void *cmd)
2223a46bd300SKrishna Gudipati {
2224a46bd300SKrishna Gudipati 	struct bfa_bsg_preboot_s *iocmd = (struct bfa_bsg_preboot_s *)cmd;
2225a46bd300SKrishna Gudipati 	struct bfi_iocfc_cfgrsp_s *cfgrsp = bfad->bfa.iocfc.cfgrsp;
2226a46bd300SKrishna Gudipati 	struct bfa_boot_pbc_s *pbcfg = &iocmd->cfg;
2227a46bd300SKrishna Gudipati 	unsigned long	flags;
2228a46bd300SKrishna Gudipati 
2229a46bd300SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2230a46bd300SKrishna Gudipati 	pbcfg->enable = cfgrsp->pbc_cfg.boot_enabled;
2231a46bd300SKrishna Gudipati 	pbcfg->nbluns = cfgrsp->pbc_cfg.nbluns;
2232a46bd300SKrishna Gudipati 	pbcfg->speed = cfgrsp->pbc_cfg.port_speed;
2233a46bd300SKrishna Gudipati 	memcpy(pbcfg->pblun, cfgrsp->pbc_cfg.blun, sizeof(pbcfg->pblun));
2234a46bd300SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
2235a46bd300SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2236a46bd300SKrishna Gudipati 
2237a46bd300SKrishna Gudipati 	return 0;
2238a46bd300SKrishna Gudipati }
2239a46bd300SKrishna Gudipati 
2240*3bbd8ef9SLee Jones static int
2241a46bd300SKrishna Gudipati bfad_iocmd_ethboot_cfg(struct bfad_s *bfad, void *cmd)
2242a46bd300SKrishna Gudipati {
2243a46bd300SKrishna Gudipati 	struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd;
2244a46bd300SKrishna Gudipati 	struct bfad_hal_comp fcomp;
2245a46bd300SKrishna Gudipati 	unsigned long	flags;
2246a46bd300SKrishna Gudipati 
2247a46bd300SKrishna Gudipati 	init_completion(&fcomp.comp);
2248a46bd300SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2249a46bd300SKrishna Gudipati 	iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
2250a46bd300SKrishna Gudipati 				BFA_FLASH_PART_PXECFG,
2251a46bd300SKrishna Gudipati 				bfad->bfa.ioc.port_id, &iocmd->cfg,
2252a46bd300SKrishna Gudipati 				sizeof(struct bfa_ethboot_cfg_s), 0,
2253a46bd300SKrishna Gudipati 				bfad_hcb_comp, &fcomp);
2254a46bd300SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2255a46bd300SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
2256a46bd300SKrishna Gudipati 		goto out;
2257a46bd300SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
2258a46bd300SKrishna Gudipati 	iocmd->status = fcomp.status;
2259a46bd300SKrishna Gudipati out:
2260a46bd300SKrishna Gudipati 	return 0;
2261a46bd300SKrishna Gudipati }
2262a46bd300SKrishna Gudipati 
2263*3bbd8ef9SLee Jones static int
2264a46bd300SKrishna Gudipati bfad_iocmd_ethboot_query(struct bfad_s *bfad, void *cmd)
2265a46bd300SKrishna Gudipati {
2266a46bd300SKrishna Gudipati 	struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd;
2267a46bd300SKrishna Gudipati 	struct bfad_hal_comp fcomp;
2268a46bd300SKrishna Gudipati 	unsigned long	flags;
2269a46bd300SKrishna Gudipati 
2270a46bd300SKrishna Gudipati 	init_completion(&fcomp.comp);
2271a46bd300SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2272a46bd300SKrishna Gudipati 	iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa),
2273a46bd300SKrishna Gudipati 				BFA_FLASH_PART_PXECFG,
2274a46bd300SKrishna Gudipati 				bfad->bfa.ioc.port_id, &iocmd->cfg,
2275a46bd300SKrishna Gudipati 				sizeof(struct bfa_ethboot_cfg_s), 0,
2276a46bd300SKrishna Gudipati 				bfad_hcb_comp, &fcomp);
2277a46bd300SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2278a46bd300SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK)
2279a46bd300SKrishna Gudipati 		goto out;
2280a46bd300SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
2281a46bd300SKrishna Gudipati 	iocmd->status = fcomp.status;
2282a46bd300SKrishna Gudipati out:
2283a46bd300SKrishna Gudipati 	return 0;
2284a46bd300SKrishna Gudipati }
2285a46bd300SKrishna Gudipati 
2286*3bbd8ef9SLee Jones static int
228745191236SKrishna Gudipati bfad_iocmd_cfg_trunk(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
228845191236SKrishna Gudipati {
228945191236SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
229045191236SKrishna Gudipati 	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
229145191236SKrishna Gudipati 	struct bfa_fcport_trunk_s *trunk = &fcport->trunk;
229245191236SKrishna Gudipati 	unsigned long	flags;
229345191236SKrishna Gudipati 
229445191236SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
229545191236SKrishna Gudipati 
2296e39a8b4fSWei Yongjun 	if (bfa_fcport_is_dport(&bfad->bfa)) {
2297e39a8b4fSWei Yongjun 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2298e353546eSKrishna Gudipati 		return BFA_STATUS_DPORT_ERR;
2299e39a8b4fSWei Yongjun 	}
2300e353546eSKrishna Gudipati 
2301bc0e2c2aSKrishna Gudipati 	if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) ||
2302bc0e2c2aSKrishna Gudipati 		(fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2303bc0e2c2aSKrishna Gudipati 		iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2304bc0e2c2aSKrishna Gudipati 	else {
230545191236SKrishna Gudipati 		if (v_cmd == IOCMD_TRUNK_ENABLE) {
230645191236SKrishna Gudipati 			trunk->attr.state = BFA_TRUNK_OFFLINE;
230745191236SKrishna Gudipati 			bfa_fcport_disable(&bfad->bfa);
230845191236SKrishna Gudipati 			fcport->cfg.trunked = BFA_TRUE;
230945191236SKrishna Gudipati 		} else if (v_cmd == IOCMD_TRUNK_DISABLE) {
231045191236SKrishna Gudipati 			trunk->attr.state = BFA_TRUNK_DISABLED;
231145191236SKrishna Gudipati 			bfa_fcport_disable(&bfad->bfa);
231245191236SKrishna Gudipati 			fcport->cfg.trunked = BFA_FALSE;
231345191236SKrishna Gudipati 		}
231445191236SKrishna Gudipati 
231545191236SKrishna Gudipati 		if (!bfa_fcport_is_disabled(&bfad->bfa))
231645191236SKrishna Gudipati 			bfa_fcport_enable(&bfad->bfa);
231745191236SKrishna Gudipati 
2318bc0e2c2aSKrishna Gudipati 		iocmd->status = BFA_STATUS_OK;
2319bc0e2c2aSKrishna Gudipati 	}
2320bc0e2c2aSKrishna Gudipati 
232145191236SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
232245191236SKrishna Gudipati 
232345191236SKrishna Gudipati 	return 0;
232445191236SKrishna Gudipati }
232545191236SKrishna Gudipati 
2326*3bbd8ef9SLee Jones static int
232745191236SKrishna Gudipati bfad_iocmd_trunk_get_attr(struct bfad_s *bfad, void *cmd)
232845191236SKrishna Gudipati {
232945191236SKrishna Gudipati 	struct bfa_bsg_trunk_attr_s *iocmd = (struct bfa_bsg_trunk_attr_s *)cmd;
233045191236SKrishna Gudipati 	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
233145191236SKrishna Gudipati 	struct bfa_fcport_trunk_s *trunk = &fcport->trunk;
233245191236SKrishna Gudipati 	unsigned long	flags;
233345191236SKrishna Gudipati 
233445191236SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2335bc0e2c2aSKrishna Gudipati 	if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) ||
2336bc0e2c2aSKrishna Gudipati 		(fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2337bc0e2c2aSKrishna Gudipati 		iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2338bc0e2c2aSKrishna Gudipati 	else {
233945191236SKrishna Gudipati 		memcpy((void *)&iocmd->attr, (void *)&trunk->attr,
234045191236SKrishna Gudipati 			sizeof(struct bfa_trunk_attr_s));
234145191236SKrishna Gudipati 		iocmd->attr.port_id = bfa_lps_get_base_pid(&bfad->bfa);
2342bc0e2c2aSKrishna Gudipati 		iocmd->status = BFA_STATUS_OK;
2343bc0e2c2aSKrishna Gudipati 	}
234445191236SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
234545191236SKrishna Gudipati 
234645191236SKrishna Gudipati 	return 0;
234745191236SKrishna Gudipati }
234845191236SKrishna Gudipati 
2349*3bbd8ef9SLee Jones static int
23503ec4f2c8SKrishna Gudipati bfad_iocmd_qos(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
23513ec4f2c8SKrishna Gudipati {
23523ec4f2c8SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
23533ec4f2c8SKrishna Gudipati 	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
23543ec4f2c8SKrishna Gudipati 	unsigned long	flags;
23553ec4f2c8SKrishna Gudipati 
23563ec4f2c8SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
23573ec4f2c8SKrishna Gudipati 	if (bfa_ioc_get_type(&bfad->bfa.ioc) == BFA_IOC_TYPE_FC) {
2358bc0e2c2aSKrishna Gudipati 		if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
2359bc0e2c2aSKrishna Gudipati 		(fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2360bc0e2c2aSKrishna Gudipati 			iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2361bc0e2c2aSKrishna Gudipati 		else {
23623ec4f2c8SKrishna Gudipati 			if (v_cmd == IOCMD_QOS_ENABLE)
23633ec4f2c8SKrishna Gudipati 				fcport->cfg.qos_enabled = BFA_TRUE;
23646894f013SKrishna Gudipati 			else if (v_cmd == IOCMD_QOS_DISABLE) {
23653ec4f2c8SKrishna Gudipati 				fcport->cfg.qos_enabled = BFA_FALSE;
23666894f013SKrishna Gudipati 				fcport->cfg.qos_bw.high = BFA_QOS_BW_HIGH;
23676894f013SKrishna Gudipati 				fcport->cfg.qos_bw.med = BFA_QOS_BW_MED;
23686894f013SKrishna Gudipati 				fcport->cfg.qos_bw.low = BFA_QOS_BW_LOW;
23696894f013SKrishna Gudipati 			}
23703ec4f2c8SKrishna Gudipati 		}
2371bc0e2c2aSKrishna Gudipati 	}
23723ec4f2c8SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
23733ec4f2c8SKrishna Gudipati 
23743ec4f2c8SKrishna Gudipati 	return 0;
23753ec4f2c8SKrishna Gudipati }
23763ec4f2c8SKrishna Gudipati 
2377*3bbd8ef9SLee Jones static int
23783ec4f2c8SKrishna Gudipati bfad_iocmd_qos_get_attr(struct bfad_s *bfad, void *cmd)
23793ec4f2c8SKrishna Gudipati {
23803ec4f2c8SKrishna Gudipati 	struct bfa_bsg_qos_attr_s *iocmd = (struct bfa_bsg_qos_attr_s *)cmd;
23813ec4f2c8SKrishna Gudipati 	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
23823ec4f2c8SKrishna Gudipati 	unsigned long	flags;
23833ec4f2c8SKrishna Gudipati 
23843ec4f2c8SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2385bc0e2c2aSKrishna Gudipati 	if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
2386bc0e2c2aSKrishna Gudipati 		(fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2387bc0e2c2aSKrishna Gudipati 		iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2388bc0e2c2aSKrishna Gudipati 	else {
23893ec4f2c8SKrishna Gudipati 		iocmd->attr.state = fcport->qos_attr.state;
2390bc0e2c2aSKrishna Gudipati 		iocmd->attr.total_bb_cr =
2391bc0e2c2aSKrishna Gudipati 			be32_to_cpu(fcport->qos_attr.total_bb_cr);
23926894f013SKrishna Gudipati 		iocmd->attr.qos_bw.high = fcport->cfg.qos_bw.high;
23936894f013SKrishna Gudipati 		iocmd->attr.qos_bw.med = fcport->cfg.qos_bw.med;
23946894f013SKrishna Gudipati 		iocmd->attr.qos_bw.low = fcport->cfg.qos_bw.low;
23956894f013SKrishna Gudipati 		iocmd->attr.qos_bw_op = fcport->qos_attr.qos_bw_op;
2396bc0e2c2aSKrishna Gudipati 		iocmd->status = BFA_STATUS_OK;
2397bc0e2c2aSKrishna Gudipati 	}
23983ec4f2c8SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
23993ec4f2c8SKrishna Gudipati 
24003ec4f2c8SKrishna Gudipati 	return 0;
24013ec4f2c8SKrishna Gudipati }
24023ec4f2c8SKrishna Gudipati 
2403*3bbd8ef9SLee Jones static int
24043ec4f2c8SKrishna Gudipati bfad_iocmd_qos_get_vc_attr(struct bfad_s *bfad, void *cmd)
24053ec4f2c8SKrishna Gudipati {
24063ec4f2c8SKrishna Gudipati 	struct bfa_bsg_qos_vc_attr_s *iocmd =
24073ec4f2c8SKrishna Gudipati 				(struct bfa_bsg_qos_vc_attr_s *)cmd;
24083ec4f2c8SKrishna Gudipati 	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
24093ec4f2c8SKrishna Gudipati 	struct bfa_qos_vc_attr_s *bfa_vc_attr = &fcport->qos_vc_attr;
24103ec4f2c8SKrishna Gudipati 	unsigned long	flags;
24113ec4f2c8SKrishna Gudipati 	u32	i = 0;
24123ec4f2c8SKrishna Gudipati 
24133ec4f2c8SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
24143ec4f2c8SKrishna Gudipati 	iocmd->attr.total_vc_count = be16_to_cpu(bfa_vc_attr->total_vc_count);
24153ec4f2c8SKrishna Gudipati 	iocmd->attr.shared_credit  = be16_to_cpu(bfa_vc_attr->shared_credit);
24163ec4f2c8SKrishna Gudipati 	iocmd->attr.elp_opmode_flags  =
24173ec4f2c8SKrishna Gudipati 				be32_to_cpu(bfa_vc_attr->elp_opmode_flags);
24183ec4f2c8SKrishna Gudipati 
24193ec4f2c8SKrishna Gudipati 	/* Individual VC info */
24203ec4f2c8SKrishna Gudipati 	while (i < iocmd->attr.total_vc_count) {
24213ec4f2c8SKrishna Gudipati 		iocmd->attr.vc_info[i].vc_credit =
24223ec4f2c8SKrishna Gudipati 				bfa_vc_attr->vc_info[i].vc_credit;
24233ec4f2c8SKrishna Gudipati 		iocmd->attr.vc_info[i].borrow_credit =
24243ec4f2c8SKrishna Gudipati 				bfa_vc_attr->vc_info[i].borrow_credit;
24253ec4f2c8SKrishna Gudipati 		iocmd->attr.vc_info[i].priority =
24263ec4f2c8SKrishna Gudipati 				bfa_vc_attr->vc_info[i].priority;
24273ec4f2c8SKrishna Gudipati 		i++;
24283ec4f2c8SKrishna Gudipati 	}
24293ec4f2c8SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
24303ec4f2c8SKrishna Gudipati 
24313ec4f2c8SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
24323ec4f2c8SKrishna Gudipati 	return 0;
24333ec4f2c8SKrishna Gudipati }
24343ec4f2c8SKrishna Gudipati 
2435*3bbd8ef9SLee Jones static int
24363ec4f2c8SKrishna Gudipati bfad_iocmd_qos_get_stats(struct bfad_s *bfad, void *cmd)
24373ec4f2c8SKrishna Gudipati {
24383ec4f2c8SKrishna Gudipati 	struct bfa_bsg_fcport_stats_s *iocmd =
24393ec4f2c8SKrishna Gudipati 				(struct bfa_bsg_fcport_stats_s *)cmd;
24403ec4f2c8SKrishna Gudipati 	struct bfad_hal_comp fcomp;
24413ec4f2c8SKrishna Gudipati 	unsigned long	flags;
24423ec4f2c8SKrishna Gudipati 	struct bfa_cb_pending_q_s cb_qe;
2443bc0e2c2aSKrishna Gudipati 	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
24443ec4f2c8SKrishna Gudipati 
24453ec4f2c8SKrishna Gudipati 	init_completion(&fcomp.comp);
24463ec4f2c8SKrishna Gudipati 	bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
24473ec4f2c8SKrishna Gudipati 			   &fcomp, &iocmd->stats);
24483ec4f2c8SKrishna Gudipati 
24493ec4f2c8SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
24503ec4f2c8SKrishna Gudipati 	WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc));
2451bc0e2c2aSKrishna Gudipati 	if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
2452bc0e2c2aSKrishna Gudipati 		(fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2453bc0e2c2aSKrishna Gudipati 		iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2454bc0e2c2aSKrishna Gudipati 	else
24553ec4f2c8SKrishna Gudipati 		iocmd->status = bfa_fcport_get_stats(&bfad->bfa, &cb_qe);
24563ec4f2c8SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
24573ec4f2c8SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
24583ec4f2c8SKrishna Gudipati 		bfa_trc(bfad, iocmd->status);
24593ec4f2c8SKrishna Gudipati 		goto out;
24603ec4f2c8SKrishna Gudipati 	}
24613ec4f2c8SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
24623ec4f2c8SKrishna Gudipati 	iocmd->status = fcomp.status;
24633ec4f2c8SKrishna Gudipati out:
24643ec4f2c8SKrishna Gudipati 	return 0;
24653ec4f2c8SKrishna Gudipati }
24663ec4f2c8SKrishna Gudipati 
2467*3bbd8ef9SLee Jones static int
24683ec4f2c8SKrishna Gudipati bfad_iocmd_qos_reset_stats(struct bfad_s *bfad, void *cmd)
24693ec4f2c8SKrishna Gudipati {
24703ec4f2c8SKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
24713ec4f2c8SKrishna Gudipati 	struct bfad_hal_comp fcomp;
24723ec4f2c8SKrishna Gudipati 	unsigned long	flags;
24733ec4f2c8SKrishna Gudipati 	struct bfa_cb_pending_q_s cb_qe;
2474bc0e2c2aSKrishna Gudipati 	struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
24753ec4f2c8SKrishna Gudipati 
24763ec4f2c8SKrishna Gudipati 	init_completion(&fcomp.comp);
24773ec4f2c8SKrishna Gudipati 	bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
24783ec4f2c8SKrishna Gudipati 			   &fcomp, NULL);
24793ec4f2c8SKrishna Gudipati 
24803ec4f2c8SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
24813ec4f2c8SKrishna Gudipati 	WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc));
2482bc0e2c2aSKrishna Gudipati 	if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
2483bc0e2c2aSKrishna Gudipati 		(fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2484bc0e2c2aSKrishna Gudipati 		iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2485bc0e2c2aSKrishna Gudipati 	else
24863ec4f2c8SKrishna Gudipati 		iocmd->status = bfa_fcport_clear_stats(&bfad->bfa, &cb_qe);
24873ec4f2c8SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
24883ec4f2c8SKrishna Gudipati 	if (iocmd->status != BFA_STATUS_OK) {
24893ec4f2c8SKrishna Gudipati 		bfa_trc(bfad, iocmd->status);
24903ec4f2c8SKrishna Gudipati 		goto out;
24913ec4f2c8SKrishna Gudipati 	}
24923ec4f2c8SKrishna Gudipati 	wait_for_completion(&fcomp.comp);
24933ec4f2c8SKrishna Gudipati 	iocmd->status = fcomp.status;
24943ec4f2c8SKrishna Gudipati out:
24953ec4f2c8SKrishna Gudipati 	return 0;
24963ec4f2c8SKrishna Gudipati }
24973ec4f2c8SKrishna Gudipati 
2498*3bbd8ef9SLee Jones static int
2499c0350bf5SKrishna Gudipati bfad_iocmd_vf_get_stats(struct bfad_s *bfad, void *cmd)
2500c0350bf5SKrishna Gudipati {
2501c0350bf5SKrishna Gudipati 	struct bfa_bsg_vf_stats_s *iocmd =
2502c0350bf5SKrishna Gudipati 			(struct bfa_bsg_vf_stats_s *)cmd;
2503c0350bf5SKrishna Gudipati 	struct bfa_fcs_fabric_s	*fcs_vf;
2504c0350bf5SKrishna Gudipati 	unsigned long	flags;
2505c0350bf5SKrishna Gudipati 
2506c0350bf5SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2507c0350bf5SKrishna Gudipati 	fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id);
2508c0350bf5SKrishna Gudipati 	if (fcs_vf == NULL) {
2509c0350bf5SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2510c0350bf5SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_VFID;
2511c0350bf5SKrishna Gudipati 		goto out;
2512c0350bf5SKrishna Gudipati 	}
2513c0350bf5SKrishna Gudipati 	memcpy((void *)&iocmd->stats, (void *)&fcs_vf->stats,
2514c0350bf5SKrishna Gudipati 		sizeof(struct bfa_vf_stats_s));
2515c0350bf5SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2516c0350bf5SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
2517c0350bf5SKrishna Gudipati out:
2518c0350bf5SKrishna Gudipati 	return 0;
2519c0350bf5SKrishna Gudipati }
2520c0350bf5SKrishna Gudipati 
2521*3bbd8ef9SLee Jones static int
2522c0350bf5SKrishna Gudipati bfad_iocmd_vf_clr_stats(struct bfad_s *bfad, void *cmd)
2523c0350bf5SKrishna Gudipati {
2524c0350bf5SKrishna Gudipati 	struct bfa_bsg_vf_reset_stats_s *iocmd =
2525c0350bf5SKrishna Gudipati 			(struct bfa_bsg_vf_reset_stats_s *)cmd;
2526c0350bf5SKrishna Gudipati 	struct bfa_fcs_fabric_s	*fcs_vf;
2527c0350bf5SKrishna Gudipati 	unsigned long	flags;
2528c0350bf5SKrishna Gudipati 
2529c0350bf5SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2530c0350bf5SKrishna Gudipati 	fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id);
2531c0350bf5SKrishna Gudipati 	if (fcs_vf == NULL) {
2532c0350bf5SKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2533c0350bf5SKrishna Gudipati 		iocmd->status = BFA_STATUS_UNKNOWN_VFID;
2534c0350bf5SKrishna Gudipati 		goto out;
2535c0350bf5SKrishna Gudipati 	}
2536c0350bf5SKrishna Gudipati 	memset((void *)&fcs_vf->stats, 0, sizeof(struct bfa_vf_stats_s));
2537c0350bf5SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2538c0350bf5SKrishna Gudipati 	iocmd->status = BFA_STATUS_OK;
2539c0350bf5SKrishna Gudipati out:
2540c0350bf5SKrishna Gudipati 	return 0;
2541c0350bf5SKrishna Gudipati }
2542c0350bf5SKrishna Gudipati 
25435b7db7afSKrishna Gudipati /* Function to reset the LUN SCAN mode */
25445b7db7afSKrishna Gudipati static void
25455b7db7afSKrishna Gudipati bfad_iocmd_lunmask_reset_lunscan_mode(struct bfad_s *bfad, int lunmask_cfg)
25465b7db7afSKrishna Gudipati {
25475b7db7afSKrishna Gudipati 	struct bfad_im_port_s *pport_im = bfad->pport.im_port;
25485b7db7afSKrishna Gudipati 	struct bfad_vport_s *vport = NULL;
25495b7db7afSKrishna Gudipati 
25505b7db7afSKrishna Gudipati 	/* Set the scsi device LUN SCAN flags for base port */
25515b7db7afSKrishna Gudipati 	bfad_reset_sdev_bflags(pport_im, lunmask_cfg);
25525b7db7afSKrishna Gudipati 
25535b7db7afSKrishna Gudipati 	/* Set the scsi device LUN SCAN flags for the vports */
25545b7db7afSKrishna Gudipati 	list_for_each_entry(vport, &bfad->vport_list, list_entry)
25555b7db7afSKrishna Gudipati 		bfad_reset_sdev_bflags(vport->drv_port.im_port, lunmask_cfg);
25565b7db7afSKrishna Gudipati }
25575b7db7afSKrishna Gudipati 
2558*3bbd8ef9SLee Jones static int
25594c5d22bfSKrishna Gudipati bfad_iocmd_lunmask(struct bfad_s *bfad, void *pcmd, unsigned int v_cmd)
25604c5d22bfSKrishna Gudipati {
25614c5d22bfSKrishna Gudipati 	struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
25624c5d22bfSKrishna Gudipati 	unsigned long	flags;
25634c5d22bfSKrishna Gudipati 
25644c5d22bfSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
25655b7db7afSKrishna Gudipati 	if (v_cmd == IOCMD_FCPIM_LUNMASK_ENABLE) {
25664c5d22bfSKrishna Gudipati 		iocmd->status = bfa_fcpim_lunmask_update(&bfad->bfa, BFA_TRUE);
25675b7db7afSKrishna Gudipati 		/* Set the LUN Scanning mode to be Sequential scan */
25685b7db7afSKrishna Gudipati 		if (iocmd->status == BFA_STATUS_OK)
25695b7db7afSKrishna Gudipati 			bfad_iocmd_lunmask_reset_lunscan_mode(bfad, BFA_TRUE);
25705b7db7afSKrishna Gudipati 	} else if (v_cmd == IOCMD_FCPIM_LUNMASK_DISABLE) {
25714c5d22bfSKrishna Gudipati 		iocmd->status = bfa_fcpim_lunmask_update(&bfad->bfa, BFA_FALSE);
25725b7db7afSKrishna Gudipati 		/* Set the LUN Scanning mode to default REPORT_LUNS scan */
25735b7db7afSKrishna Gudipati 		if (iocmd->status == BFA_STATUS_OK)
25745b7db7afSKrishna Gudipati 			bfad_iocmd_lunmask_reset_lunscan_mode(bfad, BFA_FALSE);
25755b7db7afSKrishna Gudipati 	} else if (v_cmd == IOCMD_FCPIM_LUNMASK_CLEAR)
25764c5d22bfSKrishna Gudipati 		iocmd->status = bfa_fcpim_lunmask_clear(&bfad->bfa);
25774c5d22bfSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
25784c5d22bfSKrishna Gudipati 	return 0;
25794c5d22bfSKrishna Gudipati }
25804c5d22bfSKrishna Gudipati 
2581*3bbd8ef9SLee Jones static int
25824c5d22bfSKrishna Gudipati bfad_iocmd_fcpim_lunmask_query(struct bfad_s *bfad, void *cmd)
25834c5d22bfSKrishna Gudipati {
25844c5d22bfSKrishna Gudipati 	struct bfa_bsg_fcpim_lunmask_query_s *iocmd =
25854c5d22bfSKrishna Gudipati 			(struct bfa_bsg_fcpim_lunmask_query_s *)cmd;
25864c5d22bfSKrishna Gudipati 	struct bfa_lunmask_cfg_s *lun_mask = &iocmd->lun_mask;
25874c5d22bfSKrishna Gudipati 	unsigned long	flags;
25884c5d22bfSKrishna Gudipati 
25894c5d22bfSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
25904c5d22bfSKrishna Gudipati 	iocmd->status = bfa_fcpim_lunmask_query(&bfad->bfa, lun_mask);
25914c5d22bfSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
25924c5d22bfSKrishna Gudipati 	return 0;
25934c5d22bfSKrishna Gudipati }
25944c5d22bfSKrishna Gudipati 
2595*3bbd8ef9SLee Jones static int
25964c5d22bfSKrishna Gudipati bfad_iocmd_fcpim_cfg_lunmask(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
25974c5d22bfSKrishna Gudipati {
25984c5d22bfSKrishna Gudipati 	struct bfa_bsg_fcpim_lunmask_s *iocmd =
25994c5d22bfSKrishna Gudipati 				(struct bfa_bsg_fcpim_lunmask_s *)cmd;
26004c5d22bfSKrishna Gudipati 	unsigned long	flags;
26014c5d22bfSKrishna Gudipati 
26024c5d22bfSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
26034c5d22bfSKrishna Gudipati 	if (v_cmd == IOCMD_FCPIM_LUNMASK_ADD)
26044c5d22bfSKrishna Gudipati 		iocmd->status = bfa_fcpim_lunmask_add(&bfad->bfa, iocmd->vf_id,
26054c5d22bfSKrishna Gudipati 					&iocmd->pwwn, iocmd->rpwwn, iocmd->lun);
26064c5d22bfSKrishna Gudipati 	else if (v_cmd == IOCMD_FCPIM_LUNMASK_DELETE)
26074c5d22bfSKrishna Gudipati 		iocmd->status = bfa_fcpim_lunmask_delete(&bfad->bfa,
26084c5d22bfSKrishna Gudipati 					iocmd->vf_id, &iocmd->pwwn,
26094c5d22bfSKrishna Gudipati 					iocmd->rpwwn, iocmd->lun);
26104c5d22bfSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
26114c5d22bfSKrishna Gudipati 	return 0;
26124c5d22bfSKrishna Gudipati }
26134c5d22bfSKrishna Gudipati 
2614*3bbd8ef9SLee Jones static int
26157ace27aeSKrishna Gudipati bfad_iocmd_fcpim_throttle_query(struct bfad_s *bfad, void *cmd)
26167ace27aeSKrishna Gudipati {
26177ace27aeSKrishna Gudipati 	struct bfa_bsg_fcpim_throttle_s *iocmd =
26187ace27aeSKrishna Gudipati 			(struct bfa_bsg_fcpim_throttle_s *)cmd;
26197ace27aeSKrishna Gudipati 	unsigned long   flags;
26207ace27aeSKrishna Gudipati 
26217ace27aeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
26227ace27aeSKrishna Gudipati 	iocmd->status = bfa_fcpim_throttle_get(&bfad->bfa,
26237ace27aeSKrishna Gudipati 				(void *)&iocmd->throttle);
26247ace27aeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
26257ace27aeSKrishna Gudipati 
26267ace27aeSKrishna Gudipati 	return 0;
26277ace27aeSKrishna Gudipati }
26287ace27aeSKrishna Gudipati 
2629*3bbd8ef9SLee Jones static int
26307ace27aeSKrishna Gudipati bfad_iocmd_fcpim_throttle_set(struct bfad_s *bfad, void *cmd)
26317ace27aeSKrishna Gudipati {
26327ace27aeSKrishna Gudipati 	struct bfa_bsg_fcpim_throttle_s *iocmd =
26337ace27aeSKrishna Gudipati 			(struct bfa_bsg_fcpim_throttle_s *)cmd;
26347ace27aeSKrishna Gudipati 	unsigned long	flags;
26357ace27aeSKrishna Gudipati 
26367ace27aeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
26377ace27aeSKrishna Gudipati 	iocmd->status = bfa_fcpim_throttle_set(&bfad->bfa,
26387ace27aeSKrishna Gudipati 				iocmd->throttle.cfg_value);
26397ace27aeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
26407ace27aeSKrishna Gudipati 
26417ace27aeSKrishna Gudipati 	return 0;
26427ace27aeSKrishna Gudipati }
26437ace27aeSKrishna Gudipati 
2644*3bbd8ef9SLee Jones static int
2645e6826c96SKrishna Gudipati bfad_iocmd_tfru_read(struct bfad_s *bfad, void *cmd)
2646e6826c96SKrishna Gudipati {
2647e6826c96SKrishna Gudipati 	struct bfa_bsg_tfru_s *iocmd =
2648e6826c96SKrishna Gudipati 			(struct bfa_bsg_tfru_s *)cmd;
2649e6826c96SKrishna Gudipati 	struct bfad_hal_comp fcomp;
2650e6826c96SKrishna Gudipati 	unsigned long flags = 0;
2651e6826c96SKrishna Gudipati 
2652e6826c96SKrishna Gudipati 	init_completion(&fcomp.comp);
2653e6826c96SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2654e6826c96SKrishna Gudipati 	iocmd->status = bfa_tfru_read(BFA_FRU(&bfad->bfa),
2655e6826c96SKrishna Gudipati 				&iocmd->data, iocmd->len, iocmd->offset,
2656e6826c96SKrishna Gudipati 				bfad_hcb_comp, &fcomp);
2657e6826c96SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2658e6826c96SKrishna Gudipati 	if (iocmd->status == BFA_STATUS_OK) {
2659e6826c96SKrishna Gudipati 		wait_for_completion(&fcomp.comp);
2660e6826c96SKrishna Gudipati 		iocmd->status = fcomp.status;
2661e6826c96SKrishna Gudipati 	}
2662e6826c96SKrishna Gudipati 
2663e6826c96SKrishna Gudipati 	return 0;
2664e6826c96SKrishna Gudipati }
2665e6826c96SKrishna Gudipati 
2666*3bbd8ef9SLee Jones static int
2667e6826c96SKrishna Gudipati bfad_iocmd_tfru_write(struct bfad_s *bfad, void *cmd)
2668e6826c96SKrishna Gudipati {
2669e6826c96SKrishna Gudipati 	struct bfa_bsg_tfru_s *iocmd =
2670e6826c96SKrishna Gudipati 			(struct bfa_bsg_tfru_s *)cmd;
2671e6826c96SKrishna Gudipati 	struct bfad_hal_comp fcomp;
2672e6826c96SKrishna Gudipati 	unsigned long flags = 0;
2673e6826c96SKrishna Gudipati 
2674e6826c96SKrishna Gudipati 	init_completion(&fcomp.comp);
2675e6826c96SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2676e6826c96SKrishna Gudipati 	iocmd->status = bfa_tfru_write(BFA_FRU(&bfad->bfa),
2677e6826c96SKrishna Gudipati 				&iocmd->data, iocmd->len, iocmd->offset,
2678e6826c96SKrishna Gudipati 				bfad_hcb_comp, &fcomp);
2679e6826c96SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2680e6826c96SKrishna Gudipati 	if (iocmd->status == BFA_STATUS_OK) {
2681e6826c96SKrishna Gudipati 		wait_for_completion(&fcomp.comp);
2682e6826c96SKrishna Gudipati 		iocmd->status = fcomp.status;
2683e6826c96SKrishna Gudipati 	}
2684e6826c96SKrishna Gudipati 
2685e6826c96SKrishna Gudipati 	return 0;
2686e6826c96SKrishna Gudipati }
2687e6826c96SKrishna Gudipati 
2688*3bbd8ef9SLee Jones static int
2689e6826c96SKrishna Gudipati bfad_iocmd_fruvpd_read(struct bfad_s *bfad, void *cmd)
2690e6826c96SKrishna Gudipati {
2691e6826c96SKrishna Gudipati 	struct bfa_bsg_fruvpd_s *iocmd =
2692e6826c96SKrishna Gudipati 			(struct bfa_bsg_fruvpd_s *)cmd;
2693e6826c96SKrishna Gudipati 	struct bfad_hal_comp fcomp;
2694e6826c96SKrishna Gudipati 	unsigned long flags = 0;
2695e6826c96SKrishna Gudipati 
2696e6826c96SKrishna Gudipati 	init_completion(&fcomp.comp);
2697e6826c96SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2698e6826c96SKrishna Gudipati 	iocmd->status = bfa_fruvpd_read(BFA_FRU(&bfad->bfa),
2699e6826c96SKrishna Gudipati 				&iocmd->data, iocmd->len, iocmd->offset,
2700e6826c96SKrishna Gudipati 				bfad_hcb_comp, &fcomp);
2701e6826c96SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2702e6826c96SKrishna Gudipati 	if (iocmd->status == BFA_STATUS_OK) {
2703e6826c96SKrishna Gudipati 		wait_for_completion(&fcomp.comp);
2704e6826c96SKrishna Gudipati 		iocmd->status = fcomp.status;
2705e6826c96SKrishna Gudipati 	}
2706e6826c96SKrishna Gudipati 
2707e6826c96SKrishna Gudipati 	return 0;
2708e6826c96SKrishna Gudipati }
2709e6826c96SKrishna Gudipati 
2710*3bbd8ef9SLee Jones static int
2711e6826c96SKrishna Gudipati bfad_iocmd_fruvpd_update(struct bfad_s *bfad, void *cmd)
2712e6826c96SKrishna Gudipati {
2713e6826c96SKrishna Gudipati 	struct bfa_bsg_fruvpd_s *iocmd =
2714e6826c96SKrishna Gudipati 			(struct bfa_bsg_fruvpd_s *)cmd;
2715e6826c96SKrishna Gudipati 	struct bfad_hal_comp fcomp;
2716e6826c96SKrishna Gudipati 	unsigned long flags = 0;
2717e6826c96SKrishna Gudipati 
2718e6826c96SKrishna Gudipati 	init_completion(&fcomp.comp);
2719e6826c96SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2720e6826c96SKrishna Gudipati 	iocmd->status = bfa_fruvpd_update(BFA_FRU(&bfad->bfa),
2721e6826c96SKrishna Gudipati 				&iocmd->data, iocmd->len, iocmd->offset,
2722079bcbc3SVijaya Mohan Guvva 				bfad_hcb_comp, &fcomp, iocmd->trfr_cmpl);
2723e6826c96SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2724e6826c96SKrishna Gudipati 	if (iocmd->status == BFA_STATUS_OK) {
2725e6826c96SKrishna Gudipati 		wait_for_completion(&fcomp.comp);
2726e6826c96SKrishna Gudipati 		iocmd->status = fcomp.status;
2727e6826c96SKrishna Gudipati 	}
2728e6826c96SKrishna Gudipati 
2729e6826c96SKrishna Gudipati 	return 0;
2730e6826c96SKrishna Gudipati }
2731e6826c96SKrishna Gudipati 
2732*3bbd8ef9SLee Jones static int
2733e6826c96SKrishna Gudipati bfad_iocmd_fruvpd_get_max_size(struct bfad_s *bfad, void *cmd)
2734e6826c96SKrishna Gudipati {
2735e6826c96SKrishna Gudipati 	struct bfa_bsg_fruvpd_max_size_s *iocmd =
2736e6826c96SKrishna Gudipati 			(struct bfa_bsg_fruvpd_max_size_s *)cmd;
2737e6826c96SKrishna Gudipati 	unsigned long flags = 0;
2738e6826c96SKrishna Gudipati 
2739e6826c96SKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
2740e6826c96SKrishna Gudipati 	iocmd->status = bfa_fruvpd_get_max_size(BFA_FRU(&bfad->bfa),
2741e6826c96SKrishna Gudipati 						&iocmd->max_size);
2742e6826c96SKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2743e6826c96SKrishna Gudipati 
2744e6826c96SKrishna Gudipati 	return 0;
2745e6826c96SKrishna Gudipati }
2746e6826c96SKrishna Gudipati 
2747b85daafeSKrishna Gudipati static int
2748b85daafeSKrishna Gudipati bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd,
2749b85daafeSKrishna Gudipati 		unsigned int payload_len)
2750b85daafeSKrishna Gudipati {
27519afbcfabSKrishna Gudipati 	int rc = -EINVAL;
2752b85daafeSKrishna Gudipati 
2753b85daafeSKrishna Gudipati 	switch (cmd) {
275460138066SKrishna Gudipati 	case IOCMD_IOC_ENABLE:
275560138066SKrishna Gudipati 		rc = bfad_iocmd_ioc_enable(bfad, iocmd);
275660138066SKrishna Gudipati 		break;
275760138066SKrishna Gudipati 	case IOCMD_IOC_DISABLE:
275860138066SKrishna Gudipati 		rc = bfad_iocmd_ioc_disable(bfad, iocmd);
275960138066SKrishna Gudipati 		break;
2760b85daafeSKrishna Gudipati 	case IOCMD_IOC_GET_INFO:
2761b85daafeSKrishna Gudipati 		rc = bfad_iocmd_ioc_get_info(bfad, iocmd);
2762b85daafeSKrishna Gudipati 		break;
2763b85daafeSKrishna Gudipati 	case IOCMD_IOC_GET_ATTR:
2764b85daafeSKrishna Gudipati 		rc = bfad_iocmd_ioc_get_attr(bfad, iocmd);
2765b85daafeSKrishna Gudipati 		break;
276660138066SKrishna Gudipati 	case IOCMD_IOC_GET_STATS:
276760138066SKrishna Gudipati 		rc = bfad_iocmd_ioc_get_stats(bfad, iocmd);
276860138066SKrishna Gudipati 		break;
276960138066SKrishna Gudipati 	case IOCMD_IOC_GET_FWSTATS:
277060138066SKrishna Gudipati 		rc = bfad_iocmd_ioc_get_fwstats(bfad, iocmd, payload_len);
277160138066SKrishna Gudipati 		break;
2772f2ee7601SKrishna Gudipati 	case IOCMD_IOC_RESET_STATS:
2773f2ee7601SKrishna Gudipati 	case IOCMD_IOC_RESET_FWSTATS:
2774f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_ioc_reset_stats(bfad, iocmd, cmd);
2775f2ee7601SKrishna Gudipati 		break;
2776f2ee7601SKrishna Gudipati 	case IOCMD_IOC_SET_ADAPTER_NAME:
2777f2ee7601SKrishna Gudipati 	case IOCMD_IOC_SET_PORT_NAME:
2778f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_ioc_set_name(bfad, iocmd, cmd);
2779f2ee7601SKrishna Gudipati 		break;
278060138066SKrishna Gudipati 	case IOCMD_IOCFC_GET_ATTR:
278160138066SKrishna Gudipati 		rc = bfad_iocmd_iocfc_get_attr(bfad, iocmd);
278260138066SKrishna Gudipati 		break;
278360138066SKrishna Gudipati 	case IOCMD_IOCFC_SET_INTR:
278460138066SKrishna Gudipati 		rc = bfad_iocmd_iocfc_set_intr(bfad, iocmd);
278560138066SKrishna Gudipati 		break;
278660138066SKrishna Gudipati 	case IOCMD_PORT_ENABLE:
278760138066SKrishna Gudipati 		rc = bfad_iocmd_port_enable(bfad, iocmd);
278860138066SKrishna Gudipati 		break;
278960138066SKrishna Gudipati 	case IOCMD_PORT_DISABLE:
279060138066SKrishna Gudipati 		rc = bfad_iocmd_port_disable(bfad, iocmd);
279160138066SKrishna Gudipati 		break;
2792b85daafeSKrishna Gudipati 	case IOCMD_PORT_GET_ATTR:
2793b85daafeSKrishna Gudipati 		rc = bfad_iocmd_port_get_attr(bfad, iocmd);
2794b85daafeSKrishna Gudipati 		break;
279560138066SKrishna Gudipati 	case IOCMD_PORT_GET_STATS:
279660138066SKrishna Gudipati 		rc = bfad_iocmd_port_get_stats(bfad, iocmd, payload_len);
279760138066SKrishna Gudipati 		break;
2798f2ee7601SKrishna Gudipati 	case IOCMD_PORT_RESET_STATS:
2799f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_port_reset_stats(bfad, iocmd);
2800f2ee7601SKrishna Gudipati 		break;
2801f2ee7601SKrishna Gudipati 	case IOCMD_PORT_CFG_TOPO:
2802f2ee7601SKrishna Gudipati 	case IOCMD_PORT_CFG_SPEED:
2803f2ee7601SKrishna Gudipati 	case IOCMD_PORT_CFG_ALPA:
2804f2ee7601SKrishna Gudipati 	case IOCMD_PORT_CLR_ALPA:
2805f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_set_port_cfg(bfad, iocmd, cmd);
2806f2ee7601SKrishna Gudipati 		break;
2807f2ee7601SKrishna Gudipati 	case IOCMD_PORT_CFG_MAXFRSZ:
2808f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_port_cfg_maxfrsize(bfad, iocmd);
2809f2ee7601SKrishna Gudipati 		break;
2810bbe37a67SVijaya Mohan Guvva 	case IOCMD_PORT_BBCR_ENABLE:
2811bbe37a67SVijaya Mohan Guvva 	case IOCMD_PORT_BBCR_DISABLE:
2812bbe37a67SVijaya Mohan Guvva 		rc = bfad_iocmd_port_cfg_bbcr(bfad, cmd, iocmd);
2813bbe37a67SVijaya Mohan Guvva 		break;
2814bbe37a67SVijaya Mohan Guvva 	case IOCMD_PORT_BBCR_GET_ATTR:
2815bbe37a67SVijaya Mohan Guvva 		rc = bfad_iocmd_port_get_bbcr_attr(bfad, iocmd);
2816f2ee7601SKrishna Gudipati 		break;
2817b85daafeSKrishna Gudipati 	case IOCMD_LPORT_GET_ATTR:
2818b85daafeSKrishna Gudipati 		rc = bfad_iocmd_lport_get_attr(bfad, iocmd);
2819b85daafeSKrishna Gudipati 		break;
282060138066SKrishna Gudipati 	case IOCMD_LPORT_GET_STATS:
282160138066SKrishna Gudipati 		rc = bfad_iocmd_lport_get_stats(bfad, iocmd);
282260138066SKrishna Gudipati 		break;
2823f2ee7601SKrishna Gudipati 	case IOCMD_LPORT_RESET_STATS:
2824f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_lport_reset_stats(bfad, iocmd);
2825f2ee7601SKrishna Gudipati 		break;
282660138066SKrishna Gudipati 	case IOCMD_LPORT_GET_IOSTATS:
282760138066SKrishna Gudipati 		rc = bfad_iocmd_lport_get_iostats(bfad, iocmd);
282860138066SKrishna Gudipati 		break;
282960138066SKrishna Gudipati 	case IOCMD_LPORT_GET_RPORTS:
283060138066SKrishna Gudipati 		rc = bfad_iocmd_lport_get_rports(bfad, iocmd, payload_len);
283160138066SKrishna Gudipati 		break;
283260138066SKrishna Gudipati 	case IOCMD_RPORT_GET_ATTR:
283360138066SKrishna Gudipati 		rc = bfad_iocmd_rport_get_attr(bfad, iocmd);
283460138066SKrishna Gudipati 		break;
2835b85daafeSKrishna Gudipati 	case IOCMD_RPORT_GET_ADDR:
2836b85daafeSKrishna Gudipati 		rc = bfad_iocmd_rport_get_addr(bfad, iocmd);
2837b85daafeSKrishna Gudipati 		break;
283860138066SKrishna Gudipati 	case IOCMD_RPORT_GET_STATS:
283960138066SKrishna Gudipati 		rc = bfad_iocmd_rport_get_stats(bfad, iocmd);
284060138066SKrishna Gudipati 		break;
2841f2ee7601SKrishna Gudipati 	case IOCMD_RPORT_RESET_STATS:
2842f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_rport_clr_stats(bfad, iocmd);
2843f2ee7601SKrishna Gudipati 		break;
2844f2ee7601SKrishna Gudipati 	case IOCMD_RPORT_SET_SPEED:
2845f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_rport_set_speed(bfad, iocmd);
2846f2ee7601SKrishna Gudipati 		break;
2847f2ee7601SKrishna Gudipati 	case IOCMD_VPORT_GET_ATTR:
2848f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_vport_get_attr(bfad, iocmd);
2849f2ee7601SKrishna Gudipati 		break;
2850f2ee7601SKrishna Gudipati 	case IOCMD_VPORT_GET_STATS:
2851f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_vport_get_stats(bfad, iocmd);
2852f2ee7601SKrishna Gudipati 		break;
2853f2ee7601SKrishna Gudipati 	case IOCMD_VPORT_RESET_STATS:
2854f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_vport_clr_stats(bfad, iocmd);
2855f2ee7601SKrishna Gudipati 		break;
2856b85daafeSKrishna Gudipati 	case IOCMD_FABRIC_GET_LPORTS:
2857b85daafeSKrishna Gudipati 		rc = bfad_iocmd_fabric_get_lports(bfad, iocmd, payload_len);
2858b85daafeSKrishna Gudipati 		break;
2859f2ee7601SKrishna Gudipati 	case IOCMD_RATELIM_ENABLE:
2860f2ee7601SKrishna Gudipati 	case IOCMD_RATELIM_DISABLE:
2861f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_ratelim(bfad, cmd, iocmd);
2862f2ee7601SKrishna Gudipati 		break;
2863f2ee7601SKrishna Gudipati 	case IOCMD_RATELIM_DEF_SPEED:
2864f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_ratelim_speed(bfad, cmd, iocmd);
2865f2ee7601SKrishna Gudipati 		break;
2866f2ee7601SKrishna Gudipati 	case IOCMD_FCPIM_FAILOVER:
2867f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_cfg_fcpim(bfad, iocmd);
2868f2ee7601SKrishna Gudipati 		break;
286960138066SKrishna Gudipati 	case IOCMD_FCPIM_MODSTATS:
287060138066SKrishna Gudipati 		rc = bfad_iocmd_fcpim_get_modstats(bfad, iocmd);
287160138066SKrishna Gudipati 		break;
2872f2ee7601SKrishna Gudipati 	case IOCMD_FCPIM_MODSTATSCLR:
2873f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_fcpim_clr_modstats(bfad, iocmd);
2874f2ee7601SKrishna Gudipati 		break;
287560138066SKrishna Gudipati 	case IOCMD_FCPIM_DEL_ITN_STATS:
287660138066SKrishna Gudipati 		rc = bfad_iocmd_fcpim_get_del_itn_stats(bfad, iocmd);
287760138066SKrishna Gudipati 		break;
2878b85daafeSKrishna Gudipati 	case IOCMD_ITNIM_GET_ATTR:
2879b85daafeSKrishna Gudipati 		rc = bfad_iocmd_itnim_get_attr(bfad, iocmd);
2880b85daafeSKrishna Gudipati 		break;
288160138066SKrishna Gudipati 	case IOCMD_ITNIM_GET_IOSTATS:
288260138066SKrishna Gudipati 		rc = bfad_iocmd_itnim_get_iostats(bfad, iocmd);
288360138066SKrishna Gudipati 		break;
2884f2ee7601SKrishna Gudipati 	case IOCMD_ITNIM_RESET_STATS:
2885f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_itnim_reset_stats(bfad, iocmd);
2886f2ee7601SKrishna Gudipati 		break;
288760138066SKrishna Gudipati 	case IOCMD_ITNIM_GET_ITNSTATS:
288860138066SKrishna Gudipati 		rc = bfad_iocmd_itnim_get_itnstats(bfad, iocmd);
288960138066SKrishna Gudipati 		break;
289060138066SKrishna Gudipati 	case IOCMD_FCPORT_ENABLE:
289160138066SKrishna Gudipati 		rc = bfad_iocmd_fcport_enable(bfad, iocmd);
289260138066SKrishna Gudipati 		break;
289360138066SKrishna Gudipati 	case IOCMD_FCPORT_DISABLE:
289460138066SKrishna Gudipati 		rc = bfad_iocmd_fcport_disable(bfad, iocmd);
289560138066SKrishna Gudipati 		break;
28961a4d8e1bSKrishna Gudipati 	case IOCMD_IOC_PCIFN_CFG:
28971a4d8e1bSKrishna Gudipati 		rc = bfad_iocmd_ioc_get_pcifn_cfg(bfad, iocmd);
28981a4d8e1bSKrishna Gudipati 		break;
289928d358d0SVijaya Mohan Guvva 	case IOCMD_IOC_FW_SIG_INV:
290028d358d0SVijaya Mohan Guvva 		rc = bfad_iocmd_ioc_fw_sig_inv(bfad, iocmd);
290128d358d0SVijaya Mohan Guvva 		break;
29021a4d8e1bSKrishna Gudipati 	case IOCMD_PCIFN_CREATE:
29031a4d8e1bSKrishna Gudipati 		rc = bfad_iocmd_pcifn_create(bfad, iocmd);
29041a4d8e1bSKrishna Gudipati 		break;
29051a4d8e1bSKrishna Gudipati 	case IOCMD_PCIFN_DELETE:
29061a4d8e1bSKrishna Gudipati 		rc = bfad_iocmd_pcifn_delete(bfad, iocmd);
29071a4d8e1bSKrishna Gudipati 		break;
29081a4d8e1bSKrishna Gudipati 	case IOCMD_PCIFN_BW:
29091a4d8e1bSKrishna Gudipati 		rc = bfad_iocmd_pcifn_bw(bfad, iocmd);
29101a4d8e1bSKrishna Gudipati 		break;
29111a4d8e1bSKrishna Gudipati 	case IOCMD_ADAPTER_CFG_MODE:
29121a4d8e1bSKrishna Gudipati 		rc = bfad_iocmd_adapter_cfg_mode(bfad, iocmd);
29131a4d8e1bSKrishna Gudipati 		break;
29141a4d8e1bSKrishna Gudipati 	case IOCMD_PORT_CFG_MODE:
29151a4d8e1bSKrishna Gudipati 		rc = bfad_iocmd_port_cfg_mode(bfad, iocmd);
29161a4d8e1bSKrishna Gudipati 		break;
29171a4d8e1bSKrishna Gudipati 	case IOCMD_FLASH_ENABLE_OPTROM:
29181a4d8e1bSKrishna Gudipati 	case IOCMD_FLASH_DISABLE_OPTROM:
29191a4d8e1bSKrishna Gudipati 		rc = bfad_iocmd_ablk_optrom(bfad, cmd, iocmd);
29201a4d8e1bSKrishna Gudipati 		break;
2921a714134aSKrishna Gudipati 	case IOCMD_FAA_QUERY:
2922a714134aSKrishna Gudipati 		rc = bfad_iocmd_faa_query(bfad, iocmd);
2923a714134aSKrishna Gudipati 		break;
2924148d6103SKrishna Gudipati 	case IOCMD_CEE_GET_ATTR:
2925148d6103SKrishna Gudipati 		rc = bfad_iocmd_cee_attr(bfad, iocmd, payload_len);
2926148d6103SKrishna Gudipati 		break;
2927148d6103SKrishna Gudipati 	case IOCMD_CEE_GET_STATS:
2928148d6103SKrishna Gudipati 		rc = bfad_iocmd_cee_get_stats(bfad, iocmd, payload_len);
2929148d6103SKrishna Gudipati 		break;
2930148d6103SKrishna Gudipati 	case IOCMD_CEE_RESET_STATS:
2931148d6103SKrishna Gudipati 		rc = bfad_iocmd_cee_reset_stats(bfad, iocmd);
2932148d6103SKrishna Gudipati 		break;
293351e569aaSKrishna Gudipati 	case IOCMD_SFP_MEDIA:
293451e569aaSKrishna Gudipati 		rc = bfad_iocmd_sfp_media(bfad, iocmd);
293551e569aaSKrishna Gudipati 		 break;
293651e569aaSKrishna Gudipati 	case IOCMD_SFP_SPEED:
293751e569aaSKrishna Gudipati 		rc = bfad_iocmd_sfp_speed(bfad, iocmd);
293851e569aaSKrishna Gudipati 		break;
29395a54b1d5SKrishna Gudipati 	case IOCMD_FLASH_GET_ATTR:
29405a54b1d5SKrishna Gudipati 		rc = bfad_iocmd_flash_get_attr(bfad, iocmd);
29415a54b1d5SKrishna Gudipati 		break;
29425a54b1d5SKrishna Gudipati 	case IOCMD_FLASH_ERASE_PART:
29435a54b1d5SKrishna Gudipati 		rc = bfad_iocmd_flash_erase_part(bfad, iocmd);
29445a54b1d5SKrishna Gudipati 		break;
29455a54b1d5SKrishna Gudipati 	case IOCMD_FLASH_UPDATE_PART:
29465a54b1d5SKrishna Gudipati 		rc = bfad_iocmd_flash_update_part(bfad, iocmd, payload_len);
29475a54b1d5SKrishna Gudipati 		break;
29485a54b1d5SKrishna Gudipati 	case IOCMD_FLASH_READ_PART:
29495a54b1d5SKrishna Gudipati 		rc = bfad_iocmd_flash_read_part(bfad, iocmd, payload_len);
29505a54b1d5SKrishna Gudipati 		break;
29513d7fc66dSKrishna Gudipati 	case IOCMD_DIAG_TEMP:
29523d7fc66dSKrishna Gudipati 		rc = bfad_iocmd_diag_temp(bfad, iocmd);
29533d7fc66dSKrishna Gudipati 		break;
29543d7fc66dSKrishna Gudipati 	case IOCMD_DIAG_MEMTEST:
29553d7fc66dSKrishna Gudipati 		rc = bfad_iocmd_diag_memtest(bfad, iocmd);
29563d7fc66dSKrishna Gudipati 		break;
29573d7fc66dSKrishna Gudipati 	case IOCMD_DIAG_LOOPBACK:
29583d7fc66dSKrishna Gudipati 		rc = bfad_iocmd_diag_loopback(bfad, iocmd);
29593d7fc66dSKrishna Gudipati 		break;
29603d7fc66dSKrishna Gudipati 	case IOCMD_DIAG_FWPING:
29613d7fc66dSKrishna Gudipati 		rc = bfad_iocmd_diag_fwping(bfad, iocmd);
29623d7fc66dSKrishna Gudipati 		break;
29633d7fc66dSKrishna Gudipati 	case IOCMD_DIAG_QUEUETEST:
29643d7fc66dSKrishna Gudipati 		rc = bfad_iocmd_diag_queuetest(bfad, iocmd);
29653d7fc66dSKrishna Gudipati 		break;
29663d7fc66dSKrishna Gudipati 	case IOCMD_DIAG_SFP:
29673d7fc66dSKrishna Gudipati 		rc = bfad_iocmd_diag_sfp(bfad, iocmd);
29683d7fc66dSKrishna Gudipati 		break;
29693d7fc66dSKrishna Gudipati 	case IOCMD_DIAG_LED:
29703d7fc66dSKrishna Gudipati 		rc = bfad_iocmd_diag_led(bfad, iocmd);
29713d7fc66dSKrishna Gudipati 		break;
29723d7fc66dSKrishna Gudipati 	case IOCMD_DIAG_BEACON_LPORT:
29733d7fc66dSKrishna Gudipati 		rc = bfad_iocmd_diag_beacon_lport(bfad, iocmd);
29743d7fc66dSKrishna Gudipati 		break;
29753d7fc66dSKrishna Gudipati 	case IOCMD_DIAG_LB_STAT:
29763d7fc66dSKrishna Gudipati 		rc = bfad_iocmd_diag_lb_stat(bfad, iocmd);
29773d7fc66dSKrishna Gudipati 		break;
2978e353546eSKrishna Gudipati 	case IOCMD_DIAG_DPORT_ENABLE:
29791a898a79SVijaya Mohan Guvva 		rc = bfad_iocmd_diag_dport_enable(bfad, iocmd);
2980e353546eSKrishna Gudipati 		break;
29811a898a79SVijaya Mohan Guvva 	case IOCMD_DIAG_DPORT_DISABLE:
29821a898a79SVijaya Mohan Guvva 		rc = bfad_iocmd_diag_dport_disable(bfad, iocmd);
29831a898a79SVijaya Mohan Guvva 		break;
29841a898a79SVijaya Mohan Guvva 	case IOCMD_DIAG_DPORT_SHOW:
29851a898a79SVijaya Mohan Guvva 		rc = bfad_iocmd_diag_dport_show(bfad, iocmd);
29861a898a79SVijaya Mohan Guvva 		break;
29871a898a79SVijaya Mohan Guvva 	case IOCMD_DIAG_DPORT_START:
29881a898a79SVijaya Mohan Guvva 		rc = bfad_iocmd_diag_dport_start(bfad, iocmd);
2989e353546eSKrishna Gudipati 		break;
29903350d98dSKrishna Gudipati 	case IOCMD_PHY_GET_ATTR:
29913350d98dSKrishna Gudipati 		rc = bfad_iocmd_phy_get_attr(bfad, iocmd);
29923350d98dSKrishna Gudipati 		break;
29933350d98dSKrishna Gudipati 	case IOCMD_PHY_GET_STATS:
29943350d98dSKrishna Gudipati 		rc = bfad_iocmd_phy_get_stats(bfad, iocmd);
29953350d98dSKrishna Gudipati 		break;
29963350d98dSKrishna Gudipati 	case IOCMD_PHY_UPDATE_FW:
29973350d98dSKrishna Gudipati 		rc = bfad_iocmd_phy_update(bfad, iocmd, payload_len);
29983350d98dSKrishna Gudipati 		break;
29993350d98dSKrishna Gudipati 	case IOCMD_PHY_READ_FW:
30003350d98dSKrishna Gudipati 		rc = bfad_iocmd_phy_read(bfad, iocmd, payload_len);
30013350d98dSKrishna Gudipati 		break;
300261e62e21SKrishna Gudipati 	case IOCMD_VHBA_QUERY:
300361e62e21SKrishna Gudipati 		rc = bfad_iocmd_vhba_query(bfad, iocmd);
300461e62e21SKrishna Gudipati 		break;
300561e62e21SKrishna Gudipati 	case IOCMD_DEBUG_PORTLOG:
300661e62e21SKrishna Gudipati 		rc = bfad_iocmd_porglog_get(bfad, iocmd);
300761e62e21SKrishna Gudipati 		break;
3008f2ee7601SKrishna Gudipati 	case IOCMD_DEBUG_FW_CORE:
3009f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_debug_fw_core(bfad, iocmd, payload_len);
3010f2ee7601SKrishna Gudipati 		break;
3011f2ee7601SKrishna Gudipati 	case IOCMD_DEBUG_FW_STATE_CLR:
3012f2ee7601SKrishna Gudipati 	case IOCMD_DEBUG_PORTLOG_CLR:
3013f2ee7601SKrishna Gudipati 	case IOCMD_DEBUG_START_DTRC:
3014f2ee7601SKrishna Gudipati 	case IOCMD_DEBUG_STOP_DTRC:
3015f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_debug_ctl(bfad, iocmd, cmd);
3016f2ee7601SKrishna Gudipati 		break;
3017f2ee7601SKrishna Gudipati 	case IOCMD_DEBUG_PORTLOG_CTL:
3018f2ee7601SKrishna Gudipati 		rc = bfad_iocmd_porglog_ctl(bfad, iocmd);
3019f2ee7601SKrishna Gudipati 		break;
302042a8e6e2SKrishna Gudipati 	case IOCMD_FCPIM_PROFILE_ON:
302142a8e6e2SKrishna Gudipati 	case IOCMD_FCPIM_PROFILE_OFF:
302242a8e6e2SKrishna Gudipati 		rc = bfad_iocmd_fcpim_cfg_profile(bfad, iocmd, cmd);
302342a8e6e2SKrishna Gudipati 		break;
302442a8e6e2SKrishna Gudipati 	case IOCMD_ITNIM_GET_IOPROFILE:
302542a8e6e2SKrishna Gudipati 		rc = bfad_iocmd_itnim_get_ioprofile(bfad, iocmd);
302642a8e6e2SKrishna Gudipati 		break;
302737ea0558SKrishna Gudipati 	case IOCMD_FCPORT_GET_STATS:
302837ea0558SKrishna Gudipati 		rc = bfad_iocmd_fcport_get_stats(bfad, iocmd);
302937ea0558SKrishna Gudipati 		break;
303037ea0558SKrishna Gudipati 	case IOCMD_FCPORT_RESET_STATS:
303137ea0558SKrishna Gudipati 		rc = bfad_iocmd_fcport_reset_stats(bfad, iocmd);
303237ea0558SKrishna Gudipati 		break;
3033a46bd300SKrishna Gudipati 	case IOCMD_BOOT_CFG:
3034a46bd300SKrishna Gudipati 		rc = bfad_iocmd_boot_cfg(bfad, iocmd);
3035a46bd300SKrishna Gudipati 		break;
3036a46bd300SKrishna Gudipati 	case IOCMD_BOOT_QUERY:
3037a46bd300SKrishna Gudipati 		rc = bfad_iocmd_boot_query(bfad, iocmd);
3038a46bd300SKrishna Gudipati 		break;
3039a46bd300SKrishna Gudipati 	case IOCMD_PREBOOT_QUERY:
3040a46bd300SKrishna Gudipati 		rc = bfad_iocmd_preboot_query(bfad, iocmd);
3041a46bd300SKrishna Gudipati 		break;
3042a46bd300SKrishna Gudipati 	case IOCMD_ETHBOOT_CFG:
3043a46bd300SKrishna Gudipati 		rc = bfad_iocmd_ethboot_cfg(bfad, iocmd);
3044a46bd300SKrishna Gudipati 		break;
3045a46bd300SKrishna Gudipati 	case IOCMD_ETHBOOT_QUERY:
3046a46bd300SKrishna Gudipati 		rc = bfad_iocmd_ethboot_query(bfad, iocmd);
3047a46bd300SKrishna Gudipati 		break;
304845191236SKrishna Gudipati 	case IOCMD_TRUNK_ENABLE:
304945191236SKrishna Gudipati 	case IOCMD_TRUNK_DISABLE:
305045191236SKrishna Gudipati 		rc = bfad_iocmd_cfg_trunk(bfad, iocmd, cmd);
305145191236SKrishna Gudipati 		break;
305245191236SKrishna Gudipati 	case IOCMD_TRUNK_GET_ATTR:
305345191236SKrishna Gudipati 		rc = bfad_iocmd_trunk_get_attr(bfad, iocmd);
305445191236SKrishna Gudipati 		break;
30553ec4f2c8SKrishna Gudipati 	case IOCMD_QOS_ENABLE:
30563ec4f2c8SKrishna Gudipati 	case IOCMD_QOS_DISABLE:
30573ec4f2c8SKrishna Gudipati 		rc = bfad_iocmd_qos(bfad, iocmd, cmd);
30583ec4f2c8SKrishna Gudipati 		break;
30593ec4f2c8SKrishna Gudipati 	case IOCMD_QOS_GET_ATTR:
30603ec4f2c8SKrishna Gudipati 		rc = bfad_iocmd_qos_get_attr(bfad, iocmd);
30613ec4f2c8SKrishna Gudipati 		break;
30623ec4f2c8SKrishna Gudipati 	case IOCMD_QOS_GET_VC_ATTR:
30633ec4f2c8SKrishna Gudipati 		rc = bfad_iocmd_qos_get_vc_attr(bfad, iocmd);
30643ec4f2c8SKrishna Gudipati 		break;
30653ec4f2c8SKrishna Gudipati 	case IOCMD_QOS_GET_STATS:
30663ec4f2c8SKrishna Gudipati 		rc = bfad_iocmd_qos_get_stats(bfad, iocmd);
30673ec4f2c8SKrishna Gudipati 		break;
30683ec4f2c8SKrishna Gudipati 	case IOCMD_QOS_RESET_STATS:
30693ec4f2c8SKrishna Gudipati 		rc = bfad_iocmd_qos_reset_stats(bfad, iocmd);
30703ec4f2c8SKrishna Gudipati 		break;
30716894f013SKrishna Gudipati 	case IOCMD_QOS_SET_BW:
30726894f013SKrishna Gudipati 		rc = bfad_iocmd_qos_set_bw(bfad, iocmd);
30736894f013SKrishna Gudipati 		break;
3074c0350bf5SKrishna Gudipati 	case IOCMD_VF_GET_STATS:
3075c0350bf5SKrishna Gudipati 		rc = bfad_iocmd_vf_get_stats(bfad, iocmd);
3076c0350bf5SKrishna Gudipati 		break;
3077c0350bf5SKrishna Gudipati 	case IOCMD_VF_RESET_STATS:
3078c0350bf5SKrishna Gudipati 		rc = bfad_iocmd_vf_clr_stats(bfad, iocmd);
3079c0350bf5SKrishna Gudipati 		break;
30804c5d22bfSKrishna Gudipati 	case IOCMD_FCPIM_LUNMASK_ENABLE:
30814c5d22bfSKrishna Gudipati 	case IOCMD_FCPIM_LUNMASK_DISABLE:
30824c5d22bfSKrishna Gudipati 	case IOCMD_FCPIM_LUNMASK_CLEAR:
30834c5d22bfSKrishna Gudipati 		rc = bfad_iocmd_lunmask(bfad, iocmd, cmd);
30844c5d22bfSKrishna Gudipati 		break;
30854c5d22bfSKrishna Gudipati 	case IOCMD_FCPIM_LUNMASK_QUERY:
30864c5d22bfSKrishna Gudipati 		rc = bfad_iocmd_fcpim_lunmask_query(bfad, iocmd);
30874c5d22bfSKrishna Gudipati 		break;
30884c5d22bfSKrishna Gudipati 	case IOCMD_FCPIM_LUNMASK_ADD:
30894c5d22bfSKrishna Gudipati 	case IOCMD_FCPIM_LUNMASK_DELETE:
30904c5d22bfSKrishna Gudipati 		rc = bfad_iocmd_fcpim_cfg_lunmask(bfad, iocmd, cmd);
30914c5d22bfSKrishna Gudipati 		break;
30927ace27aeSKrishna Gudipati 	case IOCMD_FCPIM_THROTTLE_QUERY:
30937ace27aeSKrishna Gudipati 		rc = bfad_iocmd_fcpim_throttle_query(bfad, iocmd);
30947ace27aeSKrishna Gudipati 		break;
30957ace27aeSKrishna Gudipati 	case IOCMD_FCPIM_THROTTLE_SET:
30967ace27aeSKrishna Gudipati 		rc = bfad_iocmd_fcpim_throttle_set(bfad, iocmd);
30977ace27aeSKrishna Gudipati 		break;
3098e6826c96SKrishna Gudipati 	/* TFRU */
3099e6826c96SKrishna Gudipati 	case IOCMD_TFRU_READ:
3100e6826c96SKrishna Gudipati 		rc = bfad_iocmd_tfru_read(bfad, iocmd);
3101e6826c96SKrishna Gudipati 		break;
3102e6826c96SKrishna Gudipati 	case IOCMD_TFRU_WRITE:
3103e6826c96SKrishna Gudipati 		rc = bfad_iocmd_tfru_write(bfad, iocmd);
3104e6826c96SKrishna Gudipati 		break;
3105e6826c96SKrishna Gudipati 	/* FRU */
3106e6826c96SKrishna Gudipati 	case IOCMD_FRUVPD_READ:
3107e6826c96SKrishna Gudipati 		rc = bfad_iocmd_fruvpd_read(bfad, iocmd);
3108e6826c96SKrishna Gudipati 		break;
3109e6826c96SKrishna Gudipati 	case IOCMD_FRUVPD_UPDATE:
3110e6826c96SKrishna Gudipati 		rc = bfad_iocmd_fruvpd_update(bfad, iocmd);
3111e6826c96SKrishna Gudipati 		break;
3112e6826c96SKrishna Gudipati 	case IOCMD_FRUVPD_GET_MAX_SIZE:
3113e6826c96SKrishna Gudipati 		rc = bfad_iocmd_fruvpd_get_max_size(bfad, iocmd);
3114e6826c96SKrishna Gudipati 		break;
3115b85daafeSKrishna Gudipati 	default:
31169afbcfabSKrishna Gudipati 		rc = -EINVAL;
3117b85daafeSKrishna Gudipati 		break;
3118b85daafeSKrishna Gudipati 	}
31199afbcfabSKrishna Gudipati 	return rc;
3120b85daafeSKrishna Gudipati }
3121b85daafeSKrishna Gudipati 
3122b85daafeSKrishna Gudipati static int
312375cc8cfcSJohannes Thumshirn bfad_im_bsg_vendor_request(struct bsg_job *job)
3124b85daafeSKrishna Gudipati {
312501e0e15cSJohannes Thumshirn 	struct fc_bsg_request *bsg_request = job->request;
312601e0e15cSJohannes Thumshirn 	struct fc_bsg_reply *bsg_reply = job->reply;
312701e0e15cSJohannes Thumshirn 	uint32_t vendor_cmd = bsg_request->rqst_data.h_vendor.vendor_cmd[0];
312845349821SJohannes Thumshirn 	struct Scsi_Host *shost = fc_bsg_to_shost(job);
312948d83282SArnd Bergmann 	struct bfad_im_port_s *im_port = bfad_get_im_port(shost);
3130b85daafeSKrishna Gudipati 	struct bfad_s *bfad = im_port->bfad;
3131b85daafeSKrishna Gudipati 	void *payload_kbuf;
3132b85daafeSKrishna Gudipati 	int rc = -EINVAL;
3133b85daafeSKrishna Gudipati 
3134b85daafeSKrishna Gudipati 	/* Allocate a temp buffer to hold the passed in user space command */
3135b85daafeSKrishna Gudipati 	payload_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL);
3136b85daafeSKrishna Gudipati 	if (!payload_kbuf) {
3137b85daafeSKrishna Gudipati 		rc = -ENOMEM;
3138b85daafeSKrishna Gudipati 		goto out;
3139b85daafeSKrishna Gudipati 	}
3140b85daafeSKrishna Gudipati 
3141b85daafeSKrishna Gudipati 	/* Copy the sg_list passed in to a linear buffer: holds the cmnd data */
3142b85daafeSKrishna Gudipati 	sg_copy_to_buffer(job->request_payload.sg_list,
3143b85daafeSKrishna Gudipati 			  job->request_payload.sg_cnt, payload_kbuf,
3144b85daafeSKrishna Gudipati 			  job->request_payload.payload_len);
3145b85daafeSKrishna Gudipati 
3146b85daafeSKrishna Gudipati 	/* Invoke IOCMD handler - to handle all the vendor command requests */
3147b85daafeSKrishna Gudipati 	rc = bfad_iocmd_handler(bfad, vendor_cmd, payload_kbuf,
3148b85daafeSKrishna Gudipati 				job->request_payload.payload_len);
3149b85daafeSKrishna Gudipati 	if (rc != BFA_STATUS_OK)
3150b85daafeSKrishna Gudipati 		goto error;
3151b85daafeSKrishna Gudipati 
3152b85daafeSKrishna Gudipati 	/* Copy the response data to the job->reply_payload sg_list */
3153b85daafeSKrishna Gudipati 	sg_copy_from_buffer(job->reply_payload.sg_list,
3154b85daafeSKrishna Gudipati 			    job->reply_payload.sg_cnt,
3155b85daafeSKrishna Gudipati 			    payload_kbuf,
3156b85daafeSKrishna Gudipati 			    job->reply_payload.payload_len);
3157b85daafeSKrishna Gudipati 
3158b85daafeSKrishna Gudipati 	/* free the command buffer */
3159b85daafeSKrishna Gudipati 	kfree(payload_kbuf);
3160b85daafeSKrishna Gudipati 
3161b85daafeSKrishna Gudipati 	/* Fill the BSG job reply data */
3162b85daafeSKrishna Gudipati 	job->reply_len = job->reply_payload.payload_len;
316301e0e15cSJohannes Thumshirn 	bsg_reply->reply_payload_rcv_len = job->reply_payload.payload_len;
316401e0e15cSJohannes Thumshirn 	bsg_reply->result = rc;
3165b85daafeSKrishna Gudipati 
316606548160SJohannes Thumshirn 	bsg_job_done(job, bsg_reply->result,
31671abaede7SJohannes Thumshirn 		       bsg_reply->reply_payload_rcv_len);
3168b85daafeSKrishna Gudipati 	return rc;
3169b85daafeSKrishna Gudipati error:
3170b85daafeSKrishna Gudipati 	/* free the command buffer */
3171b85daafeSKrishna Gudipati 	kfree(payload_kbuf);
3172b85daafeSKrishna Gudipati out:
317301e0e15cSJohannes Thumshirn 	bsg_reply->result = rc;
3174b85daafeSKrishna Gudipati 	job->reply_len = sizeof(uint32_t);
317501e0e15cSJohannes Thumshirn 	bsg_reply->reply_payload_rcv_len = 0;
3176b85daafeSKrishna Gudipati 	return rc;
3177b85daafeSKrishna Gudipati }
3178b85daafeSKrishna Gudipati 
3179b85daafeSKrishna Gudipati /* FC passthru call backs */
3180*3bbd8ef9SLee Jones static u64
3181b85daafeSKrishna Gudipati bfad_fcxp_get_req_sgaddr_cb(void *bfad_fcxp, int sgeid)
3182b85daafeSKrishna Gudipati {
3183b85daafeSKrishna Gudipati 	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
3184b85daafeSKrishna Gudipati 	struct bfa_sge_s  *sge;
3185b85daafeSKrishna Gudipati 	u64	addr;
3186b85daafeSKrishna Gudipati 
3187b85daafeSKrishna Gudipati 	sge = drv_fcxp->req_sge + sgeid;
3188b85daafeSKrishna Gudipati 	addr = (u64)(size_t) sge->sg_addr;
3189b85daafeSKrishna Gudipati 	return addr;
3190b85daafeSKrishna Gudipati }
3191b85daafeSKrishna Gudipati 
3192*3bbd8ef9SLee Jones static u32
3193b85daafeSKrishna Gudipati bfad_fcxp_get_req_sglen_cb(void *bfad_fcxp, int sgeid)
3194b85daafeSKrishna Gudipati {
3195b85daafeSKrishna Gudipati 	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
3196b85daafeSKrishna Gudipati 	struct bfa_sge_s	*sge;
3197b85daafeSKrishna Gudipati 
3198b85daafeSKrishna Gudipati 	sge = drv_fcxp->req_sge + sgeid;
3199b85daafeSKrishna Gudipati 	return sge->sg_len;
3200b85daafeSKrishna Gudipati }
3201b85daafeSKrishna Gudipati 
3202*3bbd8ef9SLee Jones static u64
3203b85daafeSKrishna Gudipati bfad_fcxp_get_rsp_sgaddr_cb(void *bfad_fcxp, int sgeid)
3204b85daafeSKrishna Gudipati {
3205b85daafeSKrishna Gudipati 	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
3206b85daafeSKrishna Gudipati 	struct bfa_sge_s	*sge;
3207b85daafeSKrishna Gudipati 	u64	addr;
3208b85daafeSKrishna Gudipati 
3209b85daafeSKrishna Gudipati 	sge = drv_fcxp->rsp_sge + sgeid;
3210b85daafeSKrishna Gudipati 	addr = (u64)(size_t) sge->sg_addr;
3211b85daafeSKrishna Gudipati 	return addr;
3212b85daafeSKrishna Gudipati }
3213b85daafeSKrishna Gudipati 
3214*3bbd8ef9SLee Jones static u32
3215b85daafeSKrishna Gudipati bfad_fcxp_get_rsp_sglen_cb(void *bfad_fcxp, int sgeid)
3216b85daafeSKrishna Gudipati {
3217b85daafeSKrishna Gudipati 	struct bfad_fcxp	*drv_fcxp = bfad_fcxp;
3218b85daafeSKrishna Gudipati 	struct bfa_sge_s	*sge;
3219b85daafeSKrishna Gudipati 
3220b85daafeSKrishna Gudipati 	sge = drv_fcxp->rsp_sge + sgeid;
3221b85daafeSKrishna Gudipati 	return sge->sg_len;
3222b85daafeSKrishna Gudipati }
3223b85daafeSKrishna Gudipati 
3224*3bbd8ef9SLee Jones static void
3225b85daafeSKrishna Gudipati bfad_send_fcpt_cb(void *bfad_fcxp, struct bfa_fcxp_s *fcxp, void *cbarg,
3226b85daafeSKrishna Gudipati 		bfa_status_t req_status, u32 rsp_len, u32 resid_len,
3227b85daafeSKrishna Gudipati 		struct fchs_s *rsp_fchs)
3228b85daafeSKrishna Gudipati {
3229b85daafeSKrishna Gudipati 	struct bfad_fcxp *drv_fcxp = bfad_fcxp;
3230b85daafeSKrishna Gudipati 
3231b85daafeSKrishna Gudipati 	drv_fcxp->req_status = req_status;
3232b85daafeSKrishna Gudipati 	drv_fcxp->rsp_len = rsp_len;
3233b85daafeSKrishna Gudipati 
3234b85daafeSKrishna Gudipati 	/* bfa_fcxp will be automatically freed by BFA */
3235b85daafeSKrishna Gudipati 	drv_fcxp->bfa_fcxp = NULL;
3236b85daafeSKrishna Gudipati 	complete(&drv_fcxp->comp);
3237b85daafeSKrishna Gudipati }
3238b85daafeSKrishna Gudipati 
3239*3bbd8ef9SLee Jones static struct bfad_buf_info *
3240b85daafeSKrishna Gudipati bfad_fcxp_map_sg(struct bfad_s *bfad, void *payload_kbuf,
3241b85daafeSKrishna Gudipati 		 uint32_t payload_len, uint32_t *num_sgles)
3242b85daafeSKrishna Gudipati {
3243b85daafeSKrishna Gudipati 	struct bfad_buf_info	*buf_base, *buf_info;
3244b85daafeSKrishna Gudipati 	struct bfa_sge_s	*sg_table;
3245b85daafeSKrishna Gudipati 	int sge_num = 1;
3246b85daafeSKrishna Gudipati 
32476396bb22SKees Cook 	buf_base = kcalloc(sizeof(struct bfad_buf_info) +
32486396bb22SKees Cook 				sizeof(struct bfa_sge_s),
32496396bb22SKees Cook 			   sge_num, GFP_KERNEL);
3250b85daafeSKrishna Gudipati 	if (!buf_base)
3251b85daafeSKrishna Gudipati 		return NULL;
3252b85daafeSKrishna Gudipati 
3253b85daafeSKrishna Gudipati 	sg_table = (struct bfa_sge_s *) (((uint8_t *)buf_base) +
3254b85daafeSKrishna Gudipati 			(sizeof(struct bfad_buf_info) * sge_num));
3255b85daafeSKrishna Gudipati 
3256b85daafeSKrishna Gudipati 	/* Allocate dma coherent memory */
3257b85daafeSKrishna Gudipati 	buf_info = buf_base;
3258b85daafeSKrishna Gudipati 	buf_info->size = payload_len;
3259750afb08SLuis Chamberlain 	buf_info->virt = dma_alloc_coherent(&bfad->pcidev->dev,
32607626d9f3SJoe Perches 					    buf_info->size, &buf_info->phys,
32617626d9f3SJoe Perches 					    GFP_KERNEL);
3262b85daafeSKrishna Gudipati 	if (!buf_info->virt)
3263b85daafeSKrishna Gudipati 		goto out_free_mem;
3264b85daafeSKrishna Gudipati 
3265b85daafeSKrishna Gudipati 	/* copy the linear bsg buffer to buf_info */
3266b85daafeSKrishna Gudipati 	memcpy(buf_info->virt, payload_kbuf, buf_info->size);
3267b85daafeSKrishna Gudipati 
3268b85daafeSKrishna Gudipati 	/*
3269b85daafeSKrishna Gudipati 	 * Setup SG table
3270b85daafeSKrishna Gudipati 	 */
3271b85daafeSKrishna Gudipati 	sg_table->sg_len = buf_info->size;
3272b85daafeSKrishna Gudipati 	sg_table->sg_addr = (void *)(size_t) buf_info->phys;
3273b85daafeSKrishna Gudipati 
3274b85daafeSKrishna Gudipati 	*num_sgles = sge_num;
3275b85daafeSKrishna Gudipati 
3276b85daafeSKrishna Gudipati 	return buf_base;
3277b85daafeSKrishna Gudipati 
3278b85daafeSKrishna Gudipati out_free_mem:
3279b85daafeSKrishna Gudipati 	kfree(buf_base);
3280b85daafeSKrishna Gudipati 	return NULL;
3281b85daafeSKrishna Gudipati }
3282b85daafeSKrishna Gudipati 
3283*3bbd8ef9SLee Jones static void
3284b85daafeSKrishna Gudipati bfad_fcxp_free_mem(struct bfad_s *bfad, struct bfad_buf_info *buf_base,
3285b85daafeSKrishna Gudipati 		   uint32_t num_sgles)
3286b85daafeSKrishna Gudipati {
3287b85daafeSKrishna Gudipati 	int i;
3288b85daafeSKrishna Gudipati 	struct bfad_buf_info *buf_info = buf_base;
3289b85daafeSKrishna Gudipati 
3290b85daafeSKrishna Gudipati 	if (buf_base) {
3291b85daafeSKrishna Gudipati 		for (i = 0; i < num_sgles; buf_info++, i++) {
3292b85daafeSKrishna Gudipati 			if (buf_info->virt != NULL)
3293b85daafeSKrishna Gudipati 				dma_free_coherent(&bfad->pcidev->dev,
3294b85daafeSKrishna Gudipati 					buf_info->size, buf_info->virt,
3295b85daafeSKrishna Gudipati 					buf_info->phys);
3296b85daafeSKrishna Gudipati 		}
3297b85daafeSKrishna Gudipati 		kfree(buf_base);
3298b85daafeSKrishna Gudipati 	}
3299b85daafeSKrishna Gudipati }
3300b85daafeSKrishna Gudipati 
3301*3bbd8ef9SLee Jones static int
330275cc8cfcSJohannes Thumshirn bfad_fcxp_bsg_send(struct bsg_job *job, struct bfad_fcxp *drv_fcxp,
3303b85daafeSKrishna Gudipati 		   bfa_bsg_fcpt_t *bsg_fcpt)
3304b85daafeSKrishna Gudipati {
3305b85daafeSKrishna Gudipati 	struct bfa_fcxp_s *hal_fcxp;
3306b85daafeSKrishna Gudipati 	struct bfad_s	*bfad = drv_fcxp->port->bfad;
3307b85daafeSKrishna Gudipati 	unsigned long	flags;
3308b85daafeSKrishna Gudipati 	uint8_t	lp_tag;
3309b85daafeSKrishna Gudipati 
3310b85daafeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
3311b85daafeSKrishna Gudipati 
3312b85daafeSKrishna Gudipati 	/* Allocate bfa_fcxp structure */
3313c3f1b123SKrishna Gudipati 	hal_fcxp = bfa_fcxp_req_rsp_alloc(drv_fcxp, &bfad->bfa,
3314b85daafeSKrishna Gudipati 				  drv_fcxp->num_req_sgles,
3315b85daafeSKrishna Gudipati 				  drv_fcxp->num_rsp_sgles,
3316b85daafeSKrishna Gudipati 				  bfad_fcxp_get_req_sgaddr_cb,
3317b85daafeSKrishna Gudipati 				  bfad_fcxp_get_req_sglen_cb,
3318b85daafeSKrishna Gudipati 				  bfad_fcxp_get_rsp_sgaddr_cb,
3319c3f1b123SKrishna Gudipati 				  bfad_fcxp_get_rsp_sglen_cb, BFA_TRUE);
3320b85daafeSKrishna Gudipati 	if (!hal_fcxp) {
3321b85daafeSKrishna Gudipati 		bfa_trc(bfad, 0);
3322b85daafeSKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3323b85daafeSKrishna Gudipati 		return BFA_STATUS_ENOMEM;
3324b85daafeSKrishna Gudipati 	}
3325b85daafeSKrishna Gudipati 
3326b85daafeSKrishna Gudipati 	drv_fcxp->bfa_fcxp = hal_fcxp;
3327b85daafeSKrishna Gudipati 
3328b85daafeSKrishna Gudipati 	lp_tag = bfa_lps_get_tag_from_pid(&bfad->bfa, bsg_fcpt->fchs.s_id);
3329b85daafeSKrishna Gudipati 
3330b85daafeSKrishna Gudipati 	bfa_fcxp_send(hal_fcxp, drv_fcxp->bfa_rport, bsg_fcpt->vf_id, lp_tag,
3331b85daafeSKrishna Gudipati 		      bsg_fcpt->cts, bsg_fcpt->cos,
3332b85daafeSKrishna Gudipati 		      job->request_payload.payload_len,
3333b85daafeSKrishna Gudipati 		      &bsg_fcpt->fchs, bfad_send_fcpt_cb, bfad,
3334b85daafeSKrishna Gudipati 		      job->reply_payload.payload_len, bsg_fcpt->tsecs);
3335b85daafeSKrishna Gudipati 
3336b85daafeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3337b85daafeSKrishna Gudipati 
3338b85daafeSKrishna Gudipati 	return BFA_STATUS_OK;
3339b85daafeSKrishna Gudipati }
3340b85daafeSKrishna Gudipati 
3341*3bbd8ef9SLee Jones static int
334275cc8cfcSJohannes Thumshirn bfad_im_bsg_els_ct_request(struct bsg_job *job)
3343b85daafeSKrishna Gudipati {
3344b85daafeSKrishna Gudipati 	struct bfa_bsg_data *bsg_data;
334545349821SJohannes Thumshirn 	struct Scsi_Host *shost = fc_bsg_to_shost(job);
334648d83282SArnd Bergmann 	struct bfad_im_port_s *im_port = bfad_get_im_port(shost);
3347b85daafeSKrishna Gudipati 	struct bfad_s *bfad = im_port->bfad;
3348b85daafeSKrishna Gudipati 	bfa_bsg_fcpt_t *bsg_fcpt;
3349b85daafeSKrishna Gudipati 	struct bfad_fcxp    *drv_fcxp;
3350b85daafeSKrishna Gudipati 	struct bfa_fcs_lport_s *fcs_port;
3351b85daafeSKrishna Gudipati 	struct bfa_fcs_rport_s *fcs_rport;
335246337737SJohannes Thumshirn 	struct fc_bsg_request *bsg_request = job->request;
335301e0e15cSJohannes Thumshirn 	struct fc_bsg_reply *bsg_reply = job->reply;
335401e0e15cSJohannes Thumshirn 	uint32_t command_type = bsg_request->msgcode;
3355b85daafeSKrishna Gudipati 	unsigned long flags;
3356b85daafeSKrishna Gudipati 	struct bfad_buf_info *rsp_buf_info;
3357b85daafeSKrishna Gudipati 	void *req_kbuf = NULL, *rsp_kbuf = NULL;
3358b85daafeSKrishna Gudipati 	int rc = -EINVAL;
3359b85daafeSKrishna Gudipati 
3360b85daafeSKrishna Gudipati 	job->reply_len  = sizeof(uint32_t);	/* Atleast uint32_t reply_len */
336101e0e15cSJohannes Thumshirn 	bsg_reply->reply_payload_rcv_len = 0;
3362b85daafeSKrishna Gudipati 
3363b85daafeSKrishna Gudipati 	/* Get the payload passed in from userspace */
336401e0e15cSJohannes Thumshirn 	bsg_data = (struct bfa_bsg_data *) (((char *)bsg_request) +
3365b85daafeSKrishna Gudipati 					    sizeof(struct fc_bsg_request));
3366b85daafeSKrishna Gudipati 	if (bsg_data == NULL)
3367b85daafeSKrishna Gudipati 		goto out;
3368b85daafeSKrishna Gudipati 
3369b85daafeSKrishna Gudipati 	/*
3370b85daafeSKrishna Gudipati 	 * Allocate buffer for bsg_fcpt and do a copy_from_user op for payload
3371b85daafeSKrishna Gudipati 	 * buffer of size bsg_data->payload_len
3372b85daafeSKrishna Gudipati 	 */
337364b8aa75SJesper Juhl 	bsg_fcpt = kzalloc(bsg_data->payload_len, GFP_KERNEL);
3374529f9a76SKrishna Gudipati 	if (!bsg_fcpt) {
3375529f9a76SKrishna Gudipati 		rc = -ENOMEM;
3376b85daafeSKrishna Gudipati 		goto out;
3377529f9a76SKrishna Gudipati 	}
3378b85daafeSKrishna Gudipati 
3379bccd2683SVijaya Mohan Guvva 	if (copy_from_user((uint8_t *)bsg_fcpt,
3380bccd2683SVijaya Mohan Guvva 				(void *)(unsigned long)bsg_data->payload,
3381b85daafeSKrishna Gudipati 				bsg_data->payload_len)) {
3382b85daafeSKrishna Gudipati 		kfree(bsg_fcpt);
3383529f9a76SKrishna Gudipati 		rc = -EIO;
3384b85daafeSKrishna Gudipati 		goto out;
3385b85daafeSKrishna Gudipati 	}
3386b85daafeSKrishna Gudipati 
3387b85daafeSKrishna Gudipati 	drv_fcxp = kzalloc(sizeof(struct bfad_fcxp), GFP_KERNEL);
3388b85daafeSKrishna Gudipati 	if (drv_fcxp == NULL) {
338964b8aa75SJesper Juhl 		kfree(bsg_fcpt);
3390b85daafeSKrishna Gudipati 		rc = -ENOMEM;
3391b85daafeSKrishna Gudipati 		goto out;
3392b85daafeSKrishna Gudipati 	}
3393b85daafeSKrishna Gudipati 
3394b85daafeSKrishna Gudipati 	spin_lock_irqsave(&bfad->bfad_lock, flags);
3395b85daafeSKrishna Gudipati 	fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, bsg_fcpt->vf_id,
3396b85daafeSKrishna Gudipati 					bsg_fcpt->lpwwn);
3397b85daafeSKrishna Gudipati 	if (fcs_port == NULL) {
3398b85daafeSKrishna Gudipati 		bsg_fcpt->status = BFA_STATUS_UNKNOWN_LWWN;
3399b85daafeSKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3400b85daafeSKrishna Gudipati 		goto out_free_mem;
3401b85daafeSKrishna Gudipati 	}
3402b85daafeSKrishna Gudipati 
3403b85daafeSKrishna Gudipati 	/* Check if the port is online before sending FC Passthru cmd */
3404b85daafeSKrishna Gudipati 	if (!bfa_fcs_lport_is_online(fcs_port)) {
3405b85daafeSKrishna Gudipati 		bsg_fcpt->status = BFA_STATUS_PORT_OFFLINE;
3406b85daafeSKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3407b85daafeSKrishna Gudipati 		goto out_free_mem;
3408b85daafeSKrishna Gudipati 	}
3409b85daafeSKrishna Gudipati 
3410b85daafeSKrishna Gudipati 	drv_fcxp->port = fcs_port->bfad_port;
3411b85daafeSKrishna Gudipati 
3412b85daafeSKrishna Gudipati 	if (drv_fcxp->port->bfad == 0)
3413b85daafeSKrishna Gudipati 		drv_fcxp->port->bfad = bfad;
3414b85daafeSKrishna Gudipati 
3415b85daafeSKrishna Gudipati 	/* Fetch the bfa_rport - if nexus needed */
3416b85daafeSKrishna Gudipati 	if (command_type == FC_BSG_HST_ELS_NOLOGIN ||
3417b85daafeSKrishna Gudipati 	    command_type == FC_BSG_HST_CT) {
3418b85daafeSKrishna Gudipati 		/* BSG HST commands: no nexus needed */
3419b85daafeSKrishna Gudipati 		drv_fcxp->bfa_rport = NULL;
3420b85daafeSKrishna Gudipati 
3421b85daafeSKrishna Gudipati 	} else if (command_type == FC_BSG_RPT_ELS ||
3422b85daafeSKrishna Gudipati 		   command_type == FC_BSG_RPT_CT) {
3423b85daafeSKrishna Gudipati 		/* BSG RPT commands: nexus needed */
3424b85daafeSKrishna Gudipati 		fcs_rport = bfa_fcs_lport_get_rport_by_pwwn(fcs_port,
3425b85daafeSKrishna Gudipati 							    bsg_fcpt->dpwwn);
3426b85daafeSKrishna Gudipati 		if (fcs_rport == NULL) {
3427b85daafeSKrishna Gudipati 			bsg_fcpt->status = BFA_STATUS_UNKNOWN_RWWN;
3428b85daafeSKrishna Gudipati 			spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3429b85daafeSKrishna Gudipati 			goto out_free_mem;
3430b85daafeSKrishna Gudipati 		}
3431b85daafeSKrishna Gudipati 
3432b85daafeSKrishna Gudipati 		drv_fcxp->bfa_rport = fcs_rport->bfa_rport;
3433b85daafeSKrishna Gudipati 
3434b85daafeSKrishna Gudipati 	} else { /* Unknown BSG msgcode; return -EINVAL */
3435b85daafeSKrishna Gudipati 		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3436b85daafeSKrishna Gudipati 		goto out_free_mem;
3437b85daafeSKrishna Gudipati 	}
3438b85daafeSKrishna Gudipati 
3439b85daafeSKrishna Gudipati 	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3440b85daafeSKrishna Gudipati 
3441b85daafeSKrishna Gudipati 	/* allocate memory for req / rsp buffers */
3442b85daafeSKrishna Gudipati 	req_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL);
3443b85daafeSKrishna Gudipati 	if (!req_kbuf) {
3444b85daafeSKrishna Gudipati 		printk(KERN_INFO "bfa %s: fcpt request buffer alloc failed\n",
3445b85daafeSKrishna Gudipati 				bfad->pci_name);
3446b85daafeSKrishna Gudipati 		rc = -ENOMEM;
3447b85daafeSKrishna Gudipati 		goto out_free_mem;
3448b85daafeSKrishna Gudipati 	}
3449b85daafeSKrishna Gudipati 
3450b85daafeSKrishna Gudipati 	rsp_kbuf = kzalloc(job->reply_payload.payload_len, GFP_KERNEL);
3451b85daafeSKrishna Gudipati 	if (!rsp_kbuf) {
3452b85daafeSKrishna Gudipati 		printk(KERN_INFO "bfa %s: fcpt response buffer alloc failed\n",
3453b85daafeSKrishna Gudipati 				bfad->pci_name);
3454b85daafeSKrishna Gudipati 		rc = -ENOMEM;
3455b85daafeSKrishna Gudipati 		goto out_free_mem;
3456b85daafeSKrishna Gudipati 	}
3457b85daafeSKrishna Gudipati 
3458b85daafeSKrishna Gudipati 	/* map req sg - copy the sg_list passed in to the linear buffer */
3459b85daafeSKrishna Gudipati 	sg_copy_to_buffer(job->request_payload.sg_list,
3460b85daafeSKrishna Gudipati 			  job->request_payload.sg_cnt, req_kbuf,
3461b85daafeSKrishna Gudipati 			  job->request_payload.payload_len);
3462b85daafeSKrishna Gudipati 
3463b85daafeSKrishna Gudipati 	drv_fcxp->reqbuf_info = bfad_fcxp_map_sg(bfad, req_kbuf,
3464b85daafeSKrishna Gudipati 					job->request_payload.payload_len,
3465b85daafeSKrishna Gudipati 					&drv_fcxp->num_req_sgles);
3466b85daafeSKrishna Gudipati 	if (!drv_fcxp->reqbuf_info) {
3467b85daafeSKrishna Gudipati 		printk(KERN_INFO "bfa %s: fcpt request fcxp_map_sg failed\n",
3468b85daafeSKrishna Gudipati 				bfad->pci_name);
3469b85daafeSKrishna Gudipati 		rc = -ENOMEM;
3470b85daafeSKrishna Gudipati 		goto out_free_mem;
3471b85daafeSKrishna Gudipati 	}
3472b85daafeSKrishna Gudipati 
3473b85daafeSKrishna Gudipati 	drv_fcxp->req_sge = (struct bfa_sge_s *)
3474b85daafeSKrishna Gudipati 			    (((uint8_t *)drv_fcxp->reqbuf_info) +
3475b85daafeSKrishna Gudipati 			    (sizeof(struct bfad_buf_info) *
3476b85daafeSKrishna Gudipati 					drv_fcxp->num_req_sgles));
3477b85daafeSKrishna Gudipati 
3478b85daafeSKrishna Gudipati 	/* map rsp sg */
3479b85daafeSKrishna Gudipati 	drv_fcxp->rspbuf_info = bfad_fcxp_map_sg(bfad, rsp_kbuf,
3480b85daafeSKrishna Gudipati 					job->reply_payload.payload_len,
3481b85daafeSKrishna Gudipati 					&drv_fcxp->num_rsp_sgles);
3482b85daafeSKrishna Gudipati 	if (!drv_fcxp->rspbuf_info) {
3483b85daafeSKrishna Gudipati 		printk(KERN_INFO "bfa %s: fcpt response fcxp_map_sg failed\n",
3484b85daafeSKrishna Gudipati 				bfad->pci_name);
3485b85daafeSKrishna Gudipati 		rc = -ENOMEM;
3486b85daafeSKrishna Gudipati 		goto out_free_mem;
3487b85daafeSKrishna Gudipati 	}
3488b85daafeSKrishna Gudipati 
3489b85daafeSKrishna Gudipati 	rsp_buf_info = (struct bfad_buf_info *)drv_fcxp->rspbuf_info;
3490b85daafeSKrishna Gudipati 	drv_fcxp->rsp_sge = (struct bfa_sge_s  *)
3491b85daafeSKrishna Gudipati 			    (((uint8_t *)drv_fcxp->rspbuf_info) +
3492b85daafeSKrishna Gudipati 			    (sizeof(struct bfad_buf_info) *
3493b85daafeSKrishna Gudipati 					drv_fcxp->num_rsp_sgles));
3494b85daafeSKrishna Gudipati 
3495b85daafeSKrishna Gudipati 	/* fcxp send */
3496b85daafeSKrishna Gudipati 	init_completion(&drv_fcxp->comp);
3497b85daafeSKrishna Gudipati 	rc = bfad_fcxp_bsg_send(job, drv_fcxp, bsg_fcpt);
3498b85daafeSKrishna Gudipati 	if (rc == BFA_STATUS_OK) {
3499b85daafeSKrishna Gudipati 		wait_for_completion(&drv_fcxp->comp);
3500b85daafeSKrishna Gudipati 		bsg_fcpt->status = drv_fcxp->req_status;
3501b85daafeSKrishna Gudipati 	} else {
3502b85daafeSKrishna Gudipati 		bsg_fcpt->status = rc;
3503b85daafeSKrishna Gudipati 		goto out_free_mem;
3504b85daafeSKrishna Gudipati 	}
3505b85daafeSKrishna Gudipati 
3506b85daafeSKrishna Gudipati 	/* fill the job->reply data */
3507b85daafeSKrishna Gudipati 	if (drv_fcxp->req_status == BFA_STATUS_OK) {
3508b85daafeSKrishna Gudipati 		job->reply_len = drv_fcxp->rsp_len;
350901e0e15cSJohannes Thumshirn 		bsg_reply->reply_payload_rcv_len = drv_fcxp->rsp_len;
351001e0e15cSJohannes Thumshirn 		bsg_reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
3511b85daafeSKrishna Gudipati 	} else {
351201e0e15cSJohannes Thumshirn 		bsg_reply->reply_payload_rcv_len =
3513b85daafeSKrishna Gudipati 					sizeof(struct fc_bsg_ctels_reply);
3514b85daafeSKrishna Gudipati 		job->reply_len = sizeof(uint32_t);
351501e0e15cSJohannes Thumshirn 		bsg_reply->reply_data.ctels_reply.status =
3516b85daafeSKrishna Gudipati 						FC_CTELS_STATUS_REJECT;
3517b85daafeSKrishna Gudipati 	}
3518b85daafeSKrishna Gudipati 
3519b85daafeSKrishna Gudipati 	/* Copy the response data to the reply_payload sg list */
3520b85daafeSKrishna Gudipati 	sg_copy_from_buffer(job->reply_payload.sg_list,
3521b85daafeSKrishna Gudipati 			    job->reply_payload.sg_cnt,
3522b85daafeSKrishna Gudipati 			    (uint8_t *)rsp_buf_info->virt,
3523b85daafeSKrishna Gudipati 			    job->reply_payload.payload_len);
3524b85daafeSKrishna Gudipati 
3525b85daafeSKrishna Gudipati out_free_mem:
3526b85daafeSKrishna Gudipati 	bfad_fcxp_free_mem(bfad, drv_fcxp->rspbuf_info,
3527b85daafeSKrishna Gudipati 			   drv_fcxp->num_rsp_sgles);
3528b85daafeSKrishna Gudipati 	bfad_fcxp_free_mem(bfad, drv_fcxp->reqbuf_info,
3529b85daafeSKrishna Gudipati 			   drv_fcxp->num_req_sgles);
3530b85daafeSKrishna Gudipati 	kfree(req_kbuf);
3531b85daafeSKrishna Gudipati 	kfree(rsp_kbuf);
3532b85daafeSKrishna Gudipati 
3533b85daafeSKrishna Gudipati 	/* Need a copy to user op */
3534bccd2683SVijaya Mohan Guvva 	if (copy_to_user((void *)(unsigned long)bsg_data->payload,
3535bccd2683SVijaya Mohan Guvva 			(void *)bsg_fcpt, bsg_data->payload_len))
3536b85daafeSKrishna Gudipati 		rc = -EIO;
3537b85daafeSKrishna Gudipati 
3538b85daafeSKrishna Gudipati 	kfree(bsg_fcpt);
3539b85daafeSKrishna Gudipati 	kfree(drv_fcxp);
3540b85daafeSKrishna Gudipati out:
354101e0e15cSJohannes Thumshirn 	bsg_reply->result = rc;
3542b85daafeSKrishna Gudipati 
3543b85daafeSKrishna Gudipati 	if (rc == BFA_STATUS_OK)
354406548160SJohannes Thumshirn 		bsg_job_done(job, bsg_reply->result,
35451abaede7SJohannes Thumshirn 			       bsg_reply->reply_payload_rcv_len);
3546b85daafeSKrishna Gudipati 
3547b85daafeSKrishna Gudipati 	return rc;
3548b85daafeSKrishna Gudipati }
3549b85daafeSKrishna Gudipati 
3550b85daafeSKrishna Gudipati int
355175cc8cfcSJohannes Thumshirn bfad_im_bsg_request(struct bsg_job *job)
3552b85daafeSKrishna Gudipati {
355301e0e15cSJohannes Thumshirn 	struct fc_bsg_request *bsg_request = job->request;
355401e0e15cSJohannes Thumshirn 	struct fc_bsg_reply *bsg_reply = job->reply;
3555b85daafeSKrishna Gudipati 	uint32_t rc = BFA_STATUS_OK;
3556b85daafeSKrishna Gudipati 
355701e0e15cSJohannes Thumshirn 	switch (bsg_request->msgcode) {
3558b85daafeSKrishna Gudipati 	case FC_BSG_HST_VENDOR:
3559b85daafeSKrishna Gudipati 		/* Process BSG HST Vendor requests */
3560b85daafeSKrishna Gudipati 		rc = bfad_im_bsg_vendor_request(job);
3561b85daafeSKrishna Gudipati 		break;
3562b85daafeSKrishna Gudipati 	case FC_BSG_HST_ELS_NOLOGIN:
3563b85daafeSKrishna Gudipati 	case FC_BSG_RPT_ELS:
3564b85daafeSKrishna Gudipati 	case FC_BSG_HST_CT:
3565b85daafeSKrishna Gudipati 	case FC_BSG_RPT_CT:
3566b85daafeSKrishna Gudipati 		/* Process BSG ELS/CT commands */
3567b85daafeSKrishna Gudipati 		rc = bfad_im_bsg_els_ct_request(job);
3568b85daafeSKrishna Gudipati 		break;
3569b85daafeSKrishna Gudipati 	default:
357001e0e15cSJohannes Thumshirn 		bsg_reply->result = rc = -EINVAL;
357101e0e15cSJohannes Thumshirn 		bsg_reply->reply_payload_rcv_len = 0;
3572b85daafeSKrishna Gudipati 		break;
3573b85daafeSKrishna Gudipati 	}
3574b85daafeSKrishna Gudipati 
3575b85daafeSKrishna Gudipati 	return rc;
3576b85daafeSKrishna Gudipati }
3577b85daafeSKrishna Gudipati 
3578b85daafeSKrishna Gudipati int
357975cc8cfcSJohannes Thumshirn bfad_im_bsg_timeout(struct bsg_job *job)
3580b85daafeSKrishna Gudipati {
3581b85daafeSKrishna Gudipati 	/* Don't complete the BSG job request - return -EAGAIN
3582b85daafeSKrishna Gudipati 	 * to reset bsg job timeout : for ELS/CT pass thru we
3583b85daafeSKrishna Gudipati 	 * already have timer to track the request.
3584b85daafeSKrishna Gudipati 	 */
3585b85daafeSKrishna Gudipati 	return -EAGAIN;
3586b85daafeSKrishna Gudipati }
3587