1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
4*4882a593Smuzhiyun * Copyright (c) 2014- QLogic Corporation.
5*4882a593Smuzhiyun * All rights reserved
6*4882a593Smuzhiyun * www.qlogic.com
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/uaccess.h>
12*4882a593Smuzhiyun #include "bfad_drv.h"
13*4882a593Smuzhiyun #include "bfad_im.h"
14*4882a593Smuzhiyun #include "bfad_bsg.h"
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun BFA_TRC_FILE(LDRV, BSG);
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun static int
bfad_iocmd_ioc_enable(struct bfad_s * bfad,void * cmd)19*4882a593Smuzhiyun bfad_iocmd_ioc_enable(struct bfad_s *bfad, void *cmd)
20*4882a593Smuzhiyun {
21*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
22*4882a593Smuzhiyun unsigned long flags;
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
25*4882a593Smuzhiyun /* If IOC is not in disabled state - return */
26*4882a593Smuzhiyun if (!bfa_ioc_is_disabled(&bfad->bfa.ioc)) {
27*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
28*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
29*4882a593Smuzhiyun return 0;
30*4882a593Smuzhiyun }
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun init_completion(&bfad->enable_comp);
33*4882a593Smuzhiyun bfa_iocfc_enable(&bfad->bfa);
34*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
35*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
36*4882a593Smuzhiyun wait_for_completion(&bfad->enable_comp);
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun return 0;
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun static int
bfad_iocmd_ioc_disable(struct bfad_s * bfad,void * cmd)42*4882a593Smuzhiyun bfad_iocmd_ioc_disable(struct bfad_s *bfad, void *cmd)
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
45*4882a593Smuzhiyun unsigned long flags;
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
48*4882a593Smuzhiyun if (bfa_ioc_is_disabled(&bfad->bfa.ioc)) {
49*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
50*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
51*4882a593Smuzhiyun return 0;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun if (bfad->disable_active) {
55*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
56*4882a593Smuzhiyun return -EBUSY;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun bfad->disable_active = BFA_TRUE;
60*4882a593Smuzhiyun init_completion(&bfad->disable_comp);
61*4882a593Smuzhiyun bfa_iocfc_disable(&bfad->bfa);
62*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun wait_for_completion(&bfad->disable_comp);
65*4882a593Smuzhiyun bfad->disable_active = BFA_FALSE;
66*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun return 0;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun static int
bfad_iocmd_ioc_get_info(struct bfad_s * bfad,void * cmd)72*4882a593Smuzhiyun bfad_iocmd_ioc_get_info(struct bfad_s *bfad, void *cmd)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun int i;
75*4882a593Smuzhiyun struct bfa_bsg_ioc_info_s *iocmd = (struct bfa_bsg_ioc_info_s *)cmd;
76*4882a593Smuzhiyun struct bfad_im_port_s *im_port;
77*4882a593Smuzhiyun struct bfa_port_attr_s pattr;
78*4882a593Smuzhiyun unsigned long flags;
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
81*4882a593Smuzhiyun bfa_fcport_get_attr(&bfad->bfa, &pattr);
82*4882a593Smuzhiyun iocmd->nwwn = pattr.nwwn;
83*4882a593Smuzhiyun iocmd->pwwn = pattr.pwwn;
84*4882a593Smuzhiyun iocmd->ioc_type = bfa_get_type(&bfad->bfa);
85*4882a593Smuzhiyun iocmd->mac = bfa_get_mac(&bfad->bfa);
86*4882a593Smuzhiyun iocmd->factory_mac = bfa_get_mfg_mac(&bfad->bfa);
87*4882a593Smuzhiyun bfa_get_adapter_serial_num(&bfad->bfa, iocmd->serialnum);
88*4882a593Smuzhiyun iocmd->factorynwwn = pattr.factorynwwn;
89*4882a593Smuzhiyun iocmd->factorypwwn = pattr.factorypwwn;
90*4882a593Smuzhiyun iocmd->bfad_num = bfad->inst_no;
91*4882a593Smuzhiyun im_port = bfad->pport.im_port;
92*4882a593Smuzhiyun iocmd->host = im_port->shost->host_no;
93*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun strcpy(iocmd->name, bfad->adapter_name);
96*4882a593Smuzhiyun strcpy(iocmd->port_name, bfad->port_name);
97*4882a593Smuzhiyun strcpy(iocmd->hwpath, bfad->pci_name);
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun /* set adapter hw path */
100*4882a593Smuzhiyun strcpy(iocmd->adapter_hwpath, bfad->pci_name);
101*4882a593Smuzhiyun for (i = 0; iocmd->adapter_hwpath[i] != ':' && i < BFA_STRING_32; i++)
102*4882a593Smuzhiyun ;
103*4882a593Smuzhiyun for (; iocmd->adapter_hwpath[++i] != ':' && i < BFA_STRING_32; )
104*4882a593Smuzhiyun ;
105*4882a593Smuzhiyun iocmd->adapter_hwpath[i] = '\0';
106*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
107*4882a593Smuzhiyun return 0;
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun static int
bfad_iocmd_ioc_get_attr(struct bfad_s * bfad,void * cmd)111*4882a593Smuzhiyun bfad_iocmd_ioc_get_attr(struct bfad_s *bfad, void *cmd)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun struct bfa_bsg_ioc_attr_s *iocmd = (struct bfa_bsg_ioc_attr_s *)cmd;
114*4882a593Smuzhiyun unsigned long flags;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
117*4882a593Smuzhiyun bfa_ioc_get_attr(&bfad->bfa.ioc, &iocmd->ioc_attr);
118*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun /* fill in driver attr info */
121*4882a593Smuzhiyun strcpy(iocmd->ioc_attr.driver_attr.driver, BFAD_DRIVER_NAME);
122*4882a593Smuzhiyun strlcpy(iocmd->ioc_attr.driver_attr.driver_ver,
123*4882a593Smuzhiyun BFAD_DRIVER_VERSION, BFA_VERSION_LEN);
124*4882a593Smuzhiyun strcpy(iocmd->ioc_attr.driver_attr.fw_ver,
125*4882a593Smuzhiyun iocmd->ioc_attr.adapter_attr.fw_ver);
126*4882a593Smuzhiyun strcpy(iocmd->ioc_attr.driver_attr.bios_ver,
127*4882a593Smuzhiyun iocmd->ioc_attr.adapter_attr.optrom_ver);
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun /* copy chip rev info first otherwise it will be overwritten */
130*4882a593Smuzhiyun memcpy(bfad->pci_attr.chip_rev, iocmd->ioc_attr.pci_attr.chip_rev,
131*4882a593Smuzhiyun sizeof(bfad->pci_attr.chip_rev));
132*4882a593Smuzhiyun memcpy(&iocmd->ioc_attr.pci_attr, &bfad->pci_attr,
133*4882a593Smuzhiyun sizeof(struct bfa_ioc_pci_attr_s));
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
136*4882a593Smuzhiyun return 0;
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun static int
bfad_iocmd_ioc_get_stats(struct bfad_s * bfad,void * cmd)140*4882a593Smuzhiyun bfad_iocmd_ioc_get_stats(struct bfad_s *bfad, void *cmd)
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun struct bfa_bsg_ioc_stats_s *iocmd = (struct bfa_bsg_ioc_stats_s *)cmd;
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun bfa_ioc_get_stats(&bfad->bfa, &iocmd->ioc_stats);
145*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
146*4882a593Smuzhiyun return 0;
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun static int
bfad_iocmd_ioc_get_fwstats(struct bfad_s * bfad,void * cmd,unsigned int payload_len)150*4882a593Smuzhiyun bfad_iocmd_ioc_get_fwstats(struct bfad_s *bfad, void *cmd,
151*4882a593Smuzhiyun unsigned int payload_len)
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun struct bfa_bsg_ioc_fwstats_s *iocmd =
154*4882a593Smuzhiyun (struct bfa_bsg_ioc_fwstats_s *)cmd;
155*4882a593Smuzhiyun void *iocmd_bufptr;
156*4882a593Smuzhiyun unsigned long flags;
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len,
159*4882a593Smuzhiyun sizeof(struct bfa_bsg_ioc_fwstats_s),
160*4882a593Smuzhiyun sizeof(struct bfa_fw_stats_s)) != BFA_STATUS_OK) {
161*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
162*4882a593Smuzhiyun goto out;
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_ioc_fwstats_s);
166*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
167*4882a593Smuzhiyun iocmd->status = bfa_ioc_fw_stats_get(&bfad->bfa.ioc, iocmd_bufptr);
168*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
171*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
172*4882a593Smuzhiyun goto out;
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun out:
175*4882a593Smuzhiyun bfa_trc(bfad, 0x6666);
176*4882a593Smuzhiyun return 0;
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun static int
bfad_iocmd_ioc_reset_stats(struct bfad_s * bfad,void * cmd,unsigned int v_cmd)180*4882a593Smuzhiyun bfad_iocmd_ioc_reset_stats(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
183*4882a593Smuzhiyun unsigned long flags;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun if (v_cmd == IOCMD_IOC_RESET_STATS) {
186*4882a593Smuzhiyun bfa_ioc_clear_stats(&bfad->bfa);
187*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
188*4882a593Smuzhiyun } else if (v_cmd == IOCMD_IOC_RESET_FWSTATS) {
189*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
190*4882a593Smuzhiyun iocmd->status = bfa_ioc_fw_stats_clear(&bfad->bfa.ioc);
191*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun return 0;
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun static int
bfad_iocmd_ioc_set_name(struct bfad_s * bfad,void * cmd,unsigned int v_cmd)198*4882a593Smuzhiyun bfad_iocmd_ioc_set_name(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun struct bfa_bsg_ioc_name_s *iocmd = (struct bfa_bsg_ioc_name_s *) cmd;
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun if (v_cmd == IOCMD_IOC_SET_ADAPTER_NAME)
203*4882a593Smuzhiyun strcpy(bfad->adapter_name, iocmd->name);
204*4882a593Smuzhiyun else if (v_cmd == IOCMD_IOC_SET_PORT_NAME)
205*4882a593Smuzhiyun strcpy(bfad->port_name, iocmd->name);
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
208*4882a593Smuzhiyun return 0;
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun static int
bfad_iocmd_iocfc_get_attr(struct bfad_s * bfad,void * cmd)212*4882a593Smuzhiyun bfad_iocmd_iocfc_get_attr(struct bfad_s *bfad, void *cmd)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun struct bfa_bsg_iocfc_attr_s *iocmd = (struct bfa_bsg_iocfc_attr_s *)cmd;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
217*4882a593Smuzhiyun bfa_iocfc_get_attr(&bfad->bfa, &iocmd->iocfc_attr);
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun return 0;
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun static int
bfad_iocmd_ioc_fw_sig_inv(struct bfad_s * bfad,void * cmd)223*4882a593Smuzhiyun bfad_iocmd_ioc_fw_sig_inv(struct bfad_s *bfad, void *cmd)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
226*4882a593Smuzhiyun unsigned long flags;
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
229*4882a593Smuzhiyun iocmd->status = bfa_ioc_fwsig_invalidate(&bfad->bfa.ioc);
230*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
231*4882a593Smuzhiyun return 0;
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun static int
bfad_iocmd_iocfc_set_intr(struct bfad_s * bfad,void * cmd)235*4882a593Smuzhiyun bfad_iocmd_iocfc_set_intr(struct bfad_s *bfad, void *cmd)
236*4882a593Smuzhiyun {
237*4882a593Smuzhiyun struct bfa_bsg_iocfc_intr_s *iocmd = (struct bfa_bsg_iocfc_intr_s *)cmd;
238*4882a593Smuzhiyun unsigned long flags;
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
241*4882a593Smuzhiyun iocmd->status = bfa_iocfc_israttr_set(&bfad->bfa, &iocmd->attr);
242*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun return 0;
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun static int
bfad_iocmd_port_enable(struct bfad_s * bfad,void * cmd)248*4882a593Smuzhiyun bfad_iocmd_port_enable(struct bfad_s *bfad, void *cmd)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
251*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
252*4882a593Smuzhiyun unsigned long flags;
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun init_completion(&fcomp.comp);
255*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
256*4882a593Smuzhiyun iocmd->status = bfa_port_enable(&bfad->bfa.modules.port,
257*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
258*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
259*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
260*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
261*4882a593Smuzhiyun return 0;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
264*4882a593Smuzhiyun iocmd->status = fcomp.status;
265*4882a593Smuzhiyun return 0;
266*4882a593Smuzhiyun }
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun static int
bfad_iocmd_port_disable(struct bfad_s * bfad,void * cmd)269*4882a593Smuzhiyun bfad_iocmd_port_disable(struct bfad_s *bfad, void *cmd)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
272*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
273*4882a593Smuzhiyun unsigned long flags;
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun init_completion(&fcomp.comp);
276*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
277*4882a593Smuzhiyun iocmd->status = bfa_port_disable(&bfad->bfa.modules.port,
278*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
279*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
282*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
283*4882a593Smuzhiyun return 0;
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
286*4882a593Smuzhiyun iocmd->status = fcomp.status;
287*4882a593Smuzhiyun return 0;
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun static int
bfad_iocmd_port_get_attr(struct bfad_s * bfad,void * cmd)291*4882a593Smuzhiyun bfad_iocmd_port_get_attr(struct bfad_s *bfad, void *cmd)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun struct bfa_bsg_port_attr_s *iocmd = (struct bfa_bsg_port_attr_s *)cmd;
294*4882a593Smuzhiyun struct bfa_lport_attr_s port_attr;
295*4882a593Smuzhiyun unsigned long flags;
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
298*4882a593Smuzhiyun bfa_fcport_get_attr(&bfad->bfa, &iocmd->attr);
299*4882a593Smuzhiyun bfa_fcs_lport_get_attr(&bfad->bfa_fcs.fabric.bport, &port_attr);
300*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun if (iocmd->attr.topology != BFA_PORT_TOPOLOGY_NONE)
303*4882a593Smuzhiyun iocmd->attr.pid = port_attr.pid;
304*4882a593Smuzhiyun else
305*4882a593Smuzhiyun iocmd->attr.pid = 0;
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun iocmd->attr.port_type = port_attr.port_type;
308*4882a593Smuzhiyun iocmd->attr.loopback = port_attr.loopback;
309*4882a593Smuzhiyun iocmd->attr.authfail = port_attr.authfail;
310*4882a593Smuzhiyun strlcpy(iocmd->attr.port_symname.symname,
311*4882a593Smuzhiyun port_attr.port_cfg.sym_name.symname,
312*4882a593Smuzhiyun sizeof(iocmd->attr.port_symname.symname));
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
315*4882a593Smuzhiyun return 0;
316*4882a593Smuzhiyun }
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun static int
bfad_iocmd_port_get_stats(struct bfad_s * bfad,void * cmd,unsigned int payload_len)319*4882a593Smuzhiyun bfad_iocmd_port_get_stats(struct bfad_s *bfad, void *cmd,
320*4882a593Smuzhiyun unsigned int payload_len)
321*4882a593Smuzhiyun {
322*4882a593Smuzhiyun struct bfa_bsg_port_stats_s *iocmd = (struct bfa_bsg_port_stats_s *)cmd;
323*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
324*4882a593Smuzhiyun void *iocmd_bufptr;
325*4882a593Smuzhiyun unsigned long flags;
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len,
328*4882a593Smuzhiyun sizeof(struct bfa_bsg_port_stats_s),
329*4882a593Smuzhiyun sizeof(union bfa_port_stats_u)) != BFA_STATUS_OK) {
330*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
331*4882a593Smuzhiyun return 0;
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_port_stats_s);
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun init_completion(&fcomp.comp);
337*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
338*4882a593Smuzhiyun iocmd->status = bfa_port_get_stats(&bfad->bfa.modules.port,
339*4882a593Smuzhiyun iocmd_bufptr, bfad_hcb_comp, &fcomp);
340*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
341*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
342*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
343*4882a593Smuzhiyun goto out;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
347*4882a593Smuzhiyun iocmd->status = fcomp.status;
348*4882a593Smuzhiyun out:
349*4882a593Smuzhiyun return 0;
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun static int
bfad_iocmd_port_reset_stats(struct bfad_s * bfad,void * cmd)353*4882a593Smuzhiyun bfad_iocmd_port_reset_stats(struct bfad_s *bfad, void *cmd)
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
356*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
357*4882a593Smuzhiyun unsigned long flags;
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun init_completion(&fcomp.comp);
360*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
361*4882a593Smuzhiyun iocmd->status = bfa_port_clear_stats(&bfad->bfa.modules.port,
362*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
363*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
364*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
365*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
366*4882a593Smuzhiyun return 0;
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
369*4882a593Smuzhiyun iocmd->status = fcomp.status;
370*4882a593Smuzhiyun return 0;
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun static int
bfad_iocmd_set_port_cfg(struct bfad_s * bfad,void * iocmd,unsigned int v_cmd)374*4882a593Smuzhiyun bfad_iocmd_set_port_cfg(struct bfad_s *bfad, void *iocmd, unsigned int v_cmd)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun struct bfa_bsg_port_cfg_s *cmd = (struct bfa_bsg_port_cfg_s *)iocmd;
377*4882a593Smuzhiyun unsigned long flags;
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
380*4882a593Smuzhiyun if (v_cmd == IOCMD_PORT_CFG_TOPO)
381*4882a593Smuzhiyun cmd->status = bfa_fcport_cfg_topology(&bfad->bfa, cmd->param);
382*4882a593Smuzhiyun else if (v_cmd == IOCMD_PORT_CFG_SPEED)
383*4882a593Smuzhiyun cmd->status = bfa_fcport_cfg_speed(&bfad->bfa, cmd->param);
384*4882a593Smuzhiyun else if (v_cmd == IOCMD_PORT_CFG_ALPA)
385*4882a593Smuzhiyun cmd->status = bfa_fcport_cfg_hardalpa(&bfad->bfa, cmd->param);
386*4882a593Smuzhiyun else if (v_cmd == IOCMD_PORT_CLR_ALPA)
387*4882a593Smuzhiyun cmd->status = bfa_fcport_clr_hardalpa(&bfad->bfa);
388*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun return 0;
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun static int
bfad_iocmd_port_cfg_maxfrsize(struct bfad_s * bfad,void * cmd)394*4882a593Smuzhiyun bfad_iocmd_port_cfg_maxfrsize(struct bfad_s *bfad, void *cmd)
395*4882a593Smuzhiyun {
396*4882a593Smuzhiyun struct bfa_bsg_port_cfg_maxfrsize_s *iocmd =
397*4882a593Smuzhiyun (struct bfa_bsg_port_cfg_maxfrsize_s *)cmd;
398*4882a593Smuzhiyun unsigned long flags;
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
401*4882a593Smuzhiyun iocmd->status = bfa_fcport_cfg_maxfrsize(&bfad->bfa, iocmd->maxfrsize);
402*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun return 0;
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun static int
bfad_iocmd_port_cfg_bbcr(struct bfad_s * bfad,unsigned int cmd,void * pcmd)408*4882a593Smuzhiyun bfad_iocmd_port_cfg_bbcr(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun struct bfa_bsg_bbcr_enable_s *iocmd =
411*4882a593Smuzhiyun (struct bfa_bsg_bbcr_enable_s *)pcmd;
412*4882a593Smuzhiyun unsigned long flags;
413*4882a593Smuzhiyun int rc;
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
416*4882a593Smuzhiyun if (cmd == IOCMD_PORT_BBCR_ENABLE)
417*4882a593Smuzhiyun rc = bfa_fcport_cfg_bbcr(&bfad->bfa, BFA_TRUE, iocmd->bb_scn);
418*4882a593Smuzhiyun else if (cmd == IOCMD_PORT_BBCR_DISABLE)
419*4882a593Smuzhiyun rc = bfa_fcport_cfg_bbcr(&bfad->bfa, BFA_FALSE, 0);
420*4882a593Smuzhiyun else {
421*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
422*4882a593Smuzhiyun return -EINVAL;
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
425*4882a593Smuzhiyun
426*4882a593Smuzhiyun iocmd->status = rc;
427*4882a593Smuzhiyun return 0;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun static int
bfad_iocmd_port_get_bbcr_attr(struct bfad_s * bfad,void * pcmd)431*4882a593Smuzhiyun bfad_iocmd_port_get_bbcr_attr(struct bfad_s *bfad, void *pcmd)
432*4882a593Smuzhiyun {
433*4882a593Smuzhiyun struct bfa_bsg_bbcr_attr_s *iocmd = (struct bfa_bsg_bbcr_attr_s *) pcmd;
434*4882a593Smuzhiyun unsigned long flags;
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
437*4882a593Smuzhiyun iocmd->status =
438*4882a593Smuzhiyun bfa_fcport_get_bbcr_attr(&bfad->bfa, &iocmd->attr);
439*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun return 0;
442*4882a593Smuzhiyun }
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun static int
bfad_iocmd_lport_get_attr(struct bfad_s * bfad,void * cmd)446*4882a593Smuzhiyun bfad_iocmd_lport_get_attr(struct bfad_s *bfad, void *cmd)
447*4882a593Smuzhiyun {
448*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
449*4882a593Smuzhiyun struct bfa_bsg_lport_attr_s *iocmd = (struct bfa_bsg_lport_attr_s *)cmd;
450*4882a593Smuzhiyun unsigned long flags;
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
453*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
454*4882a593Smuzhiyun iocmd->vf_id, iocmd->pwwn);
455*4882a593Smuzhiyun if (fcs_port == NULL) {
456*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
457*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
458*4882a593Smuzhiyun goto out;
459*4882a593Smuzhiyun }
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun bfa_fcs_lport_get_attr(fcs_port, &iocmd->port_attr);
462*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
463*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
464*4882a593Smuzhiyun out:
465*4882a593Smuzhiyun return 0;
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun static int
bfad_iocmd_lport_get_stats(struct bfad_s * bfad,void * cmd)469*4882a593Smuzhiyun bfad_iocmd_lport_get_stats(struct bfad_s *bfad, void *cmd)
470*4882a593Smuzhiyun {
471*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
472*4882a593Smuzhiyun struct bfa_bsg_lport_stats_s *iocmd =
473*4882a593Smuzhiyun (struct bfa_bsg_lport_stats_s *)cmd;
474*4882a593Smuzhiyun unsigned long flags;
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
477*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
478*4882a593Smuzhiyun iocmd->vf_id, iocmd->pwwn);
479*4882a593Smuzhiyun if (fcs_port == NULL) {
480*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
481*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
482*4882a593Smuzhiyun goto out;
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun bfa_fcs_lport_get_stats(fcs_port, &iocmd->port_stats);
486*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
487*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
488*4882a593Smuzhiyun out:
489*4882a593Smuzhiyun return 0;
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun static int
bfad_iocmd_lport_reset_stats(struct bfad_s * bfad,void * cmd)493*4882a593Smuzhiyun bfad_iocmd_lport_reset_stats(struct bfad_s *bfad, void *cmd)
494*4882a593Smuzhiyun {
495*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
496*4882a593Smuzhiyun struct bfa_bsg_reset_stats_s *iocmd =
497*4882a593Smuzhiyun (struct bfa_bsg_reset_stats_s *)cmd;
498*4882a593Smuzhiyun struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
499*4882a593Smuzhiyun struct list_head *qe, *qen;
500*4882a593Smuzhiyun struct bfa_itnim_s *itnim;
501*4882a593Smuzhiyun unsigned long flags;
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
504*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
505*4882a593Smuzhiyun iocmd->vf_id, iocmd->vpwwn);
506*4882a593Smuzhiyun if (fcs_port == NULL) {
507*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
508*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
509*4882a593Smuzhiyun goto out;
510*4882a593Smuzhiyun }
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun bfa_fcs_lport_clear_stats(fcs_port);
513*4882a593Smuzhiyun /* clear IO stats from all active itnims */
514*4882a593Smuzhiyun list_for_each_safe(qe, qen, &fcpim->itnim_q) {
515*4882a593Smuzhiyun itnim = (struct bfa_itnim_s *) qe;
516*4882a593Smuzhiyun if (itnim->rport->rport_info.lp_tag != fcs_port->lp_tag)
517*4882a593Smuzhiyun continue;
518*4882a593Smuzhiyun bfa_itnim_clear_stats(itnim);
519*4882a593Smuzhiyun }
520*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
521*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
522*4882a593Smuzhiyun out:
523*4882a593Smuzhiyun return 0;
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun static int
bfad_iocmd_lport_get_iostats(struct bfad_s * bfad,void * cmd)527*4882a593Smuzhiyun bfad_iocmd_lport_get_iostats(struct bfad_s *bfad, void *cmd)
528*4882a593Smuzhiyun {
529*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
530*4882a593Smuzhiyun struct bfa_bsg_lport_iostats_s *iocmd =
531*4882a593Smuzhiyun (struct bfa_bsg_lport_iostats_s *)cmd;
532*4882a593Smuzhiyun unsigned long flags;
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
535*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
536*4882a593Smuzhiyun iocmd->vf_id, iocmd->pwwn);
537*4882a593Smuzhiyun if (fcs_port == NULL) {
538*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
539*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
540*4882a593Smuzhiyun goto out;
541*4882a593Smuzhiyun }
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun bfa_fcpim_port_iostats(&bfad->bfa, &iocmd->iostats,
544*4882a593Smuzhiyun fcs_port->lp_tag);
545*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
546*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
547*4882a593Smuzhiyun out:
548*4882a593Smuzhiyun return 0;
549*4882a593Smuzhiyun }
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun static int
bfad_iocmd_lport_get_rports(struct bfad_s * bfad,void * cmd,unsigned int payload_len)552*4882a593Smuzhiyun bfad_iocmd_lport_get_rports(struct bfad_s *bfad, void *cmd,
553*4882a593Smuzhiyun unsigned int payload_len)
554*4882a593Smuzhiyun {
555*4882a593Smuzhiyun struct bfa_bsg_lport_get_rports_s *iocmd =
556*4882a593Smuzhiyun (struct bfa_bsg_lport_get_rports_s *)cmd;
557*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
558*4882a593Smuzhiyun unsigned long flags;
559*4882a593Smuzhiyun void *iocmd_bufptr;
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun if (iocmd->nrports == 0)
562*4882a593Smuzhiyun return -EINVAL;
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len,
565*4882a593Smuzhiyun sizeof(struct bfa_bsg_lport_get_rports_s),
566*4882a593Smuzhiyun sizeof(struct bfa_rport_qualifier_s) * iocmd->nrports)
567*4882a593Smuzhiyun != BFA_STATUS_OK) {
568*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
569*4882a593Smuzhiyun return 0;
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd +
573*4882a593Smuzhiyun sizeof(struct bfa_bsg_lport_get_rports_s);
574*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
575*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
576*4882a593Smuzhiyun iocmd->vf_id, iocmd->pwwn);
577*4882a593Smuzhiyun if (fcs_port == NULL) {
578*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
579*4882a593Smuzhiyun bfa_trc(bfad, 0);
580*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
581*4882a593Smuzhiyun goto out;
582*4882a593Smuzhiyun }
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun bfa_fcs_lport_get_rport_quals(fcs_port,
585*4882a593Smuzhiyun (struct bfa_rport_qualifier_s *)iocmd_bufptr,
586*4882a593Smuzhiyun &iocmd->nrports);
587*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
588*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
589*4882a593Smuzhiyun out:
590*4882a593Smuzhiyun return 0;
591*4882a593Smuzhiyun }
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun static int
bfad_iocmd_rport_get_attr(struct bfad_s * bfad,void * cmd)594*4882a593Smuzhiyun bfad_iocmd_rport_get_attr(struct bfad_s *bfad, void *cmd)
595*4882a593Smuzhiyun {
596*4882a593Smuzhiyun struct bfa_bsg_rport_attr_s *iocmd = (struct bfa_bsg_rport_attr_s *)cmd;
597*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
598*4882a593Smuzhiyun struct bfa_fcs_rport_s *fcs_rport;
599*4882a593Smuzhiyun unsigned long flags;
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
602*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
603*4882a593Smuzhiyun iocmd->vf_id, iocmd->pwwn);
604*4882a593Smuzhiyun if (fcs_port == NULL) {
605*4882a593Smuzhiyun bfa_trc(bfad, 0);
606*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
607*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
608*4882a593Smuzhiyun goto out;
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun if (iocmd->pid)
612*4882a593Smuzhiyun fcs_rport = bfa_fcs_lport_get_rport_by_qualifier(fcs_port,
613*4882a593Smuzhiyun iocmd->rpwwn, iocmd->pid);
614*4882a593Smuzhiyun else
615*4882a593Smuzhiyun fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
616*4882a593Smuzhiyun if (fcs_rport == NULL) {
617*4882a593Smuzhiyun bfa_trc(bfad, 0);
618*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
619*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
620*4882a593Smuzhiyun goto out;
621*4882a593Smuzhiyun }
622*4882a593Smuzhiyun
623*4882a593Smuzhiyun bfa_fcs_rport_get_attr(fcs_rport, &iocmd->attr);
624*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
625*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
626*4882a593Smuzhiyun out:
627*4882a593Smuzhiyun return 0;
628*4882a593Smuzhiyun }
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun static int
bfad_iocmd_rport_get_addr(struct bfad_s * bfad,void * cmd)631*4882a593Smuzhiyun bfad_iocmd_rport_get_addr(struct bfad_s *bfad, void *cmd)
632*4882a593Smuzhiyun {
633*4882a593Smuzhiyun struct bfa_bsg_rport_scsi_addr_s *iocmd =
634*4882a593Smuzhiyun (struct bfa_bsg_rport_scsi_addr_s *)cmd;
635*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
636*4882a593Smuzhiyun struct bfa_fcs_itnim_s *fcs_itnim;
637*4882a593Smuzhiyun struct bfad_itnim_s *drv_itnim;
638*4882a593Smuzhiyun unsigned long flags;
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
641*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
642*4882a593Smuzhiyun iocmd->vf_id, iocmd->pwwn);
643*4882a593Smuzhiyun if (fcs_port == NULL) {
644*4882a593Smuzhiyun bfa_trc(bfad, 0);
645*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
646*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
647*4882a593Smuzhiyun goto out;
648*4882a593Smuzhiyun }
649*4882a593Smuzhiyun
650*4882a593Smuzhiyun fcs_itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
651*4882a593Smuzhiyun if (fcs_itnim == NULL) {
652*4882a593Smuzhiyun bfa_trc(bfad, 0);
653*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
654*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
655*4882a593Smuzhiyun goto out;
656*4882a593Smuzhiyun }
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun drv_itnim = fcs_itnim->itnim_drv;
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun if (drv_itnim && drv_itnim->im_port)
661*4882a593Smuzhiyun iocmd->host = drv_itnim->im_port->shost->host_no;
662*4882a593Smuzhiyun else {
663*4882a593Smuzhiyun bfa_trc(bfad, 0);
664*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
665*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
666*4882a593Smuzhiyun goto out;
667*4882a593Smuzhiyun }
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun iocmd->target = drv_itnim->scsi_tgt_id;
670*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun iocmd->bus = 0;
673*4882a593Smuzhiyun iocmd->lun = 0;
674*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
675*4882a593Smuzhiyun out:
676*4882a593Smuzhiyun return 0;
677*4882a593Smuzhiyun }
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun static int
bfad_iocmd_rport_get_stats(struct bfad_s * bfad,void * cmd)680*4882a593Smuzhiyun bfad_iocmd_rport_get_stats(struct bfad_s *bfad, void *cmd)
681*4882a593Smuzhiyun {
682*4882a593Smuzhiyun struct bfa_bsg_rport_stats_s *iocmd =
683*4882a593Smuzhiyun (struct bfa_bsg_rport_stats_s *)cmd;
684*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
685*4882a593Smuzhiyun struct bfa_fcs_rport_s *fcs_rport;
686*4882a593Smuzhiyun unsigned long flags;
687*4882a593Smuzhiyun
688*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
689*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
690*4882a593Smuzhiyun iocmd->vf_id, iocmd->pwwn);
691*4882a593Smuzhiyun if (fcs_port == NULL) {
692*4882a593Smuzhiyun bfa_trc(bfad, 0);
693*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
694*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
695*4882a593Smuzhiyun goto out;
696*4882a593Smuzhiyun }
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
699*4882a593Smuzhiyun if (fcs_rport == NULL) {
700*4882a593Smuzhiyun bfa_trc(bfad, 0);
701*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
702*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
703*4882a593Smuzhiyun goto out;
704*4882a593Smuzhiyun }
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun memcpy((void *)&iocmd->stats, (void *)&fcs_rport->stats,
707*4882a593Smuzhiyun sizeof(struct bfa_rport_stats_s));
708*4882a593Smuzhiyun if (bfa_fcs_rport_get_halrport(fcs_rport)) {
709*4882a593Smuzhiyun memcpy((void *)&iocmd->stats.hal_stats,
710*4882a593Smuzhiyun (void *)&(bfa_fcs_rport_get_halrport(fcs_rport)->stats),
711*4882a593Smuzhiyun sizeof(struct bfa_rport_hal_stats_s));
712*4882a593Smuzhiyun }
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
715*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
716*4882a593Smuzhiyun out:
717*4882a593Smuzhiyun return 0;
718*4882a593Smuzhiyun }
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun static int
bfad_iocmd_rport_clr_stats(struct bfad_s * bfad,void * cmd)721*4882a593Smuzhiyun bfad_iocmd_rport_clr_stats(struct bfad_s *bfad, void *cmd)
722*4882a593Smuzhiyun {
723*4882a593Smuzhiyun struct bfa_bsg_rport_reset_stats_s *iocmd =
724*4882a593Smuzhiyun (struct bfa_bsg_rport_reset_stats_s *)cmd;
725*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
726*4882a593Smuzhiyun struct bfa_fcs_rport_s *fcs_rport;
727*4882a593Smuzhiyun struct bfa_rport_s *rport;
728*4882a593Smuzhiyun unsigned long flags;
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
731*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
732*4882a593Smuzhiyun iocmd->vf_id, iocmd->pwwn);
733*4882a593Smuzhiyun if (fcs_port == NULL) {
734*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
735*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
736*4882a593Smuzhiyun goto out;
737*4882a593Smuzhiyun }
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
740*4882a593Smuzhiyun if (fcs_rport == NULL) {
741*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
742*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
743*4882a593Smuzhiyun goto out;
744*4882a593Smuzhiyun }
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun memset((char *)&fcs_rport->stats, 0, sizeof(struct bfa_rport_stats_s));
747*4882a593Smuzhiyun rport = bfa_fcs_rport_get_halrport(fcs_rport);
748*4882a593Smuzhiyun if (rport)
749*4882a593Smuzhiyun memset(&rport->stats, 0, sizeof(rport->stats));
750*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
751*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
752*4882a593Smuzhiyun out:
753*4882a593Smuzhiyun return 0;
754*4882a593Smuzhiyun }
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun static int
bfad_iocmd_rport_set_speed(struct bfad_s * bfad,void * cmd)757*4882a593Smuzhiyun bfad_iocmd_rport_set_speed(struct bfad_s *bfad, void *cmd)
758*4882a593Smuzhiyun {
759*4882a593Smuzhiyun struct bfa_bsg_rport_set_speed_s *iocmd =
760*4882a593Smuzhiyun (struct bfa_bsg_rport_set_speed_s *)cmd;
761*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
762*4882a593Smuzhiyun struct bfa_fcs_rport_s *fcs_rport;
763*4882a593Smuzhiyun unsigned long flags;
764*4882a593Smuzhiyun
765*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
766*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
767*4882a593Smuzhiyun iocmd->vf_id, iocmd->pwwn);
768*4882a593Smuzhiyun if (fcs_port == NULL) {
769*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
770*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
771*4882a593Smuzhiyun goto out;
772*4882a593Smuzhiyun }
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
775*4882a593Smuzhiyun if (fcs_rport == NULL) {
776*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
777*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
778*4882a593Smuzhiyun goto out;
779*4882a593Smuzhiyun }
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun fcs_rport->rpf.assigned_speed = iocmd->speed;
782*4882a593Smuzhiyun /* Set this speed in f/w only if the RPSC speed is not available */
783*4882a593Smuzhiyun if (fcs_rport->rpf.rpsc_speed == BFA_PORT_SPEED_UNKNOWN)
784*4882a593Smuzhiyun if (fcs_rport->bfa_rport)
785*4882a593Smuzhiyun bfa_rport_speed(fcs_rport->bfa_rport, iocmd->speed);
786*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
787*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
788*4882a593Smuzhiyun out:
789*4882a593Smuzhiyun return 0;
790*4882a593Smuzhiyun }
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun static int
bfad_iocmd_vport_get_attr(struct bfad_s * bfad,void * cmd)793*4882a593Smuzhiyun bfad_iocmd_vport_get_attr(struct bfad_s *bfad, void *cmd)
794*4882a593Smuzhiyun {
795*4882a593Smuzhiyun struct bfa_fcs_vport_s *fcs_vport;
796*4882a593Smuzhiyun struct bfa_bsg_vport_attr_s *iocmd = (struct bfa_bsg_vport_attr_s *)cmd;
797*4882a593Smuzhiyun unsigned long flags;
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
800*4882a593Smuzhiyun fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs,
801*4882a593Smuzhiyun iocmd->vf_id, iocmd->vpwwn);
802*4882a593Smuzhiyun if (fcs_vport == NULL) {
803*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
804*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_VWWN;
805*4882a593Smuzhiyun goto out;
806*4882a593Smuzhiyun }
807*4882a593Smuzhiyun
808*4882a593Smuzhiyun bfa_fcs_vport_get_attr(fcs_vport, &iocmd->vport_attr);
809*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
810*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
811*4882a593Smuzhiyun out:
812*4882a593Smuzhiyun return 0;
813*4882a593Smuzhiyun }
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun static int
bfad_iocmd_vport_get_stats(struct bfad_s * bfad,void * cmd)816*4882a593Smuzhiyun bfad_iocmd_vport_get_stats(struct bfad_s *bfad, void *cmd)
817*4882a593Smuzhiyun {
818*4882a593Smuzhiyun struct bfa_fcs_vport_s *fcs_vport;
819*4882a593Smuzhiyun struct bfa_bsg_vport_stats_s *iocmd =
820*4882a593Smuzhiyun (struct bfa_bsg_vport_stats_s *)cmd;
821*4882a593Smuzhiyun unsigned long flags;
822*4882a593Smuzhiyun
823*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
824*4882a593Smuzhiyun fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs,
825*4882a593Smuzhiyun iocmd->vf_id, iocmd->vpwwn);
826*4882a593Smuzhiyun if (fcs_vport == NULL) {
827*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
828*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_VWWN;
829*4882a593Smuzhiyun goto out;
830*4882a593Smuzhiyun }
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun memcpy((void *)&iocmd->vport_stats, (void *)&fcs_vport->vport_stats,
833*4882a593Smuzhiyun sizeof(struct bfa_vport_stats_s));
834*4882a593Smuzhiyun memcpy((void *)&iocmd->vport_stats.port_stats,
835*4882a593Smuzhiyun (void *)&fcs_vport->lport.stats,
836*4882a593Smuzhiyun sizeof(struct bfa_lport_stats_s));
837*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
838*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
839*4882a593Smuzhiyun out:
840*4882a593Smuzhiyun return 0;
841*4882a593Smuzhiyun }
842*4882a593Smuzhiyun
843*4882a593Smuzhiyun static int
bfad_iocmd_vport_clr_stats(struct bfad_s * bfad,void * cmd)844*4882a593Smuzhiyun bfad_iocmd_vport_clr_stats(struct bfad_s *bfad, void *cmd)
845*4882a593Smuzhiyun {
846*4882a593Smuzhiyun struct bfa_fcs_vport_s *fcs_vport;
847*4882a593Smuzhiyun struct bfa_bsg_reset_stats_s *iocmd =
848*4882a593Smuzhiyun (struct bfa_bsg_reset_stats_s *)cmd;
849*4882a593Smuzhiyun unsigned long flags;
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
852*4882a593Smuzhiyun fcs_vport = bfa_fcs_vport_lookup(&bfad->bfa_fcs,
853*4882a593Smuzhiyun iocmd->vf_id, iocmd->vpwwn);
854*4882a593Smuzhiyun if (fcs_vport == NULL) {
855*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
856*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_VWWN;
857*4882a593Smuzhiyun goto out;
858*4882a593Smuzhiyun }
859*4882a593Smuzhiyun
860*4882a593Smuzhiyun memset(&fcs_vport->vport_stats, 0, sizeof(struct bfa_vport_stats_s));
861*4882a593Smuzhiyun memset(&fcs_vport->lport.stats, 0, sizeof(struct bfa_lport_stats_s));
862*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
863*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
864*4882a593Smuzhiyun out:
865*4882a593Smuzhiyun return 0;
866*4882a593Smuzhiyun }
867*4882a593Smuzhiyun
868*4882a593Smuzhiyun static int
bfad_iocmd_fabric_get_lports(struct bfad_s * bfad,void * cmd,unsigned int payload_len)869*4882a593Smuzhiyun bfad_iocmd_fabric_get_lports(struct bfad_s *bfad, void *cmd,
870*4882a593Smuzhiyun unsigned int payload_len)
871*4882a593Smuzhiyun {
872*4882a593Smuzhiyun struct bfa_bsg_fabric_get_lports_s *iocmd =
873*4882a593Smuzhiyun (struct bfa_bsg_fabric_get_lports_s *)cmd;
874*4882a593Smuzhiyun bfa_fcs_vf_t *fcs_vf;
875*4882a593Smuzhiyun uint32_t nports = iocmd->nports;
876*4882a593Smuzhiyun unsigned long flags;
877*4882a593Smuzhiyun void *iocmd_bufptr;
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun if (nports == 0) {
880*4882a593Smuzhiyun iocmd->status = BFA_STATUS_EINVAL;
881*4882a593Smuzhiyun goto out;
882*4882a593Smuzhiyun }
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len,
885*4882a593Smuzhiyun sizeof(struct bfa_bsg_fabric_get_lports_s),
886*4882a593Smuzhiyun sizeof(wwn_t) * iocmd->nports) != BFA_STATUS_OK) {
887*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
888*4882a593Smuzhiyun goto out;
889*4882a593Smuzhiyun }
890*4882a593Smuzhiyun
891*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd +
892*4882a593Smuzhiyun sizeof(struct bfa_bsg_fabric_get_lports_s);
893*4882a593Smuzhiyun
894*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
895*4882a593Smuzhiyun fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id);
896*4882a593Smuzhiyun if (fcs_vf == NULL) {
897*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
898*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_VFID;
899*4882a593Smuzhiyun goto out;
900*4882a593Smuzhiyun }
901*4882a593Smuzhiyun bfa_fcs_vf_get_ports(fcs_vf, (wwn_t *)iocmd_bufptr, &nports);
902*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
903*4882a593Smuzhiyun
904*4882a593Smuzhiyun iocmd->nports = nports;
905*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
906*4882a593Smuzhiyun out:
907*4882a593Smuzhiyun return 0;
908*4882a593Smuzhiyun }
909*4882a593Smuzhiyun
910*4882a593Smuzhiyun static int
bfad_iocmd_qos_set_bw(struct bfad_s * bfad,void * pcmd)911*4882a593Smuzhiyun bfad_iocmd_qos_set_bw(struct bfad_s *bfad, void *pcmd)
912*4882a593Smuzhiyun {
913*4882a593Smuzhiyun struct bfa_bsg_qos_bw_s *iocmd = (struct bfa_bsg_qos_bw_s *)pcmd;
914*4882a593Smuzhiyun unsigned long flags;
915*4882a593Smuzhiyun
916*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
917*4882a593Smuzhiyun iocmd->status = bfa_fcport_set_qos_bw(&bfad->bfa, &iocmd->qos_bw);
918*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
919*4882a593Smuzhiyun
920*4882a593Smuzhiyun return 0;
921*4882a593Smuzhiyun }
922*4882a593Smuzhiyun
923*4882a593Smuzhiyun static int
bfad_iocmd_ratelim(struct bfad_s * bfad,unsigned int cmd,void * pcmd)924*4882a593Smuzhiyun bfad_iocmd_ratelim(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
925*4882a593Smuzhiyun {
926*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
927*4882a593Smuzhiyun struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
928*4882a593Smuzhiyun unsigned long flags;
929*4882a593Smuzhiyun
930*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
931*4882a593Smuzhiyun
932*4882a593Smuzhiyun if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
933*4882a593Smuzhiyun (fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
934*4882a593Smuzhiyun iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
935*4882a593Smuzhiyun else {
936*4882a593Smuzhiyun if (cmd == IOCMD_RATELIM_ENABLE)
937*4882a593Smuzhiyun fcport->cfg.ratelimit = BFA_TRUE;
938*4882a593Smuzhiyun else if (cmd == IOCMD_RATELIM_DISABLE)
939*4882a593Smuzhiyun fcport->cfg.ratelimit = BFA_FALSE;
940*4882a593Smuzhiyun
941*4882a593Smuzhiyun if (fcport->cfg.trl_def_speed == BFA_PORT_SPEED_UNKNOWN)
942*4882a593Smuzhiyun fcport->cfg.trl_def_speed = BFA_PORT_SPEED_1GBPS;
943*4882a593Smuzhiyun
944*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
945*4882a593Smuzhiyun }
946*4882a593Smuzhiyun
947*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
948*4882a593Smuzhiyun
949*4882a593Smuzhiyun return 0;
950*4882a593Smuzhiyun }
951*4882a593Smuzhiyun
952*4882a593Smuzhiyun static int
bfad_iocmd_ratelim_speed(struct bfad_s * bfad,unsigned int cmd,void * pcmd)953*4882a593Smuzhiyun bfad_iocmd_ratelim_speed(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
954*4882a593Smuzhiyun {
955*4882a593Smuzhiyun struct bfa_bsg_trl_speed_s *iocmd = (struct bfa_bsg_trl_speed_s *)pcmd;
956*4882a593Smuzhiyun struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
957*4882a593Smuzhiyun unsigned long flags;
958*4882a593Smuzhiyun
959*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
960*4882a593Smuzhiyun
961*4882a593Smuzhiyun /* Auto and speeds greater than the supported speed, are invalid */
962*4882a593Smuzhiyun if ((iocmd->speed == BFA_PORT_SPEED_AUTO) ||
963*4882a593Smuzhiyun (iocmd->speed > fcport->speed_sup)) {
964*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNSUPP_SPEED;
965*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
966*4882a593Smuzhiyun return 0;
967*4882a593Smuzhiyun }
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
970*4882a593Smuzhiyun (fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
971*4882a593Smuzhiyun iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
972*4882a593Smuzhiyun else {
973*4882a593Smuzhiyun fcport->cfg.trl_def_speed = iocmd->speed;
974*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
975*4882a593Smuzhiyun }
976*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
977*4882a593Smuzhiyun
978*4882a593Smuzhiyun return 0;
979*4882a593Smuzhiyun }
980*4882a593Smuzhiyun
981*4882a593Smuzhiyun static int
bfad_iocmd_cfg_fcpim(struct bfad_s * bfad,void * cmd)982*4882a593Smuzhiyun bfad_iocmd_cfg_fcpim(struct bfad_s *bfad, void *cmd)
983*4882a593Smuzhiyun {
984*4882a593Smuzhiyun struct bfa_bsg_fcpim_s *iocmd = (struct bfa_bsg_fcpim_s *)cmd;
985*4882a593Smuzhiyun unsigned long flags;
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
988*4882a593Smuzhiyun bfa_fcpim_path_tov_set(&bfad->bfa, iocmd->param);
989*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
990*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
991*4882a593Smuzhiyun return 0;
992*4882a593Smuzhiyun }
993*4882a593Smuzhiyun
994*4882a593Smuzhiyun static int
bfad_iocmd_fcpim_get_modstats(struct bfad_s * bfad,void * cmd)995*4882a593Smuzhiyun bfad_iocmd_fcpim_get_modstats(struct bfad_s *bfad, void *cmd)
996*4882a593Smuzhiyun {
997*4882a593Smuzhiyun struct bfa_bsg_fcpim_modstats_s *iocmd =
998*4882a593Smuzhiyun (struct bfa_bsg_fcpim_modstats_s *)cmd;
999*4882a593Smuzhiyun struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
1000*4882a593Smuzhiyun struct list_head *qe, *qen;
1001*4882a593Smuzhiyun struct bfa_itnim_s *itnim;
1002*4882a593Smuzhiyun unsigned long flags;
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1005*4882a593Smuzhiyun /* accumulate IO stats from itnim */
1006*4882a593Smuzhiyun memset((void *)&iocmd->modstats, 0, sizeof(struct bfa_itnim_iostats_s));
1007*4882a593Smuzhiyun list_for_each_safe(qe, qen, &fcpim->itnim_q) {
1008*4882a593Smuzhiyun itnim = (struct bfa_itnim_s *) qe;
1009*4882a593Smuzhiyun bfa_fcpim_add_stats(&iocmd->modstats, &(itnim->stats));
1010*4882a593Smuzhiyun }
1011*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1012*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
1013*4882a593Smuzhiyun return 0;
1014*4882a593Smuzhiyun }
1015*4882a593Smuzhiyun
1016*4882a593Smuzhiyun static int
bfad_iocmd_fcpim_clr_modstats(struct bfad_s * bfad,void * cmd)1017*4882a593Smuzhiyun bfad_iocmd_fcpim_clr_modstats(struct bfad_s *bfad, void *cmd)
1018*4882a593Smuzhiyun {
1019*4882a593Smuzhiyun struct bfa_bsg_fcpim_modstatsclr_s *iocmd =
1020*4882a593Smuzhiyun (struct bfa_bsg_fcpim_modstatsclr_s *)cmd;
1021*4882a593Smuzhiyun struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
1022*4882a593Smuzhiyun struct list_head *qe, *qen;
1023*4882a593Smuzhiyun struct bfa_itnim_s *itnim;
1024*4882a593Smuzhiyun unsigned long flags;
1025*4882a593Smuzhiyun
1026*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1027*4882a593Smuzhiyun list_for_each_safe(qe, qen, &fcpim->itnim_q) {
1028*4882a593Smuzhiyun itnim = (struct bfa_itnim_s *) qe;
1029*4882a593Smuzhiyun bfa_itnim_clear_stats(itnim);
1030*4882a593Smuzhiyun }
1031*4882a593Smuzhiyun memset(&fcpim->del_itn_stats, 0,
1032*4882a593Smuzhiyun sizeof(struct bfa_fcpim_del_itn_stats_s));
1033*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1034*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
1035*4882a593Smuzhiyun return 0;
1036*4882a593Smuzhiyun }
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun static int
bfad_iocmd_fcpim_get_del_itn_stats(struct bfad_s * bfad,void * cmd)1039*4882a593Smuzhiyun bfad_iocmd_fcpim_get_del_itn_stats(struct bfad_s *bfad, void *cmd)
1040*4882a593Smuzhiyun {
1041*4882a593Smuzhiyun struct bfa_bsg_fcpim_del_itn_stats_s *iocmd =
1042*4882a593Smuzhiyun (struct bfa_bsg_fcpim_del_itn_stats_s *)cmd;
1043*4882a593Smuzhiyun struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
1044*4882a593Smuzhiyun unsigned long flags;
1045*4882a593Smuzhiyun
1046*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1047*4882a593Smuzhiyun memcpy((void *)&iocmd->modstats, (void *)&fcpim->del_itn_stats,
1048*4882a593Smuzhiyun sizeof(struct bfa_fcpim_del_itn_stats_s));
1049*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
1052*4882a593Smuzhiyun return 0;
1053*4882a593Smuzhiyun }
1054*4882a593Smuzhiyun
1055*4882a593Smuzhiyun static int
bfad_iocmd_itnim_get_attr(struct bfad_s * bfad,void * cmd)1056*4882a593Smuzhiyun bfad_iocmd_itnim_get_attr(struct bfad_s *bfad, void *cmd)
1057*4882a593Smuzhiyun {
1058*4882a593Smuzhiyun struct bfa_bsg_itnim_attr_s *iocmd = (struct bfa_bsg_itnim_attr_s *)cmd;
1059*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
1060*4882a593Smuzhiyun unsigned long flags;
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1063*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
1064*4882a593Smuzhiyun iocmd->vf_id, iocmd->lpwwn);
1065*4882a593Smuzhiyun if (!fcs_port)
1066*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
1067*4882a593Smuzhiyun else
1068*4882a593Smuzhiyun iocmd->status = bfa_fcs_itnim_attr_get(fcs_port,
1069*4882a593Smuzhiyun iocmd->rpwwn, &iocmd->attr);
1070*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1071*4882a593Smuzhiyun return 0;
1072*4882a593Smuzhiyun }
1073*4882a593Smuzhiyun
1074*4882a593Smuzhiyun static int
bfad_iocmd_itnim_get_iostats(struct bfad_s * bfad,void * cmd)1075*4882a593Smuzhiyun bfad_iocmd_itnim_get_iostats(struct bfad_s *bfad, void *cmd)
1076*4882a593Smuzhiyun {
1077*4882a593Smuzhiyun struct bfa_bsg_itnim_iostats_s *iocmd =
1078*4882a593Smuzhiyun (struct bfa_bsg_itnim_iostats_s *)cmd;
1079*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
1080*4882a593Smuzhiyun struct bfa_fcs_itnim_s *itnim;
1081*4882a593Smuzhiyun unsigned long flags;
1082*4882a593Smuzhiyun
1083*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1084*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
1085*4882a593Smuzhiyun iocmd->vf_id, iocmd->lpwwn);
1086*4882a593Smuzhiyun if (!fcs_port) {
1087*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
1088*4882a593Smuzhiyun bfa_trc(bfad, 0);
1089*4882a593Smuzhiyun } else {
1090*4882a593Smuzhiyun itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
1091*4882a593Smuzhiyun if (itnim == NULL)
1092*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
1093*4882a593Smuzhiyun else {
1094*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
1095*4882a593Smuzhiyun if (bfa_fcs_itnim_get_halitn(itnim))
1096*4882a593Smuzhiyun memcpy((void *)&iocmd->iostats, (void *)
1097*4882a593Smuzhiyun &(bfa_fcs_itnim_get_halitn(itnim)->stats),
1098*4882a593Smuzhiyun sizeof(struct bfa_itnim_iostats_s));
1099*4882a593Smuzhiyun }
1100*4882a593Smuzhiyun }
1101*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1102*4882a593Smuzhiyun return 0;
1103*4882a593Smuzhiyun }
1104*4882a593Smuzhiyun
1105*4882a593Smuzhiyun static int
bfad_iocmd_itnim_reset_stats(struct bfad_s * bfad,void * cmd)1106*4882a593Smuzhiyun bfad_iocmd_itnim_reset_stats(struct bfad_s *bfad, void *cmd)
1107*4882a593Smuzhiyun {
1108*4882a593Smuzhiyun struct bfa_bsg_rport_reset_stats_s *iocmd =
1109*4882a593Smuzhiyun (struct bfa_bsg_rport_reset_stats_s *)cmd;
1110*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
1111*4882a593Smuzhiyun struct bfa_fcs_itnim_s *itnim;
1112*4882a593Smuzhiyun unsigned long flags;
1113*4882a593Smuzhiyun
1114*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1115*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
1116*4882a593Smuzhiyun iocmd->vf_id, iocmd->pwwn);
1117*4882a593Smuzhiyun if (!fcs_port)
1118*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
1119*4882a593Smuzhiyun else {
1120*4882a593Smuzhiyun itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
1121*4882a593Smuzhiyun if (itnim == NULL)
1122*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
1123*4882a593Smuzhiyun else {
1124*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
1125*4882a593Smuzhiyun bfa_fcs_itnim_stats_clear(fcs_port, iocmd->rpwwn);
1126*4882a593Smuzhiyun bfa_itnim_clear_stats(bfa_fcs_itnim_get_halitn(itnim));
1127*4882a593Smuzhiyun }
1128*4882a593Smuzhiyun }
1129*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1130*4882a593Smuzhiyun
1131*4882a593Smuzhiyun return 0;
1132*4882a593Smuzhiyun }
1133*4882a593Smuzhiyun
1134*4882a593Smuzhiyun static int
bfad_iocmd_itnim_get_itnstats(struct bfad_s * bfad,void * cmd)1135*4882a593Smuzhiyun bfad_iocmd_itnim_get_itnstats(struct bfad_s *bfad, void *cmd)
1136*4882a593Smuzhiyun {
1137*4882a593Smuzhiyun struct bfa_bsg_itnim_itnstats_s *iocmd =
1138*4882a593Smuzhiyun (struct bfa_bsg_itnim_itnstats_s *)cmd;
1139*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
1140*4882a593Smuzhiyun struct bfa_fcs_itnim_s *itnim;
1141*4882a593Smuzhiyun unsigned long flags;
1142*4882a593Smuzhiyun
1143*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1144*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
1145*4882a593Smuzhiyun iocmd->vf_id, iocmd->lpwwn);
1146*4882a593Smuzhiyun if (!fcs_port) {
1147*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
1148*4882a593Smuzhiyun bfa_trc(bfad, 0);
1149*4882a593Smuzhiyun } else {
1150*4882a593Smuzhiyun itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
1151*4882a593Smuzhiyun if (itnim == NULL)
1152*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
1153*4882a593Smuzhiyun else {
1154*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
1155*4882a593Smuzhiyun bfa_fcs_itnim_stats_get(fcs_port, iocmd->rpwwn,
1156*4882a593Smuzhiyun &iocmd->itnstats);
1157*4882a593Smuzhiyun }
1158*4882a593Smuzhiyun }
1159*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1160*4882a593Smuzhiyun return 0;
1161*4882a593Smuzhiyun }
1162*4882a593Smuzhiyun
1163*4882a593Smuzhiyun static int
bfad_iocmd_fcport_enable(struct bfad_s * bfad,void * cmd)1164*4882a593Smuzhiyun bfad_iocmd_fcport_enable(struct bfad_s *bfad, void *cmd)
1165*4882a593Smuzhiyun {
1166*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
1167*4882a593Smuzhiyun unsigned long flags;
1168*4882a593Smuzhiyun
1169*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1170*4882a593Smuzhiyun iocmd->status = bfa_fcport_enable(&bfad->bfa);
1171*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1172*4882a593Smuzhiyun
1173*4882a593Smuzhiyun return 0;
1174*4882a593Smuzhiyun }
1175*4882a593Smuzhiyun
1176*4882a593Smuzhiyun static int
bfad_iocmd_fcport_disable(struct bfad_s * bfad,void * cmd)1177*4882a593Smuzhiyun bfad_iocmd_fcport_disable(struct bfad_s *bfad, void *cmd)
1178*4882a593Smuzhiyun {
1179*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
1180*4882a593Smuzhiyun unsigned long flags;
1181*4882a593Smuzhiyun
1182*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1183*4882a593Smuzhiyun iocmd->status = bfa_fcport_disable(&bfad->bfa);
1184*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun return 0;
1187*4882a593Smuzhiyun }
1188*4882a593Smuzhiyun
1189*4882a593Smuzhiyun static int
bfad_iocmd_ioc_get_pcifn_cfg(struct bfad_s * bfad,void * cmd)1190*4882a593Smuzhiyun bfad_iocmd_ioc_get_pcifn_cfg(struct bfad_s *bfad, void *cmd)
1191*4882a593Smuzhiyun {
1192*4882a593Smuzhiyun struct bfa_bsg_pcifn_cfg_s *iocmd = (struct bfa_bsg_pcifn_cfg_s *)cmd;
1193*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1194*4882a593Smuzhiyun unsigned long flags;
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun init_completion(&fcomp.comp);
1197*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1198*4882a593Smuzhiyun iocmd->status = bfa_ablk_query(&bfad->bfa.modules.ablk,
1199*4882a593Smuzhiyun &iocmd->pcifn_cfg,
1200*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1201*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1202*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1203*4882a593Smuzhiyun goto out;
1204*4882a593Smuzhiyun
1205*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1206*4882a593Smuzhiyun iocmd->status = fcomp.status;
1207*4882a593Smuzhiyun out:
1208*4882a593Smuzhiyun return 0;
1209*4882a593Smuzhiyun }
1210*4882a593Smuzhiyun
1211*4882a593Smuzhiyun static int
bfad_iocmd_pcifn_create(struct bfad_s * bfad,void * cmd)1212*4882a593Smuzhiyun bfad_iocmd_pcifn_create(struct bfad_s *bfad, void *cmd)
1213*4882a593Smuzhiyun {
1214*4882a593Smuzhiyun struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
1215*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1216*4882a593Smuzhiyun unsigned long flags;
1217*4882a593Smuzhiyun
1218*4882a593Smuzhiyun init_completion(&fcomp.comp);
1219*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1220*4882a593Smuzhiyun iocmd->status = bfa_ablk_pf_create(&bfad->bfa.modules.ablk,
1221*4882a593Smuzhiyun &iocmd->pcifn_id, iocmd->port,
1222*4882a593Smuzhiyun iocmd->pcifn_class, iocmd->bw_min,
1223*4882a593Smuzhiyun iocmd->bw_max, bfad_hcb_comp, &fcomp);
1224*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1225*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1226*4882a593Smuzhiyun goto out;
1227*4882a593Smuzhiyun
1228*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1229*4882a593Smuzhiyun iocmd->status = fcomp.status;
1230*4882a593Smuzhiyun out:
1231*4882a593Smuzhiyun return 0;
1232*4882a593Smuzhiyun }
1233*4882a593Smuzhiyun
1234*4882a593Smuzhiyun static int
bfad_iocmd_pcifn_delete(struct bfad_s * bfad,void * cmd)1235*4882a593Smuzhiyun bfad_iocmd_pcifn_delete(struct bfad_s *bfad, void *cmd)
1236*4882a593Smuzhiyun {
1237*4882a593Smuzhiyun struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
1238*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1239*4882a593Smuzhiyun unsigned long flags;
1240*4882a593Smuzhiyun
1241*4882a593Smuzhiyun init_completion(&fcomp.comp);
1242*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1243*4882a593Smuzhiyun iocmd->status = bfa_ablk_pf_delete(&bfad->bfa.modules.ablk,
1244*4882a593Smuzhiyun iocmd->pcifn_id,
1245*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1246*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1247*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1248*4882a593Smuzhiyun goto out;
1249*4882a593Smuzhiyun
1250*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1251*4882a593Smuzhiyun iocmd->status = fcomp.status;
1252*4882a593Smuzhiyun out:
1253*4882a593Smuzhiyun return 0;
1254*4882a593Smuzhiyun }
1255*4882a593Smuzhiyun
1256*4882a593Smuzhiyun static int
bfad_iocmd_pcifn_bw(struct bfad_s * bfad,void * cmd)1257*4882a593Smuzhiyun bfad_iocmd_pcifn_bw(struct bfad_s *bfad, void *cmd)
1258*4882a593Smuzhiyun {
1259*4882a593Smuzhiyun struct bfa_bsg_pcifn_s *iocmd = (struct bfa_bsg_pcifn_s *)cmd;
1260*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1261*4882a593Smuzhiyun unsigned long flags;
1262*4882a593Smuzhiyun
1263*4882a593Smuzhiyun init_completion(&fcomp.comp);
1264*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1265*4882a593Smuzhiyun iocmd->status = bfa_ablk_pf_update(&bfad->bfa.modules.ablk,
1266*4882a593Smuzhiyun iocmd->pcifn_id, iocmd->bw_min,
1267*4882a593Smuzhiyun iocmd->bw_max, bfad_hcb_comp, &fcomp);
1268*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1269*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1270*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1271*4882a593Smuzhiyun goto out;
1272*4882a593Smuzhiyun
1273*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1274*4882a593Smuzhiyun iocmd->status = fcomp.status;
1275*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1276*4882a593Smuzhiyun out:
1277*4882a593Smuzhiyun return 0;
1278*4882a593Smuzhiyun }
1279*4882a593Smuzhiyun
1280*4882a593Smuzhiyun static int
bfad_iocmd_adapter_cfg_mode(struct bfad_s * bfad,void * cmd)1281*4882a593Smuzhiyun bfad_iocmd_adapter_cfg_mode(struct bfad_s *bfad, void *cmd)
1282*4882a593Smuzhiyun {
1283*4882a593Smuzhiyun struct bfa_bsg_adapter_cfg_mode_s *iocmd =
1284*4882a593Smuzhiyun (struct bfa_bsg_adapter_cfg_mode_s *)cmd;
1285*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1286*4882a593Smuzhiyun unsigned long flags = 0;
1287*4882a593Smuzhiyun
1288*4882a593Smuzhiyun init_completion(&fcomp.comp);
1289*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1290*4882a593Smuzhiyun iocmd->status = bfa_ablk_adapter_config(&bfad->bfa.modules.ablk,
1291*4882a593Smuzhiyun iocmd->cfg.mode, iocmd->cfg.max_pf,
1292*4882a593Smuzhiyun iocmd->cfg.max_vf, bfad_hcb_comp, &fcomp);
1293*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1294*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1295*4882a593Smuzhiyun goto out;
1296*4882a593Smuzhiyun
1297*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1298*4882a593Smuzhiyun iocmd->status = fcomp.status;
1299*4882a593Smuzhiyun out:
1300*4882a593Smuzhiyun return 0;
1301*4882a593Smuzhiyun }
1302*4882a593Smuzhiyun
1303*4882a593Smuzhiyun static int
bfad_iocmd_port_cfg_mode(struct bfad_s * bfad,void * cmd)1304*4882a593Smuzhiyun bfad_iocmd_port_cfg_mode(struct bfad_s *bfad, void *cmd)
1305*4882a593Smuzhiyun {
1306*4882a593Smuzhiyun struct bfa_bsg_port_cfg_mode_s *iocmd =
1307*4882a593Smuzhiyun (struct bfa_bsg_port_cfg_mode_s *)cmd;
1308*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1309*4882a593Smuzhiyun unsigned long flags = 0;
1310*4882a593Smuzhiyun
1311*4882a593Smuzhiyun init_completion(&fcomp.comp);
1312*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1313*4882a593Smuzhiyun iocmd->status = bfa_ablk_port_config(&bfad->bfa.modules.ablk,
1314*4882a593Smuzhiyun iocmd->instance, iocmd->cfg.mode,
1315*4882a593Smuzhiyun iocmd->cfg.max_pf, iocmd->cfg.max_vf,
1316*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1317*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1318*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1319*4882a593Smuzhiyun goto out;
1320*4882a593Smuzhiyun
1321*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1322*4882a593Smuzhiyun iocmd->status = fcomp.status;
1323*4882a593Smuzhiyun out:
1324*4882a593Smuzhiyun return 0;
1325*4882a593Smuzhiyun }
1326*4882a593Smuzhiyun
1327*4882a593Smuzhiyun static int
bfad_iocmd_ablk_optrom(struct bfad_s * bfad,unsigned int cmd,void * pcmd)1328*4882a593Smuzhiyun bfad_iocmd_ablk_optrom(struct bfad_s *bfad, unsigned int cmd, void *pcmd)
1329*4882a593Smuzhiyun {
1330*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
1331*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1332*4882a593Smuzhiyun unsigned long flags;
1333*4882a593Smuzhiyun
1334*4882a593Smuzhiyun init_completion(&fcomp.comp);
1335*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1336*4882a593Smuzhiyun if (cmd == IOCMD_FLASH_ENABLE_OPTROM)
1337*4882a593Smuzhiyun iocmd->status = bfa_ablk_optrom_en(&bfad->bfa.modules.ablk,
1338*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1339*4882a593Smuzhiyun else
1340*4882a593Smuzhiyun iocmd->status = bfa_ablk_optrom_dis(&bfad->bfa.modules.ablk,
1341*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1342*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1343*4882a593Smuzhiyun
1344*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1345*4882a593Smuzhiyun goto out;
1346*4882a593Smuzhiyun
1347*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1348*4882a593Smuzhiyun iocmd->status = fcomp.status;
1349*4882a593Smuzhiyun out:
1350*4882a593Smuzhiyun return 0;
1351*4882a593Smuzhiyun }
1352*4882a593Smuzhiyun
1353*4882a593Smuzhiyun static int
bfad_iocmd_faa_query(struct bfad_s * bfad,void * cmd)1354*4882a593Smuzhiyun bfad_iocmd_faa_query(struct bfad_s *bfad, void *cmd)
1355*4882a593Smuzhiyun {
1356*4882a593Smuzhiyun struct bfa_bsg_faa_attr_s *iocmd = (struct bfa_bsg_faa_attr_s *)cmd;
1357*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1358*4882a593Smuzhiyun unsigned long flags;
1359*4882a593Smuzhiyun
1360*4882a593Smuzhiyun init_completion(&fcomp.comp);
1361*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
1362*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1363*4882a593Smuzhiyun iocmd->status = bfa_faa_query(&bfad->bfa, &iocmd->faa_attr,
1364*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1365*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1366*4882a593Smuzhiyun
1367*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1368*4882a593Smuzhiyun goto out;
1369*4882a593Smuzhiyun
1370*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1371*4882a593Smuzhiyun iocmd->status = fcomp.status;
1372*4882a593Smuzhiyun out:
1373*4882a593Smuzhiyun return 0;
1374*4882a593Smuzhiyun }
1375*4882a593Smuzhiyun
1376*4882a593Smuzhiyun static int
bfad_iocmd_cee_attr(struct bfad_s * bfad,void * cmd,unsigned int payload_len)1377*4882a593Smuzhiyun bfad_iocmd_cee_attr(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
1378*4882a593Smuzhiyun {
1379*4882a593Smuzhiyun struct bfa_bsg_cee_attr_s *iocmd =
1380*4882a593Smuzhiyun (struct bfa_bsg_cee_attr_s *)cmd;
1381*4882a593Smuzhiyun void *iocmd_bufptr;
1382*4882a593Smuzhiyun struct bfad_hal_comp cee_comp;
1383*4882a593Smuzhiyun unsigned long flags;
1384*4882a593Smuzhiyun
1385*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len,
1386*4882a593Smuzhiyun sizeof(struct bfa_bsg_cee_attr_s),
1387*4882a593Smuzhiyun sizeof(struct bfa_cee_attr_s)) != BFA_STATUS_OK) {
1388*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
1389*4882a593Smuzhiyun return 0;
1390*4882a593Smuzhiyun }
1391*4882a593Smuzhiyun
1392*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_attr_s);
1393*4882a593Smuzhiyun
1394*4882a593Smuzhiyun cee_comp.status = 0;
1395*4882a593Smuzhiyun init_completion(&cee_comp.comp);
1396*4882a593Smuzhiyun mutex_lock(&bfad_mutex);
1397*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1398*4882a593Smuzhiyun iocmd->status = bfa_cee_get_attr(&bfad->bfa.modules.cee, iocmd_bufptr,
1399*4882a593Smuzhiyun bfad_hcb_comp, &cee_comp);
1400*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1401*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
1402*4882a593Smuzhiyun mutex_unlock(&bfad_mutex);
1403*4882a593Smuzhiyun bfa_trc(bfad, 0x5555);
1404*4882a593Smuzhiyun goto out;
1405*4882a593Smuzhiyun }
1406*4882a593Smuzhiyun wait_for_completion(&cee_comp.comp);
1407*4882a593Smuzhiyun mutex_unlock(&bfad_mutex);
1408*4882a593Smuzhiyun out:
1409*4882a593Smuzhiyun return 0;
1410*4882a593Smuzhiyun }
1411*4882a593Smuzhiyun
1412*4882a593Smuzhiyun static int
bfad_iocmd_cee_get_stats(struct bfad_s * bfad,void * cmd,unsigned int payload_len)1413*4882a593Smuzhiyun bfad_iocmd_cee_get_stats(struct bfad_s *bfad, void *cmd,
1414*4882a593Smuzhiyun unsigned int payload_len)
1415*4882a593Smuzhiyun {
1416*4882a593Smuzhiyun struct bfa_bsg_cee_stats_s *iocmd =
1417*4882a593Smuzhiyun (struct bfa_bsg_cee_stats_s *)cmd;
1418*4882a593Smuzhiyun void *iocmd_bufptr;
1419*4882a593Smuzhiyun struct bfad_hal_comp cee_comp;
1420*4882a593Smuzhiyun unsigned long flags;
1421*4882a593Smuzhiyun
1422*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len,
1423*4882a593Smuzhiyun sizeof(struct bfa_bsg_cee_stats_s),
1424*4882a593Smuzhiyun sizeof(struct bfa_cee_stats_s)) != BFA_STATUS_OK) {
1425*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
1426*4882a593Smuzhiyun return 0;
1427*4882a593Smuzhiyun }
1428*4882a593Smuzhiyun
1429*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_cee_stats_s);
1430*4882a593Smuzhiyun
1431*4882a593Smuzhiyun cee_comp.status = 0;
1432*4882a593Smuzhiyun init_completion(&cee_comp.comp);
1433*4882a593Smuzhiyun mutex_lock(&bfad_mutex);
1434*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1435*4882a593Smuzhiyun iocmd->status = bfa_cee_get_stats(&bfad->bfa.modules.cee, iocmd_bufptr,
1436*4882a593Smuzhiyun bfad_hcb_comp, &cee_comp);
1437*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1438*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
1439*4882a593Smuzhiyun mutex_unlock(&bfad_mutex);
1440*4882a593Smuzhiyun bfa_trc(bfad, 0x5555);
1441*4882a593Smuzhiyun goto out;
1442*4882a593Smuzhiyun }
1443*4882a593Smuzhiyun wait_for_completion(&cee_comp.comp);
1444*4882a593Smuzhiyun mutex_unlock(&bfad_mutex);
1445*4882a593Smuzhiyun out:
1446*4882a593Smuzhiyun return 0;
1447*4882a593Smuzhiyun }
1448*4882a593Smuzhiyun
1449*4882a593Smuzhiyun static int
bfad_iocmd_cee_reset_stats(struct bfad_s * bfad,void * cmd)1450*4882a593Smuzhiyun bfad_iocmd_cee_reset_stats(struct bfad_s *bfad, void *cmd)
1451*4882a593Smuzhiyun {
1452*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
1453*4882a593Smuzhiyun unsigned long flags;
1454*4882a593Smuzhiyun
1455*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1456*4882a593Smuzhiyun iocmd->status = bfa_cee_reset_stats(&bfad->bfa.modules.cee, NULL, NULL);
1457*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1458*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1459*4882a593Smuzhiyun bfa_trc(bfad, 0x5555);
1460*4882a593Smuzhiyun return 0;
1461*4882a593Smuzhiyun }
1462*4882a593Smuzhiyun
1463*4882a593Smuzhiyun static int
bfad_iocmd_sfp_media(struct bfad_s * bfad,void * cmd)1464*4882a593Smuzhiyun bfad_iocmd_sfp_media(struct bfad_s *bfad, void *cmd)
1465*4882a593Smuzhiyun {
1466*4882a593Smuzhiyun struct bfa_bsg_sfp_media_s *iocmd = (struct bfa_bsg_sfp_media_s *)cmd;
1467*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1468*4882a593Smuzhiyun unsigned long flags;
1469*4882a593Smuzhiyun
1470*4882a593Smuzhiyun init_completion(&fcomp.comp);
1471*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1472*4882a593Smuzhiyun iocmd->status = bfa_sfp_media(BFA_SFP_MOD(&bfad->bfa), &iocmd->media,
1473*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1474*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1475*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1476*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_SFP_NOT_READY)
1477*4882a593Smuzhiyun goto out;
1478*4882a593Smuzhiyun
1479*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1480*4882a593Smuzhiyun iocmd->status = fcomp.status;
1481*4882a593Smuzhiyun out:
1482*4882a593Smuzhiyun return 0;
1483*4882a593Smuzhiyun }
1484*4882a593Smuzhiyun
1485*4882a593Smuzhiyun static int
bfad_iocmd_sfp_speed(struct bfad_s * bfad,void * cmd)1486*4882a593Smuzhiyun bfad_iocmd_sfp_speed(struct bfad_s *bfad, void *cmd)
1487*4882a593Smuzhiyun {
1488*4882a593Smuzhiyun struct bfa_bsg_sfp_speed_s *iocmd = (struct bfa_bsg_sfp_speed_s *)cmd;
1489*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1490*4882a593Smuzhiyun unsigned long flags;
1491*4882a593Smuzhiyun
1492*4882a593Smuzhiyun init_completion(&fcomp.comp);
1493*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1494*4882a593Smuzhiyun iocmd->status = bfa_sfp_speed(BFA_SFP_MOD(&bfad->bfa), iocmd->speed,
1495*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1496*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1497*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1498*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_SFP_NOT_READY)
1499*4882a593Smuzhiyun goto out;
1500*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1501*4882a593Smuzhiyun iocmd->status = fcomp.status;
1502*4882a593Smuzhiyun out:
1503*4882a593Smuzhiyun return 0;
1504*4882a593Smuzhiyun }
1505*4882a593Smuzhiyun
1506*4882a593Smuzhiyun static int
bfad_iocmd_flash_get_attr(struct bfad_s * bfad,void * cmd)1507*4882a593Smuzhiyun bfad_iocmd_flash_get_attr(struct bfad_s *bfad, void *cmd)
1508*4882a593Smuzhiyun {
1509*4882a593Smuzhiyun struct bfa_bsg_flash_attr_s *iocmd =
1510*4882a593Smuzhiyun (struct bfa_bsg_flash_attr_s *)cmd;
1511*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1512*4882a593Smuzhiyun unsigned long flags;
1513*4882a593Smuzhiyun
1514*4882a593Smuzhiyun init_completion(&fcomp.comp);
1515*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1516*4882a593Smuzhiyun iocmd->status = bfa_flash_get_attr(BFA_FLASH(&bfad->bfa), &iocmd->attr,
1517*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1518*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1519*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1520*4882a593Smuzhiyun goto out;
1521*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1522*4882a593Smuzhiyun iocmd->status = fcomp.status;
1523*4882a593Smuzhiyun out:
1524*4882a593Smuzhiyun return 0;
1525*4882a593Smuzhiyun }
1526*4882a593Smuzhiyun
1527*4882a593Smuzhiyun static int
bfad_iocmd_flash_erase_part(struct bfad_s * bfad,void * cmd)1528*4882a593Smuzhiyun bfad_iocmd_flash_erase_part(struct bfad_s *bfad, void *cmd)
1529*4882a593Smuzhiyun {
1530*4882a593Smuzhiyun struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
1531*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1532*4882a593Smuzhiyun unsigned long flags;
1533*4882a593Smuzhiyun
1534*4882a593Smuzhiyun init_completion(&fcomp.comp);
1535*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1536*4882a593Smuzhiyun iocmd->status = bfa_flash_erase_part(BFA_FLASH(&bfad->bfa), iocmd->type,
1537*4882a593Smuzhiyun iocmd->instance, bfad_hcb_comp, &fcomp);
1538*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1539*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1540*4882a593Smuzhiyun goto out;
1541*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1542*4882a593Smuzhiyun iocmd->status = fcomp.status;
1543*4882a593Smuzhiyun out:
1544*4882a593Smuzhiyun return 0;
1545*4882a593Smuzhiyun }
1546*4882a593Smuzhiyun
1547*4882a593Smuzhiyun static int
bfad_iocmd_flash_update_part(struct bfad_s * bfad,void * cmd,unsigned int payload_len)1548*4882a593Smuzhiyun bfad_iocmd_flash_update_part(struct bfad_s *bfad, void *cmd,
1549*4882a593Smuzhiyun unsigned int payload_len)
1550*4882a593Smuzhiyun {
1551*4882a593Smuzhiyun struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
1552*4882a593Smuzhiyun void *iocmd_bufptr;
1553*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1554*4882a593Smuzhiyun unsigned long flags;
1555*4882a593Smuzhiyun
1556*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len,
1557*4882a593Smuzhiyun sizeof(struct bfa_bsg_flash_s),
1558*4882a593Smuzhiyun iocmd->bufsz) != BFA_STATUS_OK) {
1559*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
1560*4882a593Smuzhiyun return 0;
1561*4882a593Smuzhiyun }
1562*4882a593Smuzhiyun
1563*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s);
1564*4882a593Smuzhiyun
1565*4882a593Smuzhiyun init_completion(&fcomp.comp);
1566*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1567*4882a593Smuzhiyun iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
1568*4882a593Smuzhiyun iocmd->type, iocmd->instance, iocmd_bufptr,
1569*4882a593Smuzhiyun iocmd->bufsz, 0, bfad_hcb_comp, &fcomp);
1570*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1571*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1572*4882a593Smuzhiyun goto out;
1573*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1574*4882a593Smuzhiyun iocmd->status = fcomp.status;
1575*4882a593Smuzhiyun out:
1576*4882a593Smuzhiyun return 0;
1577*4882a593Smuzhiyun }
1578*4882a593Smuzhiyun
1579*4882a593Smuzhiyun static int
bfad_iocmd_flash_read_part(struct bfad_s * bfad,void * cmd,unsigned int payload_len)1580*4882a593Smuzhiyun bfad_iocmd_flash_read_part(struct bfad_s *bfad, void *cmd,
1581*4882a593Smuzhiyun unsigned int payload_len)
1582*4882a593Smuzhiyun {
1583*4882a593Smuzhiyun struct bfa_bsg_flash_s *iocmd = (struct bfa_bsg_flash_s *)cmd;
1584*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1585*4882a593Smuzhiyun void *iocmd_bufptr;
1586*4882a593Smuzhiyun unsigned long flags;
1587*4882a593Smuzhiyun
1588*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len,
1589*4882a593Smuzhiyun sizeof(struct bfa_bsg_flash_s),
1590*4882a593Smuzhiyun iocmd->bufsz) != BFA_STATUS_OK) {
1591*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
1592*4882a593Smuzhiyun return 0;
1593*4882a593Smuzhiyun }
1594*4882a593Smuzhiyun
1595*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_flash_s);
1596*4882a593Smuzhiyun
1597*4882a593Smuzhiyun init_completion(&fcomp.comp);
1598*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1599*4882a593Smuzhiyun iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa), iocmd->type,
1600*4882a593Smuzhiyun iocmd->instance, iocmd_bufptr, iocmd->bufsz, 0,
1601*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1602*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1603*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1604*4882a593Smuzhiyun goto out;
1605*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1606*4882a593Smuzhiyun iocmd->status = fcomp.status;
1607*4882a593Smuzhiyun out:
1608*4882a593Smuzhiyun return 0;
1609*4882a593Smuzhiyun }
1610*4882a593Smuzhiyun
1611*4882a593Smuzhiyun static int
bfad_iocmd_diag_temp(struct bfad_s * bfad,void * cmd)1612*4882a593Smuzhiyun bfad_iocmd_diag_temp(struct bfad_s *bfad, void *cmd)
1613*4882a593Smuzhiyun {
1614*4882a593Smuzhiyun struct bfa_bsg_diag_get_temp_s *iocmd =
1615*4882a593Smuzhiyun (struct bfa_bsg_diag_get_temp_s *)cmd;
1616*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1617*4882a593Smuzhiyun unsigned long flags;
1618*4882a593Smuzhiyun
1619*4882a593Smuzhiyun init_completion(&fcomp.comp);
1620*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1621*4882a593Smuzhiyun iocmd->status = bfa_diag_tsensor_query(BFA_DIAG_MOD(&bfad->bfa),
1622*4882a593Smuzhiyun &iocmd->result, bfad_hcb_comp, &fcomp);
1623*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1624*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1625*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1626*4882a593Smuzhiyun goto out;
1627*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1628*4882a593Smuzhiyun iocmd->status = fcomp.status;
1629*4882a593Smuzhiyun out:
1630*4882a593Smuzhiyun return 0;
1631*4882a593Smuzhiyun }
1632*4882a593Smuzhiyun
1633*4882a593Smuzhiyun static int
bfad_iocmd_diag_memtest(struct bfad_s * bfad,void * cmd)1634*4882a593Smuzhiyun bfad_iocmd_diag_memtest(struct bfad_s *bfad, void *cmd)
1635*4882a593Smuzhiyun {
1636*4882a593Smuzhiyun struct bfa_bsg_diag_memtest_s *iocmd =
1637*4882a593Smuzhiyun (struct bfa_bsg_diag_memtest_s *)cmd;
1638*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1639*4882a593Smuzhiyun unsigned long flags;
1640*4882a593Smuzhiyun
1641*4882a593Smuzhiyun init_completion(&fcomp.comp);
1642*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1643*4882a593Smuzhiyun iocmd->status = bfa_diag_memtest(BFA_DIAG_MOD(&bfad->bfa),
1644*4882a593Smuzhiyun &iocmd->memtest, iocmd->pat,
1645*4882a593Smuzhiyun &iocmd->result, bfad_hcb_comp, &fcomp);
1646*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1647*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1648*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1649*4882a593Smuzhiyun goto out;
1650*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1651*4882a593Smuzhiyun iocmd->status = fcomp.status;
1652*4882a593Smuzhiyun out:
1653*4882a593Smuzhiyun return 0;
1654*4882a593Smuzhiyun }
1655*4882a593Smuzhiyun
1656*4882a593Smuzhiyun static int
bfad_iocmd_diag_loopback(struct bfad_s * bfad,void * cmd)1657*4882a593Smuzhiyun bfad_iocmd_diag_loopback(struct bfad_s *bfad, void *cmd)
1658*4882a593Smuzhiyun {
1659*4882a593Smuzhiyun struct bfa_bsg_diag_loopback_s *iocmd =
1660*4882a593Smuzhiyun (struct bfa_bsg_diag_loopback_s *)cmd;
1661*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1662*4882a593Smuzhiyun unsigned long flags;
1663*4882a593Smuzhiyun
1664*4882a593Smuzhiyun init_completion(&fcomp.comp);
1665*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1666*4882a593Smuzhiyun iocmd->status = bfa_fcdiag_loopback(&bfad->bfa, iocmd->opmode,
1667*4882a593Smuzhiyun iocmd->speed, iocmd->lpcnt, iocmd->pat,
1668*4882a593Smuzhiyun &iocmd->result, bfad_hcb_comp, &fcomp);
1669*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1670*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1671*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1672*4882a593Smuzhiyun goto out;
1673*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1674*4882a593Smuzhiyun iocmd->status = fcomp.status;
1675*4882a593Smuzhiyun out:
1676*4882a593Smuzhiyun return 0;
1677*4882a593Smuzhiyun }
1678*4882a593Smuzhiyun
1679*4882a593Smuzhiyun static int
bfad_iocmd_diag_fwping(struct bfad_s * bfad,void * cmd)1680*4882a593Smuzhiyun bfad_iocmd_diag_fwping(struct bfad_s *bfad, void *cmd)
1681*4882a593Smuzhiyun {
1682*4882a593Smuzhiyun struct bfa_bsg_diag_fwping_s *iocmd =
1683*4882a593Smuzhiyun (struct bfa_bsg_diag_fwping_s *)cmd;
1684*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1685*4882a593Smuzhiyun unsigned long flags;
1686*4882a593Smuzhiyun
1687*4882a593Smuzhiyun init_completion(&fcomp.comp);
1688*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1689*4882a593Smuzhiyun iocmd->status = bfa_diag_fwping(BFA_DIAG_MOD(&bfad->bfa), iocmd->cnt,
1690*4882a593Smuzhiyun iocmd->pattern, &iocmd->result,
1691*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1692*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1693*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1694*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1695*4882a593Smuzhiyun goto out;
1696*4882a593Smuzhiyun bfa_trc(bfad, 0x77771);
1697*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1698*4882a593Smuzhiyun iocmd->status = fcomp.status;
1699*4882a593Smuzhiyun out:
1700*4882a593Smuzhiyun return 0;
1701*4882a593Smuzhiyun }
1702*4882a593Smuzhiyun
1703*4882a593Smuzhiyun static int
bfad_iocmd_diag_queuetest(struct bfad_s * bfad,void * cmd)1704*4882a593Smuzhiyun bfad_iocmd_diag_queuetest(struct bfad_s *bfad, void *cmd)
1705*4882a593Smuzhiyun {
1706*4882a593Smuzhiyun struct bfa_bsg_diag_qtest_s *iocmd = (struct bfa_bsg_diag_qtest_s *)cmd;
1707*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1708*4882a593Smuzhiyun unsigned long flags;
1709*4882a593Smuzhiyun
1710*4882a593Smuzhiyun init_completion(&fcomp.comp);
1711*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1712*4882a593Smuzhiyun iocmd->status = bfa_fcdiag_queuetest(&bfad->bfa, iocmd->force,
1713*4882a593Smuzhiyun iocmd->queue, &iocmd->result,
1714*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1715*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1716*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1717*4882a593Smuzhiyun goto out;
1718*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1719*4882a593Smuzhiyun iocmd->status = fcomp.status;
1720*4882a593Smuzhiyun out:
1721*4882a593Smuzhiyun return 0;
1722*4882a593Smuzhiyun }
1723*4882a593Smuzhiyun
1724*4882a593Smuzhiyun static int
bfad_iocmd_diag_sfp(struct bfad_s * bfad,void * cmd)1725*4882a593Smuzhiyun bfad_iocmd_diag_sfp(struct bfad_s *bfad, void *cmd)
1726*4882a593Smuzhiyun {
1727*4882a593Smuzhiyun struct bfa_bsg_sfp_show_s *iocmd =
1728*4882a593Smuzhiyun (struct bfa_bsg_sfp_show_s *)cmd;
1729*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1730*4882a593Smuzhiyun unsigned long flags;
1731*4882a593Smuzhiyun
1732*4882a593Smuzhiyun init_completion(&fcomp.comp);
1733*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1734*4882a593Smuzhiyun iocmd->status = bfa_sfp_show(BFA_SFP_MOD(&bfad->bfa), &iocmd->sfp,
1735*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
1736*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1737*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1738*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1739*4882a593Smuzhiyun goto out;
1740*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1741*4882a593Smuzhiyun iocmd->status = fcomp.status;
1742*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1743*4882a593Smuzhiyun out:
1744*4882a593Smuzhiyun return 0;
1745*4882a593Smuzhiyun }
1746*4882a593Smuzhiyun
1747*4882a593Smuzhiyun static int
bfad_iocmd_diag_led(struct bfad_s * bfad,void * cmd)1748*4882a593Smuzhiyun bfad_iocmd_diag_led(struct bfad_s *bfad, void *cmd)
1749*4882a593Smuzhiyun {
1750*4882a593Smuzhiyun struct bfa_bsg_diag_led_s *iocmd = (struct bfa_bsg_diag_led_s *)cmd;
1751*4882a593Smuzhiyun unsigned long flags;
1752*4882a593Smuzhiyun
1753*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1754*4882a593Smuzhiyun iocmd->status = bfa_diag_ledtest(BFA_DIAG_MOD(&bfad->bfa),
1755*4882a593Smuzhiyun &iocmd->ledtest);
1756*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1757*4882a593Smuzhiyun return 0;
1758*4882a593Smuzhiyun }
1759*4882a593Smuzhiyun
1760*4882a593Smuzhiyun static int
bfad_iocmd_diag_beacon_lport(struct bfad_s * bfad,void * cmd)1761*4882a593Smuzhiyun bfad_iocmd_diag_beacon_lport(struct bfad_s *bfad, void *cmd)
1762*4882a593Smuzhiyun {
1763*4882a593Smuzhiyun struct bfa_bsg_diag_beacon_s *iocmd =
1764*4882a593Smuzhiyun (struct bfa_bsg_diag_beacon_s *)cmd;
1765*4882a593Smuzhiyun unsigned long flags;
1766*4882a593Smuzhiyun
1767*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1768*4882a593Smuzhiyun iocmd->status = bfa_diag_beacon_port(BFA_DIAG_MOD(&bfad->bfa),
1769*4882a593Smuzhiyun iocmd->beacon, iocmd->link_e2e_beacon,
1770*4882a593Smuzhiyun iocmd->second);
1771*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1772*4882a593Smuzhiyun return 0;
1773*4882a593Smuzhiyun }
1774*4882a593Smuzhiyun
1775*4882a593Smuzhiyun static int
bfad_iocmd_diag_lb_stat(struct bfad_s * bfad,void * cmd)1776*4882a593Smuzhiyun bfad_iocmd_diag_lb_stat(struct bfad_s *bfad, void *cmd)
1777*4882a593Smuzhiyun {
1778*4882a593Smuzhiyun struct bfa_bsg_diag_lb_stat_s *iocmd =
1779*4882a593Smuzhiyun (struct bfa_bsg_diag_lb_stat_s *)cmd;
1780*4882a593Smuzhiyun unsigned long flags;
1781*4882a593Smuzhiyun
1782*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1783*4882a593Smuzhiyun iocmd->status = bfa_fcdiag_lb_is_running(&bfad->bfa);
1784*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1785*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1786*4882a593Smuzhiyun
1787*4882a593Smuzhiyun return 0;
1788*4882a593Smuzhiyun }
1789*4882a593Smuzhiyun
1790*4882a593Smuzhiyun static int
bfad_iocmd_diag_dport_enable(struct bfad_s * bfad,void * pcmd)1791*4882a593Smuzhiyun bfad_iocmd_diag_dport_enable(struct bfad_s *bfad, void *pcmd)
1792*4882a593Smuzhiyun {
1793*4882a593Smuzhiyun struct bfa_bsg_dport_enable_s *iocmd =
1794*4882a593Smuzhiyun (struct bfa_bsg_dport_enable_s *)pcmd;
1795*4882a593Smuzhiyun unsigned long flags;
1796*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1797*4882a593Smuzhiyun
1798*4882a593Smuzhiyun init_completion(&fcomp.comp);
1799*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1800*4882a593Smuzhiyun iocmd->status = bfa_dport_enable(&bfad->bfa, iocmd->lpcnt,
1801*4882a593Smuzhiyun iocmd->pat, bfad_hcb_comp, &fcomp);
1802*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1803*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1804*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1805*4882a593Smuzhiyun else {
1806*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1807*4882a593Smuzhiyun iocmd->status = fcomp.status;
1808*4882a593Smuzhiyun }
1809*4882a593Smuzhiyun return 0;
1810*4882a593Smuzhiyun }
1811*4882a593Smuzhiyun
1812*4882a593Smuzhiyun static int
bfad_iocmd_diag_dport_disable(struct bfad_s * bfad,void * pcmd)1813*4882a593Smuzhiyun bfad_iocmd_diag_dport_disable(struct bfad_s *bfad, void *pcmd)
1814*4882a593Smuzhiyun {
1815*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
1816*4882a593Smuzhiyun unsigned long flags;
1817*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1818*4882a593Smuzhiyun
1819*4882a593Smuzhiyun init_completion(&fcomp.comp);
1820*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1821*4882a593Smuzhiyun iocmd->status = bfa_dport_disable(&bfad->bfa, bfad_hcb_comp, &fcomp);
1822*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1823*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1824*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1825*4882a593Smuzhiyun else {
1826*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1827*4882a593Smuzhiyun iocmd->status = fcomp.status;
1828*4882a593Smuzhiyun }
1829*4882a593Smuzhiyun return 0;
1830*4882a593Smuzhiyun }
1831*4882a593Smuzhiyun
1832*4882a593Smuzhiyun static int
bfad_iocmd_diag_dport_start(struct bfad_s * bfad,void * pcmd)1833*4882a593Smuzhiyun bfad_iocmd_diag_dport_start(struct bfad_s *bfad, void *pcmd)
1834*4882a593Smuzhiyun {
1835*4882a593Smuzhiyun struct bfa_bsg_dport_enable_s *iocmd =
1836*4882a593Smuzhiyun (struct bfa_bsg_dport_enable_s *)pcmd;
1837*4882a593Smuzhiyun unsigned long flags;
1838*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1839*4882a593Smuzhiyun
1840*4882a593Smuzhiyun init_completion(&fcomp.comp);
1841*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1842*4882a593Smuzhiyun iocmd->status = bfa_dport_start(&bfad->bfa, iocmd->lpcnt,
1843*4882a593Smuzhiyun iocmd->pat, bfad_hcb_comp,
1844*4882a593Smuzhiyun &fcomp);
1845*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1846*4882a593Smuzhiyun
1847*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
1848*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
1849*4882a593Smuzhiyun } else {
1850*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1851*4882a593Smuzhiyun iocmd->status = fcomp.status;
1852*4882a593Smuzhiyun }
1853*4882a593Smuzhiyun
1854*4882a593Smuzhiyun return 0;
1855*4882a593Smuzhiyun }
1856*4882a593Smuzhiyun
1857*4882a593Smuzhiyun static int
bfad_iocmd_diag_dport_show(struct bfad_s * bfad,void * pcmd)1858*4882a593Smuzhiyun bfad_iocmd_diag_dport_show(struct bfad_s *bfad, void *pcmd)
1859*4882a593Smuzhiyun {
1860*4882a593Smuzhiyun struct bfa_bsg_diag_dport_show_s *iocmd =
1861*4882a593Smuzhiyun (struct bfa_bsg_diag_dport_show_s *)pcmd;
1862*4882a593Smuzhiyun unsigned long flags;
1863*4882a593Smuzhiyun
1864*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1865*4882a593Smuzhiyun iocmd->status = bfa_dport_show(&bfad->bfa, &iocmd->result);
1866*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1867*4882a593Smuzhiyun
1868*4882a593Smuzhiyun return 0;
1869*4882a593Smuzhiyun }
1870*4882a593Smuzhiyun
1871*4882a593Smuzhiyun
1872*4882a593Smuzhiyun static int
bfad_iocmd_phy_get_attr(struct bfad_s * bfad,void * cmd)1873*4882a593Smuzhiyun bfad_iocmd_phy_get_attr(struct bfad_s *bfad, void *cmd)
1874*4882a593Smuzhiyun {
1875*4882a593Smuzhiyun struct bfa_bsg_phy_attr_s *iocmd =
1876*4882a593Smuzhiyun (struct bfa_bsg_phy_attr_s *)cmd;
1877*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1878*4882a593Smuzhiyun unsigned long flags;
1879*4882a593Smuzhiyun
1880*4882a593Smuzhiyun init_completion(&fcomp.comp);
1881*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1882*4882a593Smuzhiyun iocmd->status = bfa_phy_get_attr(BFA_PHY(&bfad->bfa), iocmd->instance,
1883*4882a593Smuzhiyun &iocmd->attr, bfad_hcb_comp, &fcomp);
1884*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1885*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1886*4882a593Smuzhiyun goto out;
1887*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1888*4882a593Smuzhiyun iocmd->status = fcomp.status;
1889*4882a593Smuzhiyun out:
1890*4882a593Smuzhiyun return 0;
1891*4882a593Smuzhiyun }
1892*4882a593Smuzhiyun
1893*4882a593Smuzhiyun static int
bfad_iocmd_phy_get_stats(struct bfad_s * bfad,void * cmd)1894*4882a593Smuzhiyun bfad_iocmd_phy_get_stats(struct bfad_s *bfad, void *cmd)
1895*4882a593Smuzhiyun {
1896*4882a593Smuzhiyun struct bfa_bsg_phy_stats_s *iocmd =
1897*4882a593Smuzhiyun (struct bfa_bsg_phy_stats_s *)cmd;
1898*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1899*4882a593Smuzhiyun unsigned long flags;
1900*4882a593Smuzhiyun
1901*4882a593Smuzhiyun init_completion(&fcomp.comp);
1902*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1903*4882a593Smuzhiyun iocmd->status = bfa_phy_get_stats(BFA_PHY(&bfad->bfa), iocmd->instance,
1904*4882a593Smuzhiyun &iocmd->stats, bfad_hcb_comp, &fcomp);
1905*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1906*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1907*4882a593Smuzhiyun goto out;
1908*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1909*4882a593Smuzhiyun iocmd->status = fcomp.status;
1910*4882a593Smuzhiyun out:
1911*4882a593Smuzhiyun return 0;
1912*4882a593Smuzhiyun }
1913*4882a593Smuzhiyun
1914*4882a593Smuzhiyun static int
bfad_iocmd_phy_read(struct bfad_s * bfad,void * cmd,unsigned int payload_len)1915*4882a593Smuzhiyun bfad_iocmd_phy_read(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
1916*4882a593Smuzhiyun {
1917*4882a593Smuzhiyun struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd;
1918*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1919*4882a593Smuzhiyun void *iocmd_bufptr;
1920*4882a593Smuzhiyun unsigned long flags;
1921*4882a593Smuzhiyun
1922*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len,
1923*4882a593Smuzhiyun sizeof(struct bfa_bsg_phy_s),
1924*4882a593Smuzhiyun iocmd->bufsz) != BFA_STATUS_OK) {
1925*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
1926*4882a593Smuzhiyun return 0;
1927*4882a593Smuzhiyun }
1928*4882a593Smuzhiyun
1929*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s);
1930*4882a593Smuzhiyun init_completion(&fcomp.comp);
1931*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1932*4882a593Smuzhiyun iocmd->status = bfa_phy_read(BFA_PHY(&bfad->bfa),
1933*4882a593Smuzhiyun iocmd->instance, iocmd_bufptr, iocmd->bufsz,
1934*4882a593Smuzhiyun 0, bfad_hcb_comp, &fcomp);
1935*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1936*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1937*4882a593Smuzhiyun goto out;
1938*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1939*4882a593Smuzhiyun iocmd->status = fcomp.status;
1940*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1941*4882a593Smuzhiyun goto out;
1942*4882a593Smuzhiyun out:
1943*4882a593Smuzhiyun return 0;
1944*4882a593Smuzhiyun }
1945*4882a593Smuzhiyun
1946*4882a593Smuzhiyun static int
bfad_iocmd_vhba_query(struct bfad_s * bfad,void * cmd)1947*4882a593Smuzhiyun bfad_iocmd_vhba_query(struct bfad_s *bfad, void *cmd)
1948*4882a593Smuzhiyun {
1949*4882a593Smuzhiyun struct bfa_bsg_vhba_attr_s *iocmd =
1950*4882a593Smuzhiyun (struct bfa_bsg_vhba_attr_s *)cmd;
1951*4882a593Smuzhiyun struct bfa_vhba_attr_s *attr = &iocmd->attr;
1952*4882a593Smuzhiyun unsigned long flags;
1953*4882a593Smuzhiyun
1954*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1955*4882a593Smuzhiyun attr->pwwn = bfad->bfa.ioc.attr->pwwn;
1956*4882a593Smuzhiyun attr->nwwn = bfad->bfa.ioc.attr->nwwn;
1957*4882a593Smuzhiyun attr->plog_enabled = (bfa_boolean_t)bfad->bfa.plog->plog_enabled;
1958*4882a593Smuzhiyun attr->io_profile = bfa_fcpim_get_io_profile(&bfad->bfa);
1959*4882a593Smuzhiyun attr->path_tov = bfa_fcpim_path_tov_get(&bfad->bfa);
1960*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
1961*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1962*4882a593Smuzhiyun return 0;
1963*4882a593Smuzhiyun }
1964*4882a593Smuzhiyun
1965*4882a593Smuzhiyun static int
bfad_iocmd_phy_update(struct bfad_s * bfad,void * cmd,unsigned int payload_len)1966*4882a593Smuzhiyun bfad_iocmd_phy_update(struct bfad_s *bfad, void *cmd, unsigned int payload_len)
1967*4882a593Smuzhiyun {
1968*4882a593Smuzhiyun struct bfa_bsg_phy_s *iocmd = (struct bfa_bsg_phy_s *)cmd;
1969*4882a593Smuzhiyun void *iocmd_bufptr;
1970*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
1971*4882a593Smuzhiyun unsigned long flags;
1972*4882a593Smuzhiyun
1973*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len,
1974*4882a593Smuzhiyun sizeof(struct bfa_bsg_phy_s),
1975*4882a593Smuzhiyun iocmd->bufsz) != BFA_STATUS_OK) {
1976*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
1977*4882a593Smuzhiyun return 0;
1978*4882a593Smuzhiyun }
1979*4882a593Smuzhiyun
1980*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_phy_s);
1981*4882a593Smuzhiyun init_completion(&fcomp.comp);
1982*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
1983*4882a593Smuzhiyun iocmd->status = bfa_phy_update(BFA_PHY(&bfad->bfa),
1984*4882a593Smuzhiyun iocmd->instance, iocmd_bufptr, iocmd->bufsz,
1985*4882a593Smuzhiyun 0, bfad_hcb_comp, &fcomp);
1986*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1987*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
1988*4882a593Smuzhiyun goto out;
1989*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
1990*4882a593Smuzhiyun iocmd->status = fcomp.status;
1991*4882a593Smuzhiyun out:
1992*4882a593Smuzhiyun return 0;
1993*4882a593Smuzhiyun }
1994*4882a593Smuzhiyun
1995*4882a593Smuzhiyun static int
bfad_iocmd_porglog_get(struct bfad_s * bfad,void * cmd)1996*4882a593Smuzhiyun bfad_iocmd_porglog_get(struct bfad_s *bfad, void *cmd)
1997*4882a593Smuzhiyun {
1998*4882a593Smuzhiyun struct bfa_bsg_debug_s *iocmd = (struct bfa_bsg_debug_s *)cmd;
1999*4882a593Smuzhiyun void *iocmd_bufptr;
2000*4882a593Smuzhiyun
2001*4882a593Smuzhiyun if (iocmd->bufsz < sizeof(struct bfa_plog_s)) {
2002*4882a593Smuzhiyun bfa_trc(bfad, sizeof(struct bfa_plog_s));
2003*4882a593Smuzhiyun iocmd->status = BFA_STATUS_EINVAL;
2004*4882a593Smuzhiyun goto out;
2005*4882a593Smuzhiyun }
2006*4882a593Smuzhiyun
2007*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
2008*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_debug_s);
2009*4882a593Smuzhiyun memcpy(iocmd_bufptr, (u8 *) &bfad->plog_buf, sizeof(struct bfa_plog_s));
2010*4882a593Smuzhiyun out:
2011*4882a593Smuzhiyun return 0;
2012*4882a593Smuzhiyun }
2013*4882a593Smuzhiyun
2014*4882a593Smuzhiyun #define BFA_DEBUG_FW_CORE_CHUNK_SZ 0x4000U /* 16K chunks for FW dump */
2015*4882a593Smuzhiyun static int
bfad_iocmd_debug_fw_core(struct bfad_s * bfad,void * cmd,unsigned int payload_len)2016*4882a593Smuzhiyun bfad_iocmd_debug_fw_core(struct bfad_s *bfad, void *cmd,
2017*4882a593Smuzhiyun unsigned int payload_len)
2018*4882a593Smuzhiyun {
2019*4882a593Smuzhiyun struct bfa_bsg_debug_s *iocmd = (struct bfa_bsg_debug_s *)cmd;
2020*4882a593Smuzhiyun void *iocmd_bufptr;
2021*4882a593Smuzhiyun unsigned long flags;
2022*4882a593Smuzhiyun u32 offset;
2023*4882a593Smuzhiyun
2024*4882a593Smuzhiyun if (bfad_chk_iocmd_sz(payload_len, sizeof(struct bfa_bsg_debug_s),
2025*4882a593Smuzhiyun BFA_DEBUG_FW_CORE_CHUNK_SZ) != BFA_STATUS_OK) {
2026*4882a593Smuzhiyun iocmd->status = BFA_STATUS_VERSION_FAIL;
2027*4882a593Smuzhiyun return 0;
2028*4882a593Smuzhiyun }
2029*4882a593Smuzhiyun
2030*4882a593Smuzhiyun if (iocmd->bufsz < BFA_DEBUG_FW_CORE_CHUNK_SZ ||
2031*4882a593Smuzhiyun !IS_ALIGNED(iocmd->bufsz, sizeof(u16)) ||
2032*4882a593Smuzhiyun !IS_ALIGNED(iocmd->offset, sizeof(u32))) {
2033*4882a593Smuzhiyun bfa_trc(bfad, BFA_DEBUG_FW_CORE_CHUNK_SZ);
2034*4882a593Smuzhiyun iocmd->status = BFA_STATUS_EINVAL;
2035*4882a593Smuzhiyun goto out;
2036*4882a593Smuzhiyun }
2037*4882a593Smuzhiyun
2038*4882a593Smuzhiyun iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_debug_s);
2039*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2040*4882a593Smuzhiyun offset = iocmd->offset;
2041*4882a593Smuzhiyun iocmd->status = bfa_ioc_debug_fwcore(&bfad->bfa.ioc, iocmd_bufptr,
2042*4882a593Smuzhiyun &offset, &iocmd->bufsz);
2043*4882a593Smuzhiyun iocmd->offset = offset;
2044*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2045*4882a593Smuzhiyun out:
2046*4882a593Smuzhiyun return 0;
2047*4882a593Smuzhiyun }
2048*4882a593Smuzhiyun
2049*4882a593Smuzhiyun static int
bfad_iocmd_debug_ctl(struct bfad_s * bfad,void * cmd,unsigned int v_cmd)2050*4882a593Smuzhiyun bfad_iocmd_debug_ctl(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
2051*4882a593Smuzhiyun {
2052*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
2053*4882a593Smuzhiyun unsigned long flags;
2054*4882a593Smuzhiyun
2055*4882a593Smuzhiyun if (v_cmd == IOCMD_DEBUG_FW_STATE_CLR) {
2056*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2057*4882a593Smuzhiyun bfad->bfa.ioc.dbg_fwsave_once = BFA_TRUE;
2058*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2059*4882a593Smuzhiyun } else if (v_cmd == IOCMD_DEBUG_PORTLOG_CLR)
2060*4882a593Smuzhiyun bfad->plog_buf.head = bfad->plog_buf.tail = 0;
2061*4882a593Smuzhiyun else if (v_cmd == IOCMD_DEBUG_START_DTRC)
2062*4882a593Smuzhiyun bfa_trc_init(bfad->trcmod);
2063*4882a593Smuzhiyun else if (v_cmd == IOCMD_DEBUG_STOP_DTRC)
2064*4882a593Smuzhiyun bfa_trc_stop(bfad->trcmod);
2065*4882a593Smuzhiyun
2066*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
2067*4882a593Smuzhiyun return 0;
2068*4882a593Smuzhiyun }
2069*4882a593Smuzhiyun
2070*4882a593Smuzhiyun static int
bfad_iocmd_porglog_ctl(struct bfad_s * bfad,void * cmd)2071*4882a593Smuzhiyun bfad_iocmd_porglog_ctl(struct bfad_s *bfad, void *cmd)
2072*4882a593Smuzhiyun {
2073*4882a593Smuzhiyun struct bfa_bsg_portlogctl_s *iocmd = (struct bfa_bsg_portlogctl_s *)cmd;
2074*4882a593Smuzhiyun
2075*4882a593Smuzhiyun if (iocmd->ctl == BFA_TRUE)
2076*4882a593Smuzhiyun bfad->plog_buf.plog_enabled = 1;
2077*4882a593Smuzhiyun else
2078*4882a593Smuzhiyun bfad->plog_buf.plog_enabled = 0;
2079*4882a593Smuzhiyun
2080*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
2081*4882a593Smuzhiyun return 0;
2082*4882a593Smuzhiyun }
2083*4882a593Smuzhiyun
2084*4882a593Smuzhiyun static int
bfad_iocmd_fcpim_cfg_profile(struct bfad_s * bfad,void * cmd,unsigned int v_cmd)2085*4882a593Smuzhiyun bfad_iocmd_fcpim_cfg_profile(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
2086*4882a593Smuzhiyun {
2087*4882a593Smuzhiyun struct bfa_bsg_fcpim_profile_s *iocmd =
2088*4882a593Smuzhiyun (struct bfa_bsg_fcpim_profile_s *)cmd;
2089*4882a593Smuzhiyun unsigned long flags;
2090*4882a593Smuzhiyun
2091*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2092*4882a593Smuzhiyun if (v_cmd == IOCMD_FCPIM_PROFILE_ON)
2093*4882a593Smuzhiyun iocmd->status = bfa_fcpim_profile_on(&bfad->bfa, ktime_get_real_seconds());
2094*4882a593Smuzhiyun else if (v_cmd == IOCMD_FCPIM_PROFILE_OFF)
2095*4882a593Smuzhiyun iocmd->status = bfa_fcpim_profile_off(&bfad->bfa);
2096*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2097*4882a593Smuzhiyun
2098*4882a593Smuzhiyun return 0;
2099*4882a593Smuzhiyun }
2100*4882a593Smuzhiyun
2101*4882a593Smuzhiyun static int
bfad_iocmd_itnim_get_ioprofile(struct bfad_s * bfad,void * cmd)2102*4882a593Smuzhiyun bfad_iocmd_itnim_get_ioprofile(struct bfad_s *bfad, void *cmd)
2103*4882a593Smuzhiyun {
2104*4882a593Smuzhiyun struct bfa_bsg_itnim_ioprofile_s *iocmd =
2105*4882a593Smuzhiyun (struct bfa_bsg_itnim_ioprofile_s *)cmd;
2106*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
2107*4882a593Smuzhiyun struct bfa_fcs_itnim_s *itnim;
2108*4882a593Smuzhiyun unsigned long flags;
2109*4882a593Smuzhiyun
2110*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2111*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
2112*4882a593Smuzhiyun iocmd->vf_id, iocmd->lpwwn);
2113*4882a593Smuzhiyun if (!fcs_port)
2114*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
2115*4882a593Smuzhiyun else {
2116*4882a593Smuzhiyun itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
2117*4882a593Smuzhiyun if (itnim == NULL)
2118*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
2119*4882a593Smuzhiyun else
2120*4882a593Smuzhiyun iocmd->status = bfa_itnim_get_ioprofile(
2121*4882a593Smuzhiyun bfa_fcs_itnim_get_halitn(itnim),
2122*4882a593Smuzhiyun &iocmd->ioprofile);
2123*4882a593Smuzhiyun }
2124*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2125*4882a593Smuzhiyun return 0;
2126*4882a593Smuzhiyun }
2127*4882a593Smuzhiyun
2128*4882a593Smuzhiyun static int
bfad_iocmd_fcport_get_stats(struct bfad_s * bfad,void * cmd)2129*4882a593Smuzhiyun bfad_iocmd_fcport_get_stats(struct bfad_s *bfad, void *cmd)
2130*4882a593Smuzhiyun {
2131*4882a593Smuzhiyun struct bfa_bsg_fcport_stats_s *iocmd =
2132*4882a593Smuzhiyun (struct bfa_bsg_fcport_stats_s *)cmd;
2133*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2134*4882a593Smuzhiyun unsigned long flags;
2135*4882a593Smuzhiyun struct bfa_cb_pending_q_s cb_qe;
2136*4882a593Smuzhiyun
2137*4882a593Smuzhiyun init_completion(&fcomp.comp);
2138*4882a593Smuzhiyun bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
2139*4882a593Smuzhiyun &fcomp, &iocmd->stats);
2140*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2141*4882a593Smuzhiyun iocmd->status = bfa_fcport_get_stats(&bfad->bfa, &cb_qe);
2142*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2143*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
2144*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
2145*4882a593Smuzhiyun goto out;
2146*4882a593Smuzhiyun }
2147*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2148*4882a593Smuzhiyun iocmd->status = fcomp.status;
2149*4882a593Smuzhiyun out:
2150*4882a593Smuzhiyun return 0;
2151*4882a593Smuzhiyun }
2152*4882a593Smuzhiyun
2153*4882a593Smuzhiyun static int
bfad_iocmd_fcport_reset_stats(struct bfad_s * bfad,void * cmd)2154*4882a593Smuzhiyun bfad_iocmd_fcport_reset_stats(struct bfad_s *bfad, void *cmd)
2155*4882a593Smuzhiyun {
2156*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
2157*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2158*4882a593Smuzhiyun unsigned long flags;
2159*4882a593Smuzhiyun struct bfa_cb_pending_q_s cb_qe;
2160*4882a593Smuzhiyun
2161*4882a593Smuzhiyun init_completion(&fcomp.comp);
2162*4882a593Smuzhiyun bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, &fcomp, NULL);
2163*4882a593Smuzhiyun
2164*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2165*4882a593Smuzhiyun iocmd->status = bfa_fcport_clear_stats(&bfad->bfa, &cb_qe);
2166*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2167*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
2168*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
2169*4882a593Smuzhiyun goto out;
2170*4882a593Smuzhiyun }
2171*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2172*4882a593Smuzhiyun iocmd->status = fcomp.status;
2173*4882a593Smuzhiyun out:
2174*4882a593Smuzhiyun return 0;
2175*4882a593Smuzhiyun }
2176*4882a593Smuzhiyun
2177*4882a593Smuzhiyun static int
bfad_iocmd_boot_cfg(struct bfad_s * bfad,void * cmd)2178*4882a593Smuzhiyun bfad_iocmd_boot_cfg(struct bfad_s *bfad, void *cmd)
2179*4882a593Smuzhiyun {
2180*4882a593Smuzhiyun struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd;
2181*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2182*4882a593Smuzhiyun unsigned long flags;
2183*4882a593Smuzhiyun
2184*4882a593Smuzhiyun init_completion(&fcomp.comp);
2185*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2186*4882a593Smuzhiyun iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
2187*4882a593Smuzhiyun BFA_FLASH_PART_BOOT, bfad->bfa.ioc.port_id,
2188*4882a593Smuzhiyun &iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0,
2189*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
2190*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2191*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
2192*4882a593Smuzhiyun goto out;
2193*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2194*4882a593Smuzhiyun iocmd->status = fcomp.status;
2195*4882a593Smuzhiyun out:
2196*4882a593Smuzhiyun return 0;
2197*4882a593Smuzhiyun }
2198*4882a593Smuzhiyun
2199*4882a593Smuzhiyun static int
bfad_iocmd_boot_query(struct bfad_s * bfad,void * cmd)2200*4882a593Smuzhiyun bfad_iocmd_boot_query(struct bfad_s *bfad, void *cmd)
2201*4882a593Smuzhiyun {
2202*4882a593Smuzhiyun struct bfa_bsg_boot_s *iocmd = (struct bfa_bsg_boot_s *)cmd;
2203*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2204*4882a593Smuzhiyun unsigned long flags;
2205*4882a593Smuzhiyun
2206*4882a593Smuzhiyun init_completion(&fcomp.comp);
2207*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2208*4882a593Smuzhiyun iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa),
2209*4882a593Smuzhiyun BFA_FLASH_PART_BOOT, bfad->bfa.ioc.port_id,
2210*4882a593Smuzhiyun &iocmd->cfg, sizeof(struct bfa_boot_cfg_s), 0,
2211*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
2212*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2213*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
2214*4882a593Smuzhiyun goto out;
2215*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2216*4882a593Smuzhiyun iocmd->status = fcomp.status;
2217*4882a593Smuzhiyun out:
2218*4882a593Smuzhiyun return 0;
2219*4882a593Smuzhiyun }
2220*4882a593Smuzhiyun
2221*4882a593Smuzhiyun static int
bfad_iocmd_preboot_query(struct bfad_s * bfad,void * cmd)2222*4882a593Smuzhiyun bfad_iocmd_preboot_query(struct bfad_s *bfad, void *cmd)
2223*4882a593Smuzhiyun {
2224*4882a593Smuzhiyun struct bfa_bsg_preboot_s *iocmd = (struct bfa_bsg_preboot_s *)cmd;
2225*4882a593Smuzhiyun struct bfi_iocfc_cfgrsp_s *cfgrsp = bfad->bfa.iocfc.cfgrsp;
2226*4882a593Smuzhiyun struct bfa_boot_pbc_s *pbcfg = &iocmd->cfg;
2227*4882a593Smuzhiyun unsigned long flags;
2228*4882a593Smuzhiyun
2229*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2230*4882a593Smuzhiyun pbcfg->enable = cfgrsp->pbc_cfg.boot_enabled;
2231*4882a593Smuzhiyun pbcfg->nbluns = cfgrsp->pbc_cfg.nbluns;
2232*4882a593Smuzhiyun pbcfg->speed = cfgrsp->pbc_cfg.port_speed;
2233*4882a593Smuzhiyun memcpy(pbcfg->pblun, cfgrsp->pbc_cfg.blun, sizeof(pbcfg->pblun));
2234*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
2235*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2236*4882a593Smuzhiyun
2237*4882a593Smuzhiyun return 0;
2238*4882a593Smuzhiyun }
2239*4882a593Smuzhiyun
2240*4882a593Smuzhiyun static int
bfad_iocmd_ethboot_cfg(struct bfad_s * bfad,void * cmd)2241*4882a593Smuzhiyun bfad_iocmd_ethboot_cfg(struct bfad_s *bfad, void *cmd)
2242*4882a593Smuzhiyun {
2243*4882a593Smuzhiyun struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd;
2244*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2245*4882a593Smuzhiyun unsigned long flags;
2246*4882a593Smuzhiyun
2247*4882a593Smuzhiyun init_completion(&fcomp.comp);
2248*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2249*4882a593Smuzhiyun iocmd->status = bfa_flash_update_part(BFA_FLASH(&bfad->bfa),
2250*4882a593Smuzhiyun BFA_FLASH_PART_PXECFG,
2251*4882a593Smuzhiyun bfad->bfa.ioc.port_id, &iocmd->cfg,
2252*4882a593Smuzhiyun sizeof(struct bfa_ethboot_cfg_s), 0,
2253*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
2254*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2255*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
2256*4882a593Smuzhiyun goto out;
2257*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2258*4882a593Smuzhiyun iocmd->status = fcomp.status;
2259*4882a593Smuzhiyun out:
2260*4882a593Smuzhiyun return 0;
2261*4882a593Smuzhiyun }
2262*4882a593Smuzhiyun
2263*4882a593Smuzhiyun static int
bfad_iocmd_ethboot_query(struct bfad_s * bfad,void * cmd)2264*4882a593Smuzhiyun bfad_iocmd_ethboot_query(struct bfad_s *bfad, void *cmd)
2265*4882a593Smuzhiyun {
2266*4882a593Smuzhiyun struct bfa_bsg_ethboot_s *iocmd = (struct bfa_bsg_ethboot_s *)cmd;
2267*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2268*4882a593Smuzhiyun unsigned long flags;
2269*4882a593Smuzhiyun
2270*4882a593Smuzhiyun init_completion(&fcomp.comp);
2271*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2272*4882a593Smuzhiyun iocmd->status = bfa_flash_read_part(BFA_FLASH(&bfad->bfa),
2273*4882a593Smuzhiyun BFA_FLASH_PART_PXECFG,
2274*4882a593Smuzhiyun bfad->bfa.ioc.port_id, &iocmd->cfg,
2275*4882a593Smuzhiyun sizeof(struct bfa_ethboot_cfg_s), 0,
2276*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
2277*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2278*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK)
2279*4882a593Smuzhiyun goto out;
2280*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2281*4882a593Smuzhiyun iocmd->status = fcomp.status;
2282*4882a593Smuzhiyun out:
2283*4882a593Smuzhiyun return 0;
2284*4882a593Smuzhiyun }
2285*4882a593Smuzhiyun
2286*4882a593Smuzhiyun static int
bfad_iocmd_cfg_trunk(struct bfad_s * bfad,void * cmd,unsigned int v_cmd)2287*4882a593Smuzhiyun bfad_iocmd_cfg_trunk(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
2288*4882a593Smuzhiyun {
2289*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
2290*4882a593Smuzhiyun struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
2291*4882a593Smuzhiyun struct bfa_fcport_trunk_s *trunk = &fcport->trunk;
2292*4882a593Smuzhiyun unsigned long flags;
2293*4882a593Smuzhiyun
2294*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2295*4882a593Smuzhiyun
2296*4882a593Smuzhiyun if (bfa_fcport_is_dport(&bfad->bfa)) {
2297*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2298*4882a593Smuzhiyun return BFA_STATUS_DPORT_ERR;
2299*4882a593Smuzhiyun }
2300*4882a593Smuzhiyun
2301*4882a593Smuzhiyun if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) ||
2302*4882a593Smuzhiyun (fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2303*4882a593Smuzhiyun iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2304*4882a593Smuzhiyun else {
2305*4882a593Smuzhiyun if (v_cmd == IOCMD_TRUNK_ENABLE) {
2306*4882a593Smuzhiyun trunk->attr.state = BFA_TRUNK_OFFLINE;
2307*4882a593Smuzhiyun bfa_fcport_disable(&bfad->bfa);
2308*4882a593Smuzhiyun fcport->cfg.trunked = BFA_TRUE;
2309*4882a593Smuzhiyun } else if (v_cmd == IOCMD_TRUNK_DISABLE) {
2310*4882a593Smuzhiyun trunk->attr.state = BFA_TRUNK_DISABLED;
2311*4882a593Smuzhiyun bfa_fcport_disable(&bfad->bfa);
2312*4882a593Smuzhiyun fcport->cfg.trunked = BFA_FALSE;
2313*4882a593Smuzhiyun }
2314*4882a593Smuzhiyun
2315*4882a593Smuzhiyun if (!bfa_fcport_is_disabled(&bfad->bfa))
2316*4882a593Smuzhiyun bfa_fcport_enable(&bfad->bfa);
2317*4882a593Smuzhiyun
2318*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
2319*4882a593Smuzhiyun }
2320*4882a593Smuzhiyun
2321*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2322*4882a593Smuzhiyun
2323*4882a593Smuzhiyun return 0;
2324*4882a593Smuzhiyun }
2325*4882a593Smuzhiyun
2326*4882a593Smuzhiyun static int
bfad_iocmd_trunk_get_attr(struct bfad_s * bfad,void * cmd)2327*4882a593Smuzhiyun bfad_iocmd_trunk_get_attr(struct bfad_s *bfad, void *cmd)
2328*4882a593Smuzhiyun {
2329*4882a593Smuzhiyun struct bfa_bsg_trunk_attr_s *iocmd = (struct bfa_bsg_trunk_attr_s *)cmd;
2330*4882a593Smuzhiyun struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
2331*4882a593Smuzhiyun struct bfa_fcport_trunk_s *trunk = &fcport->trunk;
2332*4882a593Smuzhiyun unsigned long flags;
2333*4882a593Smuzhiyun
2334*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2335*4882a593Smuzhiyun if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) ||
2336*4882a593Smuzhiyun (fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2337*4882a593Smuzhiyun iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2338*4882a593Smuzhiyun else {
2339*4882a593Smuzhiyun memcpy((void *)&iocmd->attr, (void *)&trunk->attr,
2340*4882a593Smuzhiyun sizeof(struct bfa_trunk_attr_s));
2341*4882a593Smuzhiyun iocmd->attr.port_id = bfa_lps_get_base_pid(&bfad->bfa);
2342*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
2343*4882a593Smuzhiyun }
2344*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2345*4882a593Smuzhiyun
2346*4882a593Smuzhiyun return 0;
2347*4882a593Smuzhiyun }
2348*4882a593Smuzhiyun
2349*4882a593Smuzhiyun static int
bfad_iocmd_qos(struct bfad_s * bfad,void * cmd,unsigned int v_cmd)2350*4882a593Smuzhiyun bfad_iocmd_qos(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
2351*4882a593Smuzhiyun {
2352*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
2353*4882a593Smuzhiyun struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
2354*4882a593Smuzhiyun unsigned long flags;
2355*4882a593Smuzhiyun
2356*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2357*4882a593Smuzhiyun if (bfa_ioc_get_type(&bfad->bfa.ioc) == BFA_IOC_TYPE_FC) {
2358*4882a593Smuzhiyun if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
2359*4882a593Smuzhiyun (fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2360*4882a593Smuzhiyun iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2361*4882a593Smuzhiyun else {
2362*4882a593Smuzhiyun if (v_cmd == IOCMD_QOS_ENABLE)
2363*4882a593Smuzhiyun fcport->cfg.qos_enabled = BFA_TRUE;
2364*4882a593Smuzhiyun else if (v_cmd == IOCMD_QOS_DISABLE) {
2365*4882a593Smuzhiyun fcport->cfg.qos_enabled = BFA_FALSE;
2366*4882a593Smuzhiyun fcport->cfg.qos_bw.high = BFA_QOS_BW_HIGH;
2367*4882a593Smuzhiyun fcport->cfg.qos_bw.med = BFA_QOS_BW_MED;
2368*4882a593Smuzhiyun fcport->cfg.qos_bw.low = BFA_QOS_BW_LOW;
2369*4882a593Smuzhiyun }
2370*4882a593Smuzhiyun }
2371*4882a593Smuzhiyun }
2372*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2373*4882a593Smuzhiyun
2374*4882a593Smuzhiyun return 0;
2375*4882a593Smuzhiyun }
2376*4882a593Smuzhiyun
2377*4882a593Smuzhiyun static int
bfad_iocmd_qos_get_attr(struct bfad_s * bfad,void * cmd)2378*4882a593Smuzhiyun bfad_iocmd_qos_get_attr(struct bfad_s *bfad, void *cmd)
2379*4882a593Smuzhiyun {
2380*4882a593Smuzhiyun struct bfa_bsg_qos_attr_s *iocmd = (struct bfa_bsg_qos_attr_s *)cmd;
2381*4882a593Smuzhiyun struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
2382*4882a593Smuzhiyun unsigned long flags;
2383*4882a593Smuzhiyun
2384*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2385*4882a593Smuzhiyun if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
2386*4882a593Smuzhiyun (fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2387*4882a593Smuzhiyun iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2388*4882a593Smuzhiyun else {
2389*4882a593Smuzhiyun iocmd->attr.state = fcport->qos_attr.state;
2390*4882a593Smuzhiyun iocmd->attr.total_bb_cr =
2391*4882a593Smuzhiyun be32_to_cpu(fcport->qos_attr.total_bb_cr);
2392*4882a593Smuzhiyun iocmd->attr.qos_bw.high = fcport->cfg.qos_bw.high;
2393*4882a593Smuzhiyun iocmd->attr.qos_bw.med = fcport->cfg.qos_bw.med;
2394*4882a593Smuzhiyun iocmd->attr.qos_bw.low = fcport->cfg.qos_bw.low;
2395*4882a593Smuzhiyun iocmd->attr.qos_bw_op = fcport->qos_attr.qos_bw_op;
2396*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
2397*4882a593Smuzhiyun }
2398*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2399*4882a593Smuzhiyun
2400*4882a593Smuzhiyun return 0;
2401*4882a593Smuzhiyun }
2402*4882a593Smuzhiyun
2403*4882a593Smuzhiyun static int
bfad_iocmd_qos_get_vc_attr(struct bfad_s * bfad,void * cmd)2404*4882a593Smuzhiyun bfad_iocmd_qos_get_vc_attr(struct bfad_s *bfad, void *cmd)
2405*4882a593Smuzhiyun {
2406*4882a593Smuzhiyun struct bfa_bsg_qos_vc_attr_s *iocmd =
2407*4882a593Smuzhiyun (struct bfa_bsg_qos_vc_attr_s *)cmd;
2408*4882a593Smuzhiyun struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
2409*4882a593Smuzhiyun struct bfa_qos_vc_attr_s *bfa_vc_attr = &fcport->qos_vc_attr;
2410*4882a593Smuzhiyun unsigned long flags;
2411*4882a593Smuzhiyun u32 i = 0;
2412*4882a593Smuzhiyun
2413*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2414*4882a593Smuzhiyun iocmd->attr.total_vc_count = be16_to_cpu(bfa_vc_attr->total_vc_count);
2415*4882a593Smuzhiyun iocmd->attr.shared_credit = be16_to_cpu(bfa_vc_attr->shared_credit);
2416*4882a593Smuzhiyun iocmd->attr.elp_opmode_flags =
2417*4882a593Smuzhiyun be32_to_cpu(bfa_vc_attr->elp_opmode_flags);
2418*4882a593Smuzhiyun
2419*4882a593Smuzhiyun /* Individual VC info */
2420*4882a593Smuzhiyun while (i < iocmd->attr.total_vc_count) {
2421*4882a593Smuzhiyun iocmd->attr.vc_info[i].vc_credit =
2422*4882a593Smuzhiyun bfa_vc_attr->vc_info[i].vc_credit;
2423*4882a593Smuzhiyun iocmd->attr.vc_info[i].borrow_credit =
2424*4882a593Smuzhiyun bfa_vc_attr->vc_info[i].borrow_credit;
2425*4882a593Smuzhiyun iocmd->attr.vc_info[i].priority =
2426*4882a593Smuzhiyun bfa_vc_attr->vc_info[i].priority;
2427*4882a593Smuzhiyun i++;
2428*4882a593Smuzhiyun }
2429*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2430*4882a593Smuzhiyun
2431*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
2432*4882a593Smuzhiyun return 0;
2433*4882a593Smuzhiyun }
2434*4882a593Smuzhiyun
2435*4882a593Smuzhiyun static int
bfad_iocmd_qos_get_stats(struct bfad_s * bfad,void * cmd)2436*4882a593Smuzhiyun bfad_iocmd_qos_get_stats(struct bfad_s *bfad, void *cmd)
2437*4882a593Smuzhiyun {
2438*4882a593Smuzhiyun struct bfa_bsg_fcport_stats_s *iocmd =
2439*4882a593Smuzhiyun (struct bfa_bsg_fcport_stats_s *)cmd;
2440*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2441*4882a593Smuzhiyun unsigned long flags;
2442*4882a593Smuzhiyun struct bfa_cb_pending_q_s cb_qe;
2443*4882a593Smuzhiyun struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
2444*4882a593Smuzhiyun
2445*4882a593Smuzhiyun init_completion(&fcomp.comp);
2446*4882a593Smuzhiyun bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
2447*4882a593Smuzhiyun &fcomp, &iocmd->stats);
2448*4882a593Smuzhiyun
2449*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2450*4882a593Smuzhiyun WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc));
2451*4882a593Smuzhiyun if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
2452*4882a593Smuzhiyun (fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2453*4882a593Smuzhiyun iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2454*4882a593Smuzhiyun else
2455*4882a593Smuzhiyun iocmd->status = bfa_fcport_get_stats(&bfad->bfa, &cb_qe);
2456*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2457*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
2458*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
2459*4882a593Smuzhiyun goto out;
2460*4882a593Smuzhiyun }
2461*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2462*4882a593Smuzhiyun iocmd->status = fcomp.status;
2463*4882a593Smuzhiyun out:
2464*4882a593Smuzhiyun return 0;
2465*4882a593Smuzhiyun }
2466*4882a593Smuzhiyun
2467*4882a593Smuzhiyun static int
bfad_iocmd_qos_reset_stats(struct bfad_s * bfad,void * cmd)2468*4882a593Smuzhiyun bfad_iocmd_qos_reset_stats(struct bfad_s *bfad, void *cmd)
2469*4882a593Smuzhiyun {
2470*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
2471*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2472*4882a593Smuzhiyun unsigned long flags;
2473*4882a593Smuzhiyun struct bfa_cb_pending_q_s cb_qe;
2474*4882a593Smuzhiyun struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
2475*4882a593Smuzhiyun
2476*4882a593Smuzhiyun init_completion(&fcomp.comp);
2477*4882a593Smuzhiyun bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
2478*4882a593Smuzhiyun &fcomp, NULL);
2479*4882a593Smuzhiyun
2480*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2481*4882a593Smuzhiyun WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc));
2482*4882a593Smuzhiyun if ((fcport->cfg.topology == BFA_PORT_TOPOLOGY_LOOP) &&
2483*4882a593Smuzhiyun (fcport->topology == BFA_PORT_TOPOLOGY_LOOP))
2484*4882a593Smuzhiyun iocmd->status = BFA_STATUS_TOPOLOGY_LOOP;
2485*4882a593Smuzhiyun else
2486*4882a593Smuzhiyun iocmd->status = bfa_fcport_clear_stats(&bfad->bfa, &cb_qe);
2487*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2488*4882a593Smuzhiyun if (iocmd->status != BFA_STATUS_OK) {
2489*4882a593Smuzhiyun bfa_trc(bfad, iocmd->status);
2490*4882a593Smuzhiyun goto out;
2491*4882a593Smuzhiyun }
2492*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2493*4882a593Smuzhiyun iocmd->status = fcomp.status;
2494*4882a593Smuzhiyun out:
2495*4882a593Smuzhiyun return 0;
2496*4882a593Smuzhiyun }
2497*4882a593Smuzhiyun
2498*4882a593Smuzhiyun static int
bfad_iocmd_vf_get_stats(struct bfad_s * bfad,void * cmd)2499*4882a593Smuzhiyun bfad_iocmd_vf_get_stats(struct bfad_s *bfad, void *cmd)
2500*4882a593Smuzhiyun {
2501*4882a593Smuzhiyun struct bfa_bsg_vf_stats_s *iocmd =
2502*4882a593Smuzhiyun (struct bfa_bsg_vf_stats_s *)cmd;
2503*4882a593Smuzhiyun struct bfa_fcs_fabric_s *fcs_vf;
2504*4882a593Smuzhiyun unsigned long flags;
2505*4882a593Smuzhiyun
2506*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2507*4882a593Smuzhiyun fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id);
2508*4882a593Smuzhiyun if (fcs_vf == NULL) {
2509*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2510*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_VFID;
2511*4882a593Smuzhiyun goto out;
2512*4882a593Smuzhiyun }
2513*4882a593Smuzhiyun memcpy((void *)&iocmd->stats, (void *)&fcs_vf->stats,
2514*4882a593Smuzhiyun sizeof(struct bfa_vf_stats_s));
2515*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2516*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
2517*4882a593Smuzhiyun out:
2518*4882a593Smuzhiyun return 0;
2519*4882a593Smuzhiyun }
2520*4882a593Smuzhiyun
2521*4882a593Smuzhiyun static int
bfad_iocmd_vf_clr_stats(struct bfad_s * bfad,void * cmd)2522*4882a593Smuzhiyun bfad_iocmd_vf_clr_stats(struct bfad_s *bfad, void *cmd)
2523*4882a593Smuzhiyun {
2524*4882a593Smuzhiyun struct bfa_bsg_vf_reset_stats_s *iocmd =
2525*4882a593Smuzhiyun (struct bfa_bsg_vf_reset_stats_s *)cmd;
2526*4882a593Smuzhiyun struct bfa_fcs_fabric_s *fcs_vf;
2527*4882a593Smuzhiyun unsigned long flags;
2528*4882a593Smuzhiyun
2529*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2530*4882a593Smuzhiyun fcs_vf = bfa_fcs_vf_lookup(&bfad->bfa_fcs, iocmd->vf_id);
2531*4882a593Smuzhiyun if (fcs_vf == NULL) {
2532*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2533*4882a593Smuzhiyun iocmd->status = BFA_STATUS_UNKNOWN_VFID;
2534*4882a593Smuzhiyun goto out;
2535*4882a593Smuzhiyun }
2536*4882a593Smuzhiyun memset((void *)&fcs_vf->stats, 0, sizeof(struct bfa_vf_stats_s));
2537*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2538*4882a593Smuzhiyun iocmd->status = BFA_STATUS_OK;
2539*4882a593Smuzhiyun out:
2540*4882a593Smuzhiyun return 0;
2541*4882a593Smuzhiyun }
2542*4882a593Smuzhiyun
2543*4882a593Smuzhiyun /* Function to reset the LUN SCAN mode */
2544*4882a593Smuzhiyun static void
bfad_iocmd_lunmask_reset_lunscan_mode(struct bfad_s * bfad,int lunmask_cfg)2545*4882a593Smuzhiyun bfad_iocmd_lunmask_reset_lunscan_mode(struct bfad_s *bfad, int lunmask_cfg)
2546*4882a593Smuzhiyun {
2547*4882a593Smuzhiyun struct bfad_im_port_s *pport_im = bfad->pport.im_port;
2548*4882a593Smuzhiyun struct bfad_vport_s *vport = NULL;
2549*4882a593Smuzhiyun
2550*4882a593Smuzhiyun /* Set the scsi device LUN SCAN flags for base port */
2551*4882a593Smuzhiyun bfad_reset_sdev_bflags(pport_im, lunmask_cfg);
2552*4882a593Smuzhiyun
2553*4882a593Smuzhiyun /* Set the scsi device LUN SCAN flags for the vports */
2554*4882a593Smuzhiyun list_for_each_entry(vport, &bfad->vport_list, list_entry)
2555*4882a593Smuzhiyun bfad_reset_sdev_bflags(vport->drv_port.im_port, lunmask_cfg);
2556*4882a593Smuzhiyun }
2557*4882a593Smuzhiyun
2558*4882a593Smuzhiyun static int
bfad_iocmd_lunmask(struct bfad_s * bfad,void * pcmd,unsigned int v_cmd)2559*4882a593Smuzhiyun bfad_iocmd_lunmask(struct bfad_s *bfad, void *pcmd, unsigned int v_cmd)
2560*4882a593Smuzhiyun {
2561*4882a593Smuzhiyun struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)pcmd;
2562*4882a593Smuzhiyun unsigned long flags;
2563*4882a593Smuzhiyun
2564*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2565*4882a593Smuzhiyun if (v_cmd == IOCMD_FCPIM_LUNMASK_ENABLE) {
2566*4882a593Smuzhiyun iocmd->status = bfa_fcpim_lunmask_update(&bfad->bfa, BFA_TRUE);
2567*4882a593Smuzhiyun /* Set the LUN Scanning mode to be Sequential scan */
2568*4882a593Smuzhiyun if (iocmd->status == BFA_STATUS_OK)
2569*4882a593Smuzhiyun bfad_iocmd_lunmask_reset_lunscan_mode(bfad, BFA_TRUE);
2570*4882a593Smuzhiyun } else if (v_cmd == IOCMD_FCPIM_LUNMASK_DISABLE) {
2571*4882a593Smuzhiyun iocmd->status = bfa_fcpim_lunmask_update(&bfad->bfa, BFA_FALSE);
2572*4882a593Smuzhiyun /* Set the LUN Scanning mode to default REPORT_LUNS scan */
2573*4882a593Smuzhiyun if (iocmd->status == BFA_STATUS_OK)
2574*4882a593Smuzhiyun bfad_iocmd_lunmask_reset_lunscan_mode(bfad, BFA_FALSE);
2575*4882a593Smuzhiyun } else if (v_cmd == IOCMD_FCPIM_LUNMASK_CLEAR)
2576*4882a593Smuzhiyun iocmd->status = bfa_fcpim_lunmask_clear(&bfad->bfa);
2577*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2578*4882a593Smuzhiyun return 0;
2579*4882a593Smuzhiyun }
2580*4882a593Smuzhiyun
2581*4882a593Smuzhiyun static int
bfad_iocmd_fcpim_lunmask_query(struct bfad_s * bfad,void * cmd)2582*4882a593Smuzhiyun bfad_iocmd_fcpim_lunmask_query(struct bfad_s *bfad, void *cmd)
2583*4882a593Smuzhiyun {
2584*4882a593Smuzhiyun struct bfa_bsg_fcpim_lunmask_query_s *iocmd =
2585*4882a593Smuzhiyun (struct bfa_bsg_fcpim_lunmask_query_s *)cmd;
2586*4882a593Smuzhiyun struct bfa_lunmask_cfg_s *lun_mask = &iocmd->lun_mask;
2587*4882a593Smuzhiyun unsigned long flags;
2588*4882a593Smuzhiyun
2589*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2590*4882a593Smuzhiyun iocmd->status = bfa_fcpim_lunmask_query(&bfad->bfa, lun_mask);
2591*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2592*4882a593Smuzhiyun return 0;
2593*4882a593Smuzhiyun }
2594*4882a593Smuzhiyun
2595*4882a593Smuzhiyun static int
bfad_iocmd_fcpim_cfg_lunmask(struct bfad_s * bfad,void * cmd,unsigned int v_cmd)2596*4882a593Smuzhiyun bfad_iocmd_fcpim_cfg_lunmask(struct bfad_s *bfad, void *cmd, unsigned int v_cmd)
2597*4882a593Smuzhiyun {
2598*4882a593Smuzhiyun struct bfa_bsg_fcpim_lunmask_s *iocmd =
2599*4882a593Smuzhiyun (struct bfa_bsg_fcpim_lunmask_s *)cmd;
2600*4882a593Smuzhiyun unsigned long flags;
2601*4882a593Smuzhiyun
2602*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2603*4882a593Smuzhiyun if (v_cmd == IOCMD_FCPIM_LUNMASK_ADD)
2604*4882a593Smuzhiyun iocmd->status = bfa_fcpim_lunmask_add(&bfad->bfa, iocmd->vf_id,
2605*4882a593Smuzhiyun &iocmd->pwwn, iocmd->rpwwn, iocmd->lun);
2606*4882a593Smuzhiyun else if (v_cmd == IOCMD_FCPIM_LUNMASK_DELETE)
2607*4882a593Smuzhiyun iocmd->status = bfa_fcpim_lunmask_delete(&bfad->bfa,
2608*4882a593Smuzhiyun iocmd->vf_id, &iocmd->pwwn,
2609*4882a593Smuzhiyun iocmd->rpwwn, iocmd->lun);
2610*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2611*4882a593Smuzhiyun return 0;
2612*4882a593Smuzhiyun }
2613*4882a593Smuzhiyun
2614*4882a593Smuzhiyun static int
bfad_iocmd_fcpim_throttle_query(struct bfad_s * bfad,void * cmd)2615*4882a593Smuzhiyun bfad_iocmd_fcpim_throttle_query(struct bfad_s *bfad, void *cmd)
2616*4882a593Smuzhiyun {
2617*4882a593Smuzhiyun struct bfa_bsg_fcpim_throttle_s *iocmd =
2618*4882a593Smuzhiyun (struct bfa_bsg_fcpim_throttle_s *)cmd;
2619*4882a593Smuzhiyun unsigned long flags;
2620*4882a593Smuzhiyun
2621*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2622*4882a593Smuzhiyun iocmd->status = bfa_fcpim_throttle_get(&bfad->bfa,
2623*4882a593Smuzhiyun (void *)&iocmd->throttle);
2624*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2625*4882a593Smuzhiyun
2626*4882a593Smuzhiyun return 0;
2627*4882a593Smuzhiyun }
2628*4882a593Smuzhiyun
2629*4882a593Smuzhiyun static int
bfad_iocmd_fcpim_throttle_set(struct bfad_s * bfad,void * cmd)2630*4882a593Smuzhiyun bfad_iocmd_fcpim_throttle_set(struct bfad_s *bfad, void *cmd)
2631*4882a593Smuzhiyun {
2632*4882a593Smuzhiyun struct bfa_bsg_fcpim_throttle_s *iocmd =
2633*4882a593Smuzhiyun (struct bfa_bsg_fcpim_throttle_s *)cmd;
2634*4882a593Smuzhiyun unsigned long flags;
2635*4882a593Smuzhiyun
2636*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2637*4882a593Smuzhiyun iocmd->status = bfa_fcpim_throttle_set(&bfad->bfa,
2638*4882a593Smuzhiyun iocmd->throttle.cfg_value);
2639*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2640*4882a593Smuzhiyun
2641*4882a593Smuzhiyun return 0;
2642*4882a593Smuzhiyun }
2643*4882a593Smuzhiyun
2644*4882a593Smuzhiyun static int
bfad_iocmd_tfru_read(struct bfad_s * bfad,void * cmd)2645*4882a593Smuzhiyun bfad_iocmd_tfru_read(struct bfad_s *bfad, void *cmd)
2646*4882a593Smuzhiyun {
2647*4882a593Smuzhiyun struct bfa_bsg_tfru_s *iocmd =
2648*4882a593Smuzhiyun (struct bfa_bsg_tfru_s *)cmd;
2649*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2650*4882a593Smuzhiyun unsigned long flags = 0;
2651*4882a593Smuzhiyun
2652*4882a593Smuzhiyun init_completion(&fcomp.comp);
2653*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2654*4882a593Smuzhiyun iocmd->status = bfa_tfru_read(BFA_FRU(&bfad->bfa),
2655*4882a593Smuzhiyun &iocmd->data, iocmd->len, iocmd->offset,
2656*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
2657*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2658*4882a593Smuzhiyun if (iocmd->status == BFA_STATUS_OK) {
2659*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2660*4882a593Smuzhiyun iocmd->status = fcomp.status;
2661*4882a593Smuzhiyun }
2662*4882a593Smuzhiyun
2663*4882a593Smuzhiyun return 0;
2664*4882a593Smuzhiyun }
2665*4882a593Smuzhiyun
2666*4882a593Smuzhiyun static int
bfad_iocmd_tfru_write(struct bfad_s * bfad,void * cmd)2667*4882a593Smuzhiyun bfad_iocmd_tfru_write(struct bfad_s *bfad, void *cmd)
2668*4882a593Smuzhiyun {
2669*4882a593Smuzhiyun struct bfa_bsg_tfru_s *iocmd =
2670*4882a593Smuzhiyun (struct bfa_bsg_tfru_s *)cmd;
2671*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2672*4882a593Smuzhiyun unsigned long flags = 0;
2673*4882a593Smuzhiyun
2674*4882a593Smuzhiyun init_completion(&fcomp.comp);
2675*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2676*4882a593Smuzhiyun iocmd->status = bfa_tfru_write(BFA_FRU(&bfad->bfa),
2677*4882a593Smuzhiyun &iocmd->data, iocmd->len, iocmd->offset,
2678*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
2679*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2680*4882a593Smuzhiyun if (iocmd->status == BFA_STATUS_OK) {
2681*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2682*4882a593Smuzhiyun iocmd->status = fcomp.status;
2683*4882a593Smuzhiyun }
2684*4882a593Smuzhiyun
2685*4882a593Smuzhiyun return 0;
2686*4882a593Smuzhiyun }
2687*4882a593Smuzhiyun
2688*4882a593Smuzhiyun static int
bfad_iocmd_fruvpd_read(struct bfad_s * bfad,void * cmd)2689*4882a593Smuzhiyun bfad_iocmd_fruvpd_read(struct bfad_s *bfad, void *cmd)
2690*4882a593Smuzhiyun {
2691*4882a593Smuzhiyun struct bfa_bsg_fruvpd_s *iocmd =
2692*4882a593Smuzhiyun (struct bfa_bsg_fruvpd_s *)cmd;
2693*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2694*4882a593Smuzhiyun unsigned long flags = 0;
2695*4882a593Smuzhiyun
2696*4882a593Smuzhiyun init_completion(&fcomp.comp);
2697*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2698*4882a593Smuzhiyun iocmd->status = bfa_fruvpd_read(BFA_FRU(&bfad->bfa),
2699*4882a593Smuzhiyun &iocmd->data, iocmd->len, iocmd->offset,
2700*4882a593Smuzhiyun bfad_hcb_comp, &fcomp);
2701*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2702*4882a593Smuzhiyun if (iocmd->status == BFA_STATUS_OK) {
2703*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2704*4882a593Smuzhiyun iocmd->status = fcomp.status;
2705*4882a593Smuzhiyun }
2706*4882a593Smuzhiyun
2707*4882a593Smuzhiyun return 0;
2708*4882a593Smuzhiyun }
2709*4882a593Smuzhiyun
2710*4882a593Smuzhiyun static int
bfad_iocmd_fruvpd_update(struct bfad_s * bfad,void * cmd)2711*4882a593Smuzhiyun bfad_iocmd_fruvpd_update(struct bfad_s *bfad, void *cmd)
2712*4882a593Smuzhiyun {
2713*4882a593Smuzhiyun struct bfa_bsg_fruvpd_s *iocmd =
2714*4882a593Smuzhiyun (struct bfa_bsg_fruvpd_s *)cmd;
2715*4882a593Smuzhiyun struct bfad_hal_comp fcomp;
2716*4882a593Smuzhiyun unsigned long flags = 0;
2717*4882a593Smuzhiyun
2718*4882a593Smuzhiyun init_completion(&fcomp.comp);
2719*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2720*4882a593Smuzhiyun iocmd->status = bfa_fruvpd_update(BFA_FRU(&bfad->bfa),
2721*4882a593Smuzhiyun &iocmd->data, iocmd->len, iocmd->offset,
2722*4882a593Smuzhiyun bfad_hcb_comp, &fcomp, iocmd->trfr_cmpl);
2723*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2724*4882a593Smuzhiyun if (iocmd->status == BFA_STATUS_OK) {
2725*4882a593Smuzhiyun wait_for_completion(&fcomp.comp);
2726*4882a593Smuzhiyun iocmd->status = fcomp.status;
2727*4882a593Smuzhiyun }
2728*4882a593Smuzhiyun
2729*4882a593Smuzhiyun return 0;
2730*4882a593Smuzhiyun }
2731*4882a593Smuzhiyun
2732*4882a593Smuzhiyun static int
bfad_iocmd_fruvpd_get_max_size(struct bfad_s * bfad,void * cmd)2733*4882a593Smuzhiyun bfad_iocmd_fruvpd_get_max_size(struct bfad_s *bfad, void *cmd)
2734*4882a593Smuzhiyun {
2735*4882a593Smuzhiyun struct bfa_bsg_fruvpd_max_size_s *iocmd =
2736*4882a593Smuzhiyun (struct bfa_bsg_fruvpd_max_size_s *)cmd;
2737*4882a593Smuzhiyun unsigned long flags = 0;
2738*4882a593Smuzhiyun
2739*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
2740*4882a593Smuzhiyun iocmd->status = bfa_fruvpd_get_max_size(BFA_FRU(&bfad->bfa),
2741*4882a593Smuzhiyun &iocmd->max_size);
2742*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2743*4882a593Smuzhiyun
2744*4882a593Smuzhiyun return 0;
2745*4882a593Smuzhiyun }
2746*4882a593Smuzhiyun
2747*4882a593Smuzhiyun static int
bfad_iocmd_handler(struct bfad_s * bfad,unsigned int cmd,void * iocmd,unsigned int payload_len)2748*4882a593Smuzhiyun bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd,
2749*4882a593Smuzhiyun unsigned int payload_len)
2750*4882a593Smuzhiyun {
2751*4882a593Smuzhiyun int rc = -EINVAL;
2752*4882a593Smuzhiyun
2753*4882a593Smuzhiyun switch (cmd) {
2754*4882a593Smuzhiyun case IOCMD_IOC_ENABLE:
2755*4882a593Smuzhiyun rc = bfad_iocmd_ioc_enable(bfad, iocmd);
2756*4882a593Smuzhiyun break;
2757*4882a593Smuzhiyun case IOCMD_IOC_DISABLE:
2758*4882a593Smuzhiyun rc = bfad_iocmd_ioc_disable(bfad, iocmd);
2759*4882a593Smuzhiyun break;
2760*4882a593Smuzhiyun case IOCMD_IOC_GET_INFO:
2761*4882a593Smuzhiyun rc = bfad_iocmd_ioc_get_info(bfad, iocmd);
2762*4882a593Smuzhiyun break;
2763*4882a593Smuzhiyun case IOCMD_IOC_GET_ATTR:
2764*4882a593Smuzhiyun rc = bfad_iocmd_ioc_get_attr(bfad, iocmd);
2765*4882a593Smuzhiyun break;
2766*4882a593Smuzhiyun case IOCMD_IOC_GET_STATS:
2767*4882a593Smuzhiyun rc = bfad_iocmd_ioc_get_stats(bfad, iocmd);
2768*4882a593Smuzhiyun break;
2769*4882a593Smuzhiyun case IOCMD_IOC_GET_FWSTATS:
2770*4882a593Smuzhiyun rc = bfad_iocmd_ioc_get_fwstats(bfad, iocmd, payload_len);
2771*4882a593Smuzhiyun break;
2772*4882a593Smuzhiyun case IOCMD_IOC_RESET_STATS:
2773*4882a593Smuzhiyun case IOCMD_IOC_RESET_FWSTATS:
2774*4882a593Smuzhiyun rc = bfad_iocmd_ioc_reset_stats(bfad, iocmd, cmd);
2775*4882a593Smuzhiyun break;
2776*4882a593Smuzhiyun case IOCMD_IOC_SET_ADAPTER_NAME:
2777*4882a593Smuzhiyun case IOCMD_IOC_SET_PORT_NAME:
2778*4882a593Smuzhiyun rc = bfad_iocmd_ioc_set_name(bfad, iocmd, cmd);
2779*4882a593Smuzhiyun break;
2780*4882a593Smuzhiyun case IOCMD_IOCFC_GET_ATTR:
2781*4882a593Smuzhiyun rc = bfad_iocmd_iocfc_get_attr(bfad, iocmd);
2782*4882a593Smuzhiyun break;
2783*4882a593Smuzhiyun case IOCMD_IOCFC_SET_INTR:
2784*4882a593Smuzhiyun rc = bfad_iocmd_iocfc_set_intr(bfad, iocmd);
2785*4882a593Smuzhiyun break;
2786*4882a593Smuzhiyun case IOCMD_PORT_ENABLE:
2787*4882a593Smuzhiyun rc = bfad_iocmd_port_enable(bfad, iocmd);
2788*4882a593Smuzhiyun break;
2789*4882a593Smuzhiyun case IOCMD_PORT_DISABLE:
2790*4882a593Smuzhiyun rc = bfad_iocmd_port_disable(bfad, iocmd);
2791*4882a593Smuzhiyun break;
2792*4882a593Smuzhiyun case IOCMD_PORT_GET_ATTR:
2793*4882a593Smuzhiyun rc = bfad_iocmd_port_get_attr(bfad, iocmd);
2794*4882a593Smuzhiyun break;
2795*4882a593Smuzhiyun case IOCMD_PORT_GET_STATS:
2796*4882a593Smuzhiyun rc = bfad_iocmd_port_get_stats(bfad, iocmd, payload_len);
2797*4882a593Smuzhiyun break;
2798*4882a593Smuzhiyun case IOCMD_PORT_RESET_STATS:
2799*4882a593Smuzhiyun rc = bfad_iocmd_port_reset_stats(bfad, iocmd);
2800*4882a593Smuzhiyun break;
2801*4882a593Smuzhiyun case IOCMD_PORT_CFG_TOPO:
2802*4882a593Smuzhiyun case IOCMD_PORT_CFG_SPEED:
2803*4882a593Smuzhiyun case IOCMD_PORT_CFG_ALPA:
2804*4882a593Smuzhiyun case IOCMD_PORT_CLR_ALPA:
2805*4882a593Smuzhiyun rc = bfad_iocmd_set_port_cfg(bfad, iocmd, cmd);
2806*4882a593Smuzhiyun break;
2807*4882a593Smuzhiyun case IOCMD_PORT_CFG_MAXFRSZ:
2808*4882a593Smuzhiyun rc = bfad_iocmd_port_cfg_maxfrsize(bfad, iocmd);
2809*4882a593Smuzhiyun break;
2810*4882a593Smuzhiyun case IOCMD_PORT_BBCR_ENABLE:
2811*4882a593Smuzhiyun case IOCMD_PORT_BBCR_DISABLE:
2812*4882a593Smuzhiyun rc = bfad_iocmd_port_cfg_bbcr(bfad, cmd, iocmd);
2813*4882a593Smuzhiyun break;
2814*4882a593Smuzhiyun case IOCMD_PORT_BBCR_GET_ATTR:
2815*4882a593Smuzhiyun rc = bfad_iocmd_port_get_bbcr_attr(bfad, iocmd);
2816*4882a593Smuzhiyun break;
2817*4882a593Smuzhiyun case IOCMD_LPORT_GET_ATTR:
2818*4882a593Smuzhiyun rc = bfad_iocmd_lport_get_attr(bfad, iocmd);
2819*4882a593Smuzhiyun break;
2820*4882a593Smuzhiyun case IOCMD_LPORT_GET_STATS:
2821*4882a593Smuzhiyun rc = bfad_iocmd_lport_get_stats(bfad, iocmd);
2822*4882a593Smuzhiyun break;
2823*4882a593Smuzhiyun case IOCMD_LPORT_RESET_STATS:
2824*4882a593Smuzhiyun rc = bfad_iocmd_lport_reset_stats(bfad, iocmd);
2825*4882a593Smuzhiyun break;
2826*4882a593Smuzhiyun case IOCMD_LPORT_GET_IOSTATS:
2827*4882a593Smuzhiyun rc = bfad_iocmd_lport_get_iostats(bfad, iocmd);
2828*4882a593Smuzhiyun break;
2829*4882a593Smuzhiyun case IOCMD_LPORT_GET_RPORTS:
2830*4882a593Smuzhiyun rc = bfad_iocmd_lport_get_rports(bfad, iocmd, payload_len);
2831*4882a593Smuzhiyun break;
2832*4882a593Smuzhiyun case IOCMD_RPORT_GET_ATTR:
2833*4882a593Smuzhiyun rc = bfad_iocmd_rport_get_attr(bfad, iocmd);
2834*4882a593Smuzhiyun break;
2835*4882a593Smuzhiyun case IOCMD_RPORT_GET_ADDR:
2836*4882a593Smuzhiyun rc = bfad_iocmd_rport_get_addr(bfad, iocmd);
2837*4882a593Smuzhiyun break;
2838*4882a593Smuzhiyun case IOCMD_RPORT_GET_STATS:
2839*4882a593Smuzhiyun rc = bfad_iocmd_rport_get_stats(bfad, iocmd);
2840*4882a593Smuzhiyun break;
2841*4882a593Smuzhiyun case IOCMD_RPORT_RESET_STATS:
2842*4882a593Smuzhiyun rc = bfad_iocmd_rport_clr_stats(bfad, iocmd);
2843*4882a593Smuzhiyun break;
2844*4882a593Smuzhiyun case IOCMD_RPORT_SET_SPEED:
2845*4882a593Smuzhiyun rc = bfad_iocmd_rport_set_speed(bfad, iocmd);
2846*4882a593Smuzhiyun break;
2847*4882a593Smuzhiyun case IOCMD_VPORT_GET_ATTR:
2848*4882a593Smuzhiyun rc = bfad_iocmd_vport_get_attr(bfad, iocmd);
2849*4882a593Smuzhiyun break;
2850*4882a593Smuzhiyun case IOCMD_VPORT_GET_STATS:
2851*4882a593Smuzhiyun rc = bfad_iocmd_vport_get_stats(bfad, iocmd);
2852*4882a593Smuzhiyun break;
2853*4882a593Smuzhiyun case IOCMD_VPORT_RESET_STATS:
2854*4882a593Smuzhiyun rc = bfad_iocmd_vport_clr_stats(bfad, iocmd);
2855*4882a593Smuzhiyun break;
2856*4882a593Smuzhiyun case IOCMD_FABRIC_GET_LPORTS:
2857*4882a593Smuzhiyun rc = bfad_iocmd_fabric_get_lports(bfad, iocmd, payload_len);
2858*4882a593Smuzhiyun break;
2859*4882a593Smuzhiyun case IOCMD_RATELIM_ENABLE:
2860*4882a593Smuzhiyun case IOCMD_RATELIM_DISABLE:
2861*4882a593Smuzhiyun rc = bfad_iocmd_ratelim(bfad, cmd, iocmd);
2862*4882a593Smuzhiyun break;
2863*4882a593Smuzhiyun case IOCMD_RATELIM_DEF_SPEED:
2864*4882a593Smuzhiyun rc = bfad_iocmd_ratelim_speed(bfad, cmd, iocmd);
2865*4882a593Smuzhiyun break;
2866*4882a593Smuzhiyun case IOCMD_FCPIM_FAILOVER:
2867*4882a593Smuzhiyun rc = bfad_iocmd_cfg_fcpim(bfad, iocmd);
2868*4882a593Smuzhiyun break;
2869*4882a593Smuzhiyun case IOCMD_FCPIM_MODSTATS:
2870*4882a593Smuzhiyun rc = bfad_iocmd_fcpim_get_modstats(bfad, iocmd);
2871*4882a593Smuzhiyun break;
2872*4882a593Smuzhiyun case IOCMD_FCPIM_MODSTATSCLR:
2873*4882a593Smuzhiyun rc = bfad_iocmd_fcpim_clr_modstats(bfad, iocmd);
2874*4882a593Smuzhiyun break;
2875*4882a593Smuzhiyun case IOCMD_FCPIM_DEL_ITN_STATS:
2876*4882a593Smuzhiyun rc = bfad_iocmd_fcpim_get_del_itn_stats(bfad, iocmd);
2877*4882a593Smuzhiyun break;
2878*4882a593Smuzhiyun case IOCMD_ITNIM_GET_ATTR:
2879*4882a593Smuzhiyun rc = bfad_iocmd_itnim_get_attr(bfad, iocmd);
2880*4882a593Smuzhiyun break;
2881*4882a593Smuzhiyun case IOCMD_ITNIM_GET_IOSTATS:
2882*4882a593Smuzhiyun rc = bfad_iocmd_itnim_get_iostats(bfad, iocmd);
2883*4882a593Smuzhiyun break;
2884*4882a593Smuzhiyun case IOCMD_ITNIM_RESET_STATS:
2885*4882a593Smuzhiyun rc = bfad_iocmd_itnim_reset_stats(bfad, iocmd);
2886*4882a593Smuzhiyun break;
2887*4882a593Smuzhiyun case IOCMD_ITNIM_GET_ITNSTATS:
2888*4882a593Smuzhiyun rc = bfad_iocmd_itnim_get_itnstats(bfad, iocmd);
2889*4882a593Smuzhiyun break;
2890*4882a593Smuzhiyun case IOCMD_FCPORT_ENABLE:
2891*4882a593Smuzhiyun rc = bfad_iocmd_fcport_enable(bfad, iocmd);
2892*4882a593Smuzhiyun break;
2893*4882a593Smuzhiyun case IOCMD_FCPORT_DISABLE:
2894*4882a593Smuzhiyun rc = bfad_iocmd_fcport_disable(bfad, iocmd);
2895*4882a593Smuzhiyun break;
2896*4882a593Smuzhiyun case IOCMD_IOC_PCIFN_CFG:
2897*4882a593Smuzhiyun rc = bfad_iocmd_ioc_get_pcifn_cfg(bfad, iocmd);
2898*4882a593Smuzhiyun break;
2899*4882a593Smuzhiyun case IOCMD_IOC_FW_SIG_INV:
2900*4882a593Smuzhiyun rc = bfad_iocmd_ioc_fw_sig_inv(bfad, iocmd);
2901*4882a593Smuzhiyun break;
2902*4882a593Smuzhiyun case IOCMD_PCIFN_CREATE:
2903*4882a593Smuzhiyun rc = bfad_iocmd_pcifn_create(bfad, iocmd);
2904*4882a593Smuzhiyun break;
2905*4882a593Smuzhiyun case IOCMD_PCIFN_DELETE:
2906*4882a593Smuzhiyun rc = bfad_iocmd_pcifn_delete(bfad, iocmd);
2907*4882a593Smuzhiyun break;
2908*4882a593Smuzhiyun case IOCMD_PCIFN_BW:
2909*4882a593Smuzhiyun rc = bfad_iocmd_pcifn_bw(bfad, iocmd);
2910*4882a593Smuzhiyun break;
2911*4882a593Smuzhiyun case IOCMD_ADAPTER_CFG_MODE:
2912*4882a593Smuzhiyun rc = bfad_iocmd_adapter_cfg_mode(bfad, iocmd);
2913*4882a593Smuzhiyun break;
2914*4882a593Smuzhiyun case IOCMD_PORT_CFG_MODE:
2915*4882a593Smuzhiyun rc = bfad_iocmd_port_cfg_mode(bfad, iocmd);
2916*4882a593Smuzhiyun break;
2917*4882a593Smuzhiyun case IOCMD_FLASH_ENABLE_OPTROM:
2918*4882a593Smuzhiyun case IOCMD_FLASH_DISABLE_OPTROM:
2919*4882a593Smuzhiyun rc = bfad_iocmd_ablk_optrom(bfad, cmd, iocmd);
2920*4882a593Smuzhiyun break;
2921*4882a593Smuzhiyun case IOCMD_FAA_QUERY:
2922*4882a593Smuzhiyun rc = bfad_iocmd_faa_query(bfad, iocmd);
2923*4882a593Smuzhiyun break;
2924*4882a593Smuzhiyun case IOCMD_CEE_GET_ATTR:
2925*4882a593Smuzhiyun rc = bfad_iocmd_cee_attr(bfad, iocmd, payload_len);
2926*4882a593Smuzhiyun break;
2927*4882a593Smuzhiyun case IOCMD_CEE_GET_STATS:
2928*4882a593Smuzhiyun rc = bfad_iocmd_cee_get_stats(bfad, iocmd, payload_len);
2929*4882a593Smuzhiyun break;
2930*4882a593Smuzhiyun case IOCMD_CEE_RESET_STATS:
2931*4882a593Smuzhiyun rc = bfad_iocmd_cee_reset_stats(bfad, iocmd);
2932*4882a593Smuzhiyun break;
2933*4882a593Smuzhiyun case IOCMD_SFP_MEDIA:
2934*4882a593Smuzhiyun rc = bfad_iocmd_sfp_media(bfad, iocmd);
2935*4882a593Smuzhiyun break;
2936*4882a593Smuzhiyun case IOCMD_SFP_SPEED:
2937*4882a593Smuzhiyun rc = bfad_iocmd_sfp_speed(bfad, iocmd);
2938*4882a593Smuzhiyun break;
2939*4882a593Smuzhiyun case IOCMD_FLASH_GET_ATTR:
2940*4882a593Smuzhiyun rc = bfad_iocmd_flash_get_attr(bfad, iocmd);
2941*4882a593Smuzhiyun break;
2942*4882a593Smuzhiyun case IOCMD_FLASH_ERASE_PART:
2943*4882a593Smuzhiyun rc = bfad_iocmd_flash_erase_part(bfad, iocmd);
2944*4882a593Smuzhiyun break;
2945*4882a593Smuzhiyun case IOCMD_FLASH_UPDATE_PART:
2946*4882a593Smuzhiyun rc = bfad_iocmd_flash_update_part(bfad, iocmd, payload_len);
2947*4882a593Smuzhiyun break;
2948*4882a593Smuzhiyun case IOCMD_FLASH_READ_PART:
2949*4882a593Smuzhiyun rc = bfad_iocmd_flash_read_part(bfad, iocmd, payload_len);
2950*4882a593Smuzhiyun break;
2951*4882a593Smuzhiyun case IOCMD_DIAG_TEMP:
2952*4882a593Smuzhiyun rc = bfad_iocmd_diag_temp(bfad, iocmd);
2953*4882a593Smuzhiyun break;
2954*4882a593Smuzhiyun case IOCMD_DIAG_MEMTEST:
2955*4882a593Smuzhiyun rc = bfad_iocmd_diag_memtest(bfad, iocmd);
2956*4882a593Smuzhiyun break;
2957*4882a593Smuzhiyun case IOCMD_DIAG_LOOPBACK:
2958*4882a593Smuzhiyun rc = bfad_iocmd_diag_loopback(bfad, iocmd);
2959*4882a593Smuzhiyun break;
2960*4882a593Smuzhiyun case IOCMD_DIAG_FWPING:
2961*4882a593Smuzhiyun rc = bfad_iocmd_diag_fwping(bfad, iocmd);
2962*4882a593Smuzhiyun break;
2963*4882a593Smuzhiyun case IOCMD_DIAG_QUEUETEST:
2964*4882a593Smuzhiyun rc = bfad_iocmd_diag_queuetest(bfad, iocmd);
2965*4882a593Smuzhiyun break;
2966*4882a593Smuzhiyun case IOCMD_DIAG_SFP:
2967*4882a593Smuzhiyun rc = bfad_iocmd_diag_sfp(bfad, iocmd);
2968*4882a593Smuzhiyun break;
2969*4882a593Smuzhiyun case IOCMD_DIAG_LED:
2970*4882a593Smuzhiyun rc = bfad_iocmd_diag_led(bfad, iocmd);
2971*4882a593Smuzhiyun break;
2972*4882a593Smuzhiyun case IOCMD_DIAG_BEACON_LPORT:
2973*4882a593Smuzhiyun rc = bfad_iocmd_diag_beacon_lport(bfad, iocmd);
2974*4882a593Smuzhiyun break;
2975*4882a593Smuzhiyun case IOCMD_DIAG_LB_STAT:
2976*4882a593Smuzhiyun rc = bfad_iocmd_diag_lb_stat(bfad, iocmd);
2977*4882a593Smuzhiyun break;
2978*4882a593Smuzhiyun case IOCMD_DIAG_DPORT_ENABLE:
2979*4882a593Smuzhiyun rc = bfad_iocmd_diag_dport_enable(bfad, iocmd);
2980*4882a593Smuzhiyun break;
2981*4882a593Smuzhiyun case IOCMD_DIAG_DPORT_DISABLE:
2982*4882a593Smuzhiyun rc = bfad_iocmd_diag_dport_disable(bfad, iocmd);
2983*4882a593Smuzhiyun break;
2984*4882a593Smuzhiyun case IOCMD_DIAG_DPORT_SHOW:
2985*4882a593Smuzhiyun rc = bfad_iocmd_diag_dport_show(bfad, iocmd);
2986*4882a593Smuzhiyun break;
2987*4882a593Smuzhiyun case IOCMD_DIAG_DPORT_START:
2988*4882a593Smuzhiyun rc = bfad_iocmd_diag_dport_start(bfad, iocmd);
2989*4882a593Smuzhiyun break;
2990*4882a593Smuzhiyun case IOCMD_PHY_GET_ATTR:
2991*4882a593Smuzhiyun rc = bfad_iocmd_phy_get_attr(bfad, iocmd);
2992*4882a593Smuzhiyun break;
2993*4882a593Smuzhiyun case IOCMD_PHY_GET_STATS:
2994*4882a593Smuzhiyun rc = bfad_iocmd_phy_get_stats(bfad, iocmd);
2995*4882a593Smuzhiyun break;
2996*4882a593Smuzhiyun case IOCMD_PHY_UPDATE_FW:
2997*4882a593Smuzhiyun rc = bfad_iocmd_phy_update(bfad, iocmd, payload_len);
2998*4882a593Smuzhiyun break;
2999*4882a593Smuzhiyun case IOCMD_PHY_READ_FW:
3000*4882a593Smuzhiyun rc = bfad_iocmd_phy_read(bfad, iocmd, payload_len);
3001*4882a593Smuzhiyun break;
3002*4882a593Smuzhiyun case IOCMD_VHBA_QUERY:
3003*4882a593Smuzhiyun rc = bfad_iocmd_vhba_query(bfad, iocmd);
3004*4882a593Smuzhiyun break;
3005*4882a593Smuzhiyun case IOCMD_DEBUG_PORTLOG:
3006*4882a593Smuzhiyun rc = bfad_iocmd_porglog_get(bfad, iocmd);
3007*4882a593Smuzhiyun break;
3008*4882a593Smuzhiyun case IOCMD_DEBUG_FW_CORE:
3009*4882a593Smuzhiyun rc = bfad_iocmd_debug_fw_core(bfad, iocmd, payload_len);
3010*4882a593Smuzhiyun break;
3011*4882a593Smuzhiyun case IOCMD_DEBUG_FW_STATE_CLR:
3012*4882a593Smuzhiyun case IOCMD_DEBUG_PORTLOG_CLR:
3013*4882a593Smuzhiyun case IOCMD_DEBUG_START_DTRC:
3014*4882a593Smuzhiyun case IOCMD_DEBUG_STOP_DTRC:
3015*4882a593Smuzhiyun rc = bfad_iocmd_debug_ctl(bfad, iocmd, cmd);
3016*4882a593Smuzhiyun break;
3017*4882a593Smuzhiyun case IOCMD_DEBUG_PORTLOG_CTL:
3018*4882a593Smuzhiyun rc = bfad_iocmd_porglog_ctl(bfad, iocmd);
3019*4882a593Smuzhiyun break;
3020*4882a593Smuzhiyun case IOCMD_FCPIM_PROFILE_ON:
3021*4882a593Smuzhiyun case IOCMD_FCPIM_PROFILE_OFF:
3022*4882a593Smuzhiyun rc = bfad_iocmd_fcpim_cfg_profile(bfad, iocmd, cmd);
3023*4882a593Smuzhiyun break;
3024*4882a593Smuzhiyun case IOCMD_ITNIM_GET_IOPROFILE:
3025*4882a593Smuzhiyun rc = bfad_iocmd_itnim_get_ioprofile(bfad, iocmd);
3026*4882a593Smuzhiyun break;
3027*4882a593Smuzhiyun case IOCMD_FCPORT_GET_STATS:
3028*4882a593Smuzhiyun rc = bfad_iocmd_fcport_get_stats(bfad, iocmd);
3029*4882a593Smuzhiyun break;
3030*4882a593Smuzhiyun case IOCMD_FCPORT_RESET_STATS:
3031*4882a593Smuzhiyun rc = bfad_iocmd_fcport_reset_stats(bfad, iocmd);
3032*4882a593Smuzhiyun break;
3033*4882a593Smuzhiyun case IOCMD_BOOT_CFG:
3034*4882a593Smuzhiyun rc = bfad_iocmd_boot_cfg(bfad, iocmd);
3035*4882a593Smuzhiyun break;
3036*4882a593Smuzhiyun case IOCMD_BOOT_QUERY:
3037*4882a593Smuzhiyun rc = bfad_iocmd_boot_query(bfad, iocmd);
3038*4882a593Smuzhiyun break;
3039*4882a593Smuzhiyun case IOCMD_PREBOOT_QUERY:
3040*4882a593Smuzhiyun rc = bfad_iocmd_preboot_query(bfad, iocmd);
3041*4882a593Smuzhiyun break;
3042*4882a593Smuzhiyun case IOCMD_ETHBOOT_CFG:
3043*4882a593Smuzhiyun rc = bfad_iocmd_ethboot_cfg(bfad, iocmd);
3044*4882a593Smuzhiyun break;
3045*4882a593Smuzhiyun case IOCMD_ETHBOOT_QUERY:
3046*4882a593Smuzhiyun rc = bfad_iocmd_ethboot_query(bfad, iocmd);
3047*4882a593Smuzhiyun break;
3048*4882a593Smuzhiyun case IOCMD_TRUNK_ENABLE:
3049*4882a593Smuzhiyun case IOCMD_TRUNK_DISABLE:
3050*4882a593Smuzhiyun rc = bfad_iocmd_cfg_trunk(bfad, iocmd, cmd);
3051*4882a593Smuzhiyun break;
3052*4882a593Smuzhiyun case IOCMD_TRUNK_GET_ATTR:
3053*4882a593Smuzhiyun rc = bfad_iocmd_trunk_get_attr(bfad, iocmd);
3054*4882a593Smuzhiyun break;
3055*4882a593Smuzhiyun case IOCMD_QOS_ENABLE:
3056*4882a593Smuzhiyun case IOCMD_QOS_DISABLE:
3057*4882a593Smuzhiyun rc = bfad_iocmd_qos(bfad, iocmd, cmd);
3058*4882a593Smuzhiyun break;
3059*4882a593Smuzhiyun case IOCMD_QOS_GET_ATTR:
3060*4882a593Smuzhiyun rc = bfad_iocmd_qos_get_attr(bfad, iocmd);
3061*4882a593Smuzhiyun break;
3062*4882a593Smuzhiyun case IOCMD_QOS_GET_VC_ATTR:
3063*4882a593Smuzhiyun rc = bfad_iocmd_qos_get_vc_attr(bfad, iocmd);
3064*4882a593Smuzhiyun break;
3065*4882a593Smuzhiyun case IOCMD_QOS_GET_STATS:
3066*4882a593Smuzhiyun rc = bfad_iocmd_qos_get_stats(bfad, iocmd);
3067*4882a593Smuzhiyun break;
3068*4882a593Smuzhiyun case IOCMD_QOS_RESET_STATS:
3069*4882a593Smuzhiyun rc = bfad_iocmd_qos_reset_stats(bfad, iocmd);
3070*4882a593Smuzhiyun break;
3071*4882a593Smuzhiyun case IOCMD_QOS_SET_BW:
3072*4882a593Smuzhiyun rc = bfad_iocmd_qos_set_bw(bfad, iocmd);
3073*4882a593Smuzhiyun break;
3074*4882a593Smuzhiyun case IOCMD_VF_GET_STATS:
3075*4882a593Smuzhiyun rc = bfad_iocmd_vf_get_stats(bfad, iocmd);
3076*4882a593Smuzhiyun break;
3077*4882a593Smuzhiyun case IOCMD_VF_RESET_STATS:
3078*4882a593Smuzhiyun rc = bfad_iocmd_vf_clr_stats(bfad, iocmd);
3079*4882a593Smuzhiyun break;
3080*4882a593Smuzhiyun case IOCMD_FCPIM_LUNMASK_ENABLE:
3081*4882a593Smuzhiyun case IOCMD_FCPIM_LUNMASK_DISABLE:
3082*4882a593Smuzhiyun case IOCMD_FCPIM_LUNMASK_CLEAR:
3083*4882a593Smuzhiyun rc = bfad_iocmd_lunmask(bfad, iocmd, cmd);
3084*4882a593Smuzhiyun break;
3085*4882a593Smuzhiyun case IOCMD_FCPIM_LUNMASK_QUERY:
3086*4882a593Smuzhiyun rc = bfad_iocmd_fcpim_lunmask_query(bfad, iocmd);
3087*4882a593Smuzhiyun break;
3088*4882a593Smuzhiyun case IOCMD_FCPIM_LUNMASK_ADD:
3089*4882a593Smuzhiyun case IOCMD_FCPIM_LUNMASK_DELETE:
3090*4882a593Smuzhiyun rc = bfad_iocmd_fcpim_cfg_lunmask(bfad, iocmd, cmd);
3091*4882a593Smuzhiyun break;
3092*4882a593Smuzhiyun case IOCMD_FCPIM_THROTTLE_QUERY:
3093*4882a593Smuzhiyun rc = bfad_iocmd_fcpim_throttle_query(bfad, iocmd);
3094*4882a593Smuzhiyun break;
3095*4882a593Smuzhiyun case IOCMD_FCPIM_THROTTLE_SET:
3096*4882a593Smuzhiyun rc = bfad_iocmd_fcpim_throttle_set(bfad, iocmd);
3097*4882a593Smuzhiyun break;
3098*4882a593Smuzhiyun /* TFRU */
3099*4882a593Smuzhiyun case IOCMD_TFRU_READ:
3100*4882a593Smuzhiyun rc = bfad_iocmd_tfru_read(bfad, iocmd);
3101*4882a593Smuzhiyun break;
3102*4882a593Smuzhiyun case IOCMD_TFRU_WRITE:
3103*4882a593Smuzhiyun rc = bfad_iocmd_tfru_write(bfad, iocmd);
3104*4882a593Smuzhiyun break;
3105*4882a593Smuzhiyun /* FRU */
3106*4882a593Smuzhiyun case IOCMD_FRUVPD_READ:
3107*4882a593Smuzhiyun rc = bfad_iocmd_fruvpd_read(bfad, iocmd);
3108*4882a593Smuzhiyun break;
3109*4882a593Smuzhiyun case IOCMD_FRUVPD_UPDATE:
3110*4882a593Smuzhiyun rc = bfad_iocmd_fruvpd_update(bfad, iocmd);
3111*4882a593Smuzhiyun break;
3112*4882a593Smuzhiyun case IOCMD_FRUVPD_GET_MAX_SIZE:
3113*4882a593Smuzhiyun rc = bfad_iocmd_fruvpd_get_max_size(bfad, iocmd);
3114*4882a593Smuzhiyun break;
3115*4882a593Smuzhiyun default:
3116*4882a593Smuzhiyun rc = -EINVAL;
3117*4882a593Smuzhiyun break;
3118*4882a593Smuzhiyun }
3119*4882a593Smuzhiyun return rc;
3120*4882a593Smuzhiyun }
3121*4882a593Smuzhiyun
3122*4882a593Smuzhiyun static int
bfad_im_bsg_vendor_request(struct bsg_job * job)3123*4882a593Smuzhiyun bfad_im_bsg_vendor_request(struct bsg_job *job)
3124*4882a593Smuzhiyun {
3125*4882a593Smuzhiyun struct fc_bsg_request *bsg_request = job->request;
3126*4882a593Smuzhiyun struct fc_bsg_reply *bsg_reply = job->reply;
3127*4882a593Smuzhiyun uint32_t vendor_cmd = bsg_request->rqst_data.h_vendor.vendor_cmd[0];
3128*4882a593Smuzhiyun struct Scsi_Host *shost = fc_bsg_to_shost(job);
3129*4882a593Smuzhiyun struct bfad_im_port_s *im_port = bfad_get_im_port(shost);
3130*4882a593Smuzhiyun struct bfad_s *bfad = im_port->bfad;
3131*4882a593Smuzhiyun void *payload_kbuf;
3132*4882a593Smuzhiyun int rc = -EINVAL;
3133*4882a593Smuzhiyun
3134*4882a593Smuzhiyun /* Allocate a temp buffer to hold the passed in user space command */
3135*4882a593Smuzhiyun payload_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL);
3136*4882a593Smuzhiyun if (!payload_kbuf) {
3137*4882a593Smuzhiyun rc = -ENOMEM;
3138*4882a593Smuzhiyun goto out;
3139*4882a593Smuzhiyun }
3140*4882a593Smuzhiyun
3141*4882a593Smuzhiyun /* Copy the sg_list passed in to a linear buffer: holds the cmnd data */
3142*4882a593Smuzhiyun sg_copy_to_buffer(job->request_payload.sg_list,
3143*4882a593Smuzhiyun job->request_payload.sg_cnt, payload_kbuf,
3144*4882a593Smuzhiyun job->request_payload.payload_len);
3145*4882a593Smuzhiyun
3146*4882a593Smuzhiyun /* Invoke IOCMD handler - to handle all the vendor command requests */
3147*4882a593Smuzhiyun rc = bfad_iocmd_handler(bfad, vendor_cmd, payload_kbuf,
3148*4882a593Smuzhiyun job->request_payload.payload_len);
3149*4882a593Smuzhiyun if (rc != BFA_STATUS_OK)
3150*4882a593Smuzhiyun goto error;
3151*4882a593Smuzhiyun
3152*4882a593Smuzhiyun /* Copy the response data to the job->reply_payload sg_list */
3153*4882a593Smuzhiyun sg_copy_from_buffer(job->reply_payload.sg_list,
3154*4882a593Smuzhiyun job->reply_payload.sg_cnt,
3155*4882a593Smuzhiyun payload_kbuf,
3156*4882a593Smuzhiyun job->reply_payload.payload_len);
3157*4882a593Smuzhiyun
3158*4882a593Smuzhiyun /* free the command buffer */
3159*4882a593Smuzhiyun kfree(payload_kbuf);
3160*4882a593Smuzhiyun
3161*4882a593Smuzhiyun /* Fill the BSG job reply data */
3162*4882a593Smuzhiyun job->reply_len = job->reply_payload.payload_len;
3163*4882a593Smuzhiyun bsg_reply->reply_payload_rcv_len = job->reply_payload.payload_len;
3164*4882a593Smuzhiyun bsg_reply->result = rc;
3165*4882a593Smuzhiyun
3166*4882a593Smuzhiyun bsg_job_done(job, bsg_reply->result,
3167*4882a593Smuzhiyun bsg_reply->reply_payload_rcv_len);
3168*4882a593Smuzhiyun return rc;
3169*4882a593Smuzhiyun error:
3170*4882a593Smuzhiyun /* free the command buffer */
3171*4882a593Smuzhiyun kfree(payload_kbuf);
3172*4882a593Smuzhiyun out:
3173*4882a593Smuzhiyun bsg_reply->result = rc;
3174*4882a593Smuzhiyun job->reply_len = sizeof(uint32_t);
3175*4882a593Smuzhiyun bsg_reply->reply_payload_rcv_len = 0;
3176*4882a593Smuzhiyun return rc;
3177*4882a593Smuzhiyun }
3178*4882a593Smuzhiyun
3179*4882a593Smuzhiyun /* FC passthru call backs */
3180*4882a593Smuzhiyun static u64
bfad_fcxp_get_req_sgaddr_cb(void * bfad_fcxp,int sgeid)3181*4882a593Smuzhiyun bfad_fcxp_get_req_sgaddr_cb(void *bfad_fcxp, int sgeid)
3182*4882a593Smuzhiyun {
3183*4882a593Smuzhiyun struct bfad_fcxp *drv_fcxp = bfad_fcxp;
3184*4882a593Smuzhiyun struct bfa_sge_s *sge;
3185*4882a593Smuzhiyun u64 addr;
3186*4882a593Smuzhiyun
3187*4882a593Smuzhiyun sge = drv_fcxp->req_sge + sgeid;
3188*4882a593Smuzhiyun addr = (u64)(size_t) sge->sg_addr;
3189*4882a593Smuzhiyun return addr;
3190*4882a593Smuzhiyun }
3191*4882a593Smuzhiyun
3192*4882a593Smuzhiyun static u32
bfad_fcxp_get_req_sglen_cb(void * bfad_fcxp,int sgeid)3193*4882a593Smuzhiyun bfad_fcxp_get_req_sglen_cb(void *bfad_fcxp, int sgeid)
3194*4882a593Smuzhiyun {
3195*4882a593Smuzhiyun struct bfad_fcxp *drv_fcxp = bfad_fcxp;
3196*4882a593Smuzhiyun struct bfa_sge_s *sge;
3197*4882a593Smuzhiyun
3198*4882a593Smuzhiyun sge = drv_fcxp->req_sge + sgeid;
3199*4882a593Smuzhiyun return sge->sg_len;
3200*4882a593Smuzhiyun }
3201*4882a593Smuzhiyun
3202*4882a593Smuzhiyun static u64
bfad_fcxp_get_rsp_sgaddr_cb(void * bfad_fcxp,int sgeid)3203*4882a593Smuzhiyun bfad_fcxp_get_rsp_sgaddr_cb(void *bfad_fcxp, int sgeid)
3204*4882a593Smuzhiyun {
3205*4882a593Smuzhiyun struct bfad_fcxp *drv_fcxp = bfad_fcxp;
3206*4882a593Smuzhiyun struct bfa_sge_s *sge;
3207*4882a593Smuzhiyun u64 addr;
3208*4882a593Smuzhiyun
3209*4882a593Smuzhiyun sge = drv_fcxp->rsp_sge + sgeid;
3210*4882a593Smuzhiyun addr = (u64)(size_t) sge->sg_addr;
3211*4882a593Smuzhiyun return addr;
3212*4882a593Smuzhiyun }
3213*4882a593Smuzhiyun
3214*4882a593Smuzhiyun static u32
bfad_fcxp_get_rsp_sglen_cb(void * bfad_fcxp,int sgeid)3215*4882a593Smuzhiyun bfad_fcxp_get_rsp_sglen_cb(void *bfad_fcxp, int sgeid)
3216*4882a593Smuzhiyun {
3217*4882a593Smuzhiyun struct bfad_fcxp *drv_fcxp = bfad_fcxp;
3218*4882a593Smuzhiyun struct bfa_sge_s *sge;
3219*4882a593Smuzhiyun
3220*4882a593Smuzhiyun sge = drv_fcxp->rsp_sge + sgeid;
3221*4882a593Smuzhiyun return sge->sg_len;
3222*4882a593Smuzhiyun }
3223*4882a593Smuzhiyun
3224*4882a593Smuzhiyun static void
bfad_send_fcpt_cb(void * bfad_fcxp,struct bfa_fcxp_s * fcxp,void * cbarg,bfa_status_t req_status,u32 rsp_len,u32 resid_len,struct fchs_s * rsp_fchs)3225*4882a593Smuzhiyun bfad_send_fcpt_cb(void *bfad_fcxp, struct bfa_fcxp_s *fcxp, void *cbarg,
3226*4882a593Smuzhiyun bfa_status_t req_status, u32 rsp_len, u32 resid_len,
3227*4882a593Smuzhiyun struct fchs_s *rsp_fchs)
3228*4882a593Smuzhiyun {
3229*4882a593Smuzhiyun struct bfad_fcxp *drv_fcxp = bfad_fcxp;
3230*4882a593Smuzhiyun
3231*4882a593Smuzhiyun drv_fcxp->req_status = req_status;
3232*4882a593Smuzhiyun drv_fcxp->rsp_len = rsp_len;
3233*4882a593Smuzhiyun
3234*4882a593Smuzhiyun /* bfa_fcxp will be automatically freed by BFA */
3235*4882a593Smuzhiyun drv_fcxp->bfa_fcxp = NULL;
3236*4882a593Smuzhiyun complete(&drv_fcxp->comp);
3237*4882a593Smuzhiyun }
3238*4882a593Smuzhiyun
3239*4882a593Smuzhiyun static struct bfad_buf_info *
bfad_fcxp_map_sg(struct bfad_s * bfad,void * payload_kbuf,uint32_t payload_len,uint32_t * num_sgles)3240*4882a593Smuzhiyun bfad_fcxp_map_sg(struct bfad_s *bfad, void *payload_kbuf,
3241*4882a593Smuzhiyun uint32_t payload_len, uint32_t *num_sgles)
3242*4882a593Smuzhiyun {
3243*4882a593Smuzhiyun struct bfad_buf_info *buf_base, *buf_info;
3244*4882a593Smuzhiyun struct bfa_sge_s *sg_table;
3245*4882a593Smuzhiyun int sge_num = 1;
3246*4882a593Smuzhiyun
3247*4882a593Smuzhiyun buf_base = kcalloc(sizeof(struct bfad_buf_info) +
3248*4882a593Smuzhiyun sizeof(struct bfa_sge_s),
3249*4882a593Smuzhiyun sge_num, GFP_KERNEL);
3250*4882a593Smuzhiyun if (!buf_base)
3251*4882a593Smuzhiyun return NULL;
3252*4882a593Smuzhiyun
3253*4882a593Smuzhiyun sg_table = (struct bfa_sge_s *) (((uint8_t *)buf_base) +
3254*4882a593Smuzhiyun (sizeof(struct bfad_buf_info) * sge_num));
3255*4882a593Smuzhiyun
3256*4882a593Smuzhiyun /* Allocate dma coherent memory */
3257*4882a593Smuzhiyun buf_info = buf_base;
3258*4882a593Smuzhiyun buf_info->size = payload_len;
3259*4882a593Smuzhiyun buf_info->virt = dma_alloc_coherent(&bfad->pcidev->dev,
3260*4882a593Smuzhiyun buf_info->size, &buf_info->phys,
3261*4882a593Smuzhiyun GFP_KERNEL);
3262*4882a593Smuzhiyun if (!buf_info->virt)
3263*4882a593Smuzhiyun goto out_free_mem;
3264*4882a593Smuzhiyun
3265*4882a593Smuzhiyun /* copy the linear bsg buffer to buf_info */
3266*4882a593Smuzhiyun memcpy(buf_info->virt, payload_kbuf, buf_info->size);
3267*4882a593Smuzhiyun
3268*4882a593Smuzhiyun /*
3269*4882a593Smuzhiyun * Setup SG table
3270*4882a593Smuzhiyun */
3271*4882a593Smuzhiyun sg_table->sg_len = buf_info->size;
3272*4882a593Smuzhiyun sg_table->sg_addr = (void *)(size_t) buf_info->phys;
3273*4882a593Smuzhiyun
3274*4882a593Smuzhiyun *num_sgles = sge_num;
3275*4882a593Smuzhiyun
3276*4882a593Smuzhiyun return buf_base;
3277*4882a593Smuzhiyun
3278*4882a593Smuzhiyun out_free_mem:
3279*4882a593Smuzhiyun kfree(buf_base);
3280*4882a593Smuzhiyun return NULL;
3281*4882a593Smuzhiyun }
3282*4882a593Smuzhiyun
3283*4882a593Smuzhiyun static void
bfad_fcxp_free_mem(struct bfad_s * bfad,struct bfad_buf_info * buf_base,uint32_t num_sgles)3284*4882a593Smuzhiyun bfad_fcxp_free_mem(struct bfad_s *bfad, struct bfad_buf_info *buf_base,
3285*4882a593Smuzhiyun uint32_t num_sgles)
3286*4882a593Smuzhiyun {
3287*4882a593Smuzhiyun int i;
3288*4882a593Smuzhiyun struct bfad_buf_info *buf_info = buf_base;
3289*4882a593Smuzhiyun
3290*4882a593Smuzhiyun if (buf_base) {
3291*4882a593Smuzhiyun for (i = 0; i < num_sgles; buf_info++, i++) {
3292*4882a593Smuzhiyun if (buf_info->virt != NULL)
3293*4882a593Smuzhiyun dma_free_coherent(&bfad->pcidev->dev,
3294*4882a593Smuzhiyun buf_info->size, buf_info->virt,
3295*4882a593Smuzhiyun buf_info->phys);
3296*4882a593Smuzhiyun }
3297*4882a593Smuzhiyun kfree(buf_base);
3298*4882a593Smuzhiyun }
3299*4882a593Smuzhiyun }
3300*4882a593Smuzhiyun
3301*4882a593Smuzhiyun static int
bfad_fcxp_bsg_send(struct bsg_job * job,struct bfad_fcxp * drv_fcxp,bfa_bsg_fcpt_t * bsg_fcpt)3302*4882a593Smuzhiyun bfad_fcxp_bsg_send(struct bsg_job *job, struct bfad_fcxp *drv_fcxp,
3303*4882a593Smuzhiyun bfa_bsg_fcpt_t *bsg_fcpt)
3304*4882a593Smuzhiyun {
3305*4882a593Smuzhiyun struct bfa_fcxp_s *hal_fcxp;
3306*4882a593Smuzhiyun struct bfad_s *bfad = drv_fcxp->port->bfad;
3307*4882a593Smuzhiyun unsigned long flags;
3308*4882a593Smuzhiyun uint8_t lp_tag;
3309*4882a593Smuzhiyun
3310*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
3311*4882a593Smuzhiyun
3312*4882a593Smuzhiyun /* Allocate bfa_fcxp structure */
3313*4882a593Smuzhiyun hal_fcxp = bfa_fcxp_req_rsp_alloc(drv_fcxp, &bfad->bfa,
3314*4882a593Smuzhiyun drv_fcxp->num_req_sgles,
3315*4882a593Smuzhiyun drv_fcxp->num_rsp_sgles,
3316*4882a593Smuzhiyun bfad_fcxp_get_req_sgaddr_cb,
3317*4882a593Smuzhiyun bfad_fcxp_get_req_sglen_cb,
3318*4882a593Smuzhiyun bfad_fcxp_get_rsp_sgaddr_cb,
3319*4882a593Smuzhiyun bfad_fcxp_get_rsp_sglen_cb, BFA_TRUE);
3320*4882a593Smuzhiyun if (!hal_fcxp) {
3321*4882a593Smuzhiyun bfa_trc(bfad, 0);
3322*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3323*4882a593Smuzhiyun return BFA_STATUS_ENOMEM;
3324*4882a593Smuzhiyun }
3325*4882a593Smuzhiyun
3326*4882a593Smuzhiyun drv_fcxp->bfa_fcxp = hal_fcxp;
3327*4882a593Smuzhiyun
3328*4882a593Smuzhiyun lp_tag = bfa_lps_get_tag_from_pid(&bfad->bfa, bsg_fcpt->fchs.s_id);
3329*4882a593Smuzhiyun
3330*4882a593Smuzhiyun bfa_fcxp_send(hal_fcxp, drv_fcxp->bfa_rport, bsg_fcpt->vf_id, lp_tag,
3331*4882a593Smuzhiyun bsg_fcpt->cts, bsg_fcpt->cos,
3332*4882a593Smuzhiyun job->request_payload.payload_len,
3333*4882a593Smuzhiyun &bsg_fcpt->fchs, bfad_send_fcpt_cb, bfad,
3334*4882a593Smuzhiyun job->reply_payload.payload_len, bsg_fcpt->tsecs);
3335*4882a593Smuzhiyun
3336*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3337*4882a593Smuzhiyun
3338*4882a593Smuzhiyun return BFA_STATUS_OK;
3339*4882a593Smuzhiyun }
3340*4882a593Smuzhiyun
3341*4882a593Smuzhiyun static int
bfad_im_bsg_els_ct_request(struct bsg_job * job)3342*4882a593Smuzhiyun bfad_im_bsg_els_ct_request(struct bsg_job *job)
3343*4882a593Smuzhiyun {
3344*4882a593Smuzhiyun struct bfa_bsg_data *bsg_data;
3345*4882a593Smuzhiyun struct Scsi_Host *shost = fc_bsg_to_shost(job);
3346*4882a593Smuzhiyun struct bfad_im_port_s *im_port = bfad_get_im_port(shost);
3347*4882a593Smuzhiyun struct bfad_s *bfad = im_port->bfad;
3348*4882a593Smuzhiyun bfa_bsg_fcpt_t *bsg_fcpt;
3349*4882a593Smuzhiyun struct bfad_fcxp *drv_fcxp;
3350*4882a593Smuzhiyun struct bfa_fcs_lport_s *fcs_port;
3351*4882a593Smuzhiyun struct bfa_fcs_rport_s *fcs_rport;
3352*4882a593Smuzhiyun struct fc_bsg_request *bsg_request = job->request;
3353*4882a593Smuzhiyun struct fc_bsg_reply *bsg_reply = job->reply;
3354*4882a593Smuzhiyun uint32_t command_type = bsg_request->msgcode;
3355*4882a593Smuzhiyun unsigned long flags;
3356*4882a593Smuzhiyun struct bfad_buf_info *rsp_buf_info;
3357*4882a593Smuzhiyun void *req_kbuf = NULL, *rsp_kbuf = NULL;
3358*4882a593Smuzhiyun int rc = -EINVAL;
3359*4882a593Smuzhiyun
3360*4882a593Smuzhiyun job->reply_len = sizeof(uint32_t); /* Atleast uint32_t reply_len */
3361*4882a593Smuzhiyun bsg_reply->reply_payload_rcv_len = 0;
3362*4882a593Smuzhiyun
3363*4882a593Smuzhiyun /* Get the payload passed in from userspace */
3364*4882a593Smuzhiyun bsg_data = (struct bfa_bsg_data *) (((char *)bsg_request) +
3365*4882a593Smuzhiyun sizeof(struct fc_bsg_request));
3366*4882a593Smuzhiyun if (bsg_data == NULL)
3367*4882a593Smuzhiyun goto out;
3368*4882a593Smuzhiyun
3369*4882a593Smuzhiyun /*
3370*4882a593Smuzhiyun * Allocate buffer for bsg_fcpt and do a copy_from_user op for payload
3371*4882a593Smuzhiyun * buffer of size bsg_data->payload_len
3372*4882a593Smuzhiyun */
3373*4882a593Smuzhiyun bsg_fcpt = kzalloc(bsg_data->payload_len, GFP_KERNEL);
3374*4882a593Smuzhiyun if (!bsg_fcpt) {
3375*4882a593Smuzhiyun rc = -ENOMEM;
3376*4882a593Smuzhiyun goto out;
3377*4882a593Smuzhiyun }
3378*4882a593Smuzhiyun
3379*4882a593Smuzhiyun if (copy_from_user((uint8_t *)bsg_fcpt,
3380*4882a593Smuzhiyun (void *)(unsigned long)bsg_data->payload,
3381*4882a593Smuzhiyun bsg_data->payload_len)) {
3382*4882a593Smuzhiyun kfree(bsg_fcpt);
3383*4882a593Smuzhiyun rc = -EIO;
3384*4882a593Smuzhiyun goto out;
3385*4882a593Smuzhiyun }
3386*4882a593Smuzhiyun
3387*4882a593Smuzhiyun drv_fcxp = kzalloc(sizeof(struct bfad_fcxp), GFP_KERNEL);
3388*4882a593Smuzhiyun if (drv_fcxp == NULL) {
3389*4882a593Smuzhiyun kfree(bsg_fcpt);
3390*4882a593Smuzhiyun rc = -ENOMEM;
3391*4882a593Smuzhiyun goto out;
3392*4882a593Smuzhiyun }
3393*4882a593Smuzhiyun
3394*4882a593Smuzhiyun spin_lock_irqsave(&bfad->bfad_lock, flags);
3395*4882a593Smuzhiyun fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs, bsg_fcpt->vf_id,
3396*4882a593Smuzhiyun bsg_fcpt->lpwwn);
3397*4882a593Smuzhiyun if (fcs_port == NULL) {
3398*4882a593Smuzhiyun bsg_fcpt->status = BFA_STATUS_UNKNOWN_LWWN;
3399*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3400*4882a593Smuzhiyun goto out_free_mem;
3401*4882a593Smuzhiyun }
3402*4882a593Smuzhiyun
3403*4882a593Smuzhiyun /* Check if the port is online before sending FC Passthru cmd */
3404*4882a593Smuzhiyun if (!bfa_fcs_lport_is_online(fcs_port)) {
3405*4882a593Smuzhiyun bsg_fcpt->status = BFA_STATUS_PORT_OFFLINE;
3406*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3407*4882a593Smuzhiyun goto out_free_mem;
3408*4882a593Smuzhiyun }
3409*4882a593Smuzhiyun
3410*4882a593Smuzhiyun drv_fcxp->port = fcs_port->bfad_port;
3411*4882a593Smuzhiyun
3412*4882a593Smuzhiyun if (drv_fcxp->port->bfad == 0)
3413*4882a593Smuzhiyun drv_fcxp->port->bfad = bfad;
3414*4882a593Smuzhiyun
3415*4882a593Smuzhiyun /* Fetch the bfa_rport - if nexus needed */
3416*4882a593Smuzhiyun if (command_type == FC_BSG_HST_ELS_NOLOGIN ||
3417*4882a593Smuzhiyun command_type == FC_BSG_HST_CT) {
3418*4882a593Smuzhiyun /* BSG HST commands: no nexus needed */
3419*4882a593Smuzhiyun drv_fcxp->bfa_rport = NULL;
3420*4882a593Smuzhiyun
3421*4882a593Smuzhiyun } else if (command_type == FC_BSG_RPT_ELS ||
3422*4882a593Smuzhiyun command_type == FC_BSG_RPT_CT) {
3423*4882a593Smuzhiyun /* BSG RPT commands: nexus needed */
3424*4882a593Smuzhiyun fcs_rport = bfa_fcs_lport_get_rport_by_pwwn(fcs_port,
3425*4882a593Smuzhiyun bsg_fcpt->dpwwn);
3426*4882a593Smuzhiyun if (fcs_rport == NULL) {
3427*4882a593Smuzhiyun bsg_fcpt->status = BFA_STATUS_UNKNOWN_RWWN;
3428*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3429*4882a593Smuzhiyun goto out_free_mem;
3430*4882a593Smuzhiyun }
3431*4882a593Smuzhiyun
3432*4882a593Smuzhiyun drv_fcxp->bfa_rport = fcs_rport->bfa_rport;
3433*4882a593Smuzhiyun
3434*4882a593Smuzhiyun } else { /* Unknown BSG msgcode; return -EINVAL */
3435*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3436*4882a593Smuzhiyun goto out_free_mem;
3437*4882a593Smuzhiyun }
3438*4882a593Smuzhiyun
3439*4882a593Smuzhiyun spin_unlock_irqrestore(&bfad->bfad_lock, flags);
3440*4882a593Smuzhiyun
3441*4882a593Smuzhiyun /* allocate memory for req / rsp buffers */
3442*4882a593Smuzhiyun req_kbuf = kzalloc(job->request_payload.payload_len, GFP_KERNEL);
3443*4882a593Smuzhiyun if (!req_kbuf) {
3444*4882a593Smuzhiyun printk(KERN_INFO "bfa %s: fcpt request buffer alloc failed\n",
3445*4882a593Smuzhiyun bfad->pci_name);
3446*4882a593Smuzhiyun rc = -ENOMEM;
3447*4882a593Smuzhiyun goto out_free_mem;
3448*4882a593Smuzhiyun }
3449*4882a593Smuzhiyun
3450*4882a593Smuzhiyun rsp_kbuf = kzalloc(job->reply_payload.payload_len, GFP_KERNEL);
3451*4882a593Smuzhiyun if (!rsp_kbuf) {
3452*4882a593Smuzhiyun printk(KERN_INFO "bfa %s: fcpt response buffer alloc failed\n",
3453*4882a593Smuzhiyun bfad->pci_name);
3454*4882a593Smuzhiyun rc = -ENOMEM;
3455*4882a593Smuzhiyun goto out_free_mem;
3456*4882a593Smuzhiyun }
3457*4882a593Smuzhiyun
3458*4882a593Smuzhiyun /* map req sg - copy the sg_list passed in to the linear buffer */
3459*4882a593Smuzhiyun sg_copy_to_buffer(job->request_payload.sg_list,
3460*4882a593Smuzhiyun job->request_payload.sg_cnt, req_kbuf,
3461*4882a593Smuzhiyun job->request_payload.payload_len);
3462*4882a593Smuzhiyun
3463*4882a593Smuzhiyun drv_fcxp->reqbuf_info = bfad_fcxp_map_sg(bfad, req_kbuf,
3464*4882a593Smuzhiyun job->request_payload.payload_len,
3465*4882a593Smuzhiyun &drv_fcxp->num_req_sgles);
3466*4882a593Smuzhiyun if (!drv_fcxp->reqbuf_info) {
3467*4882a593Smuzhiyun printk(KERN_INFO "bfa %s: fcpt request fcxp_map_sg failed\n",
3468*4882a593Smuzhiyun bfad->pci_name);
3469*4882a593Smuzhiyun rc = -ENOMEM;
3470*4882a593Smuzhiyun goto out_free_mem;
3471*4882a593Smuzhiyun }
3472*4882a593Smuzhiyun
3473*4882a593Smuzhiyun drv_fcxp->req_sge = (struct bfa_sge_s *)
3474*4882a593Smuzhiyun (((uint8_t *)drv_fcxp->reqbuf_info) +
3475*4882a593Smuzhiyun (sizeof(struct bfad_buf_info) *
3476*4882a593Smuzhiyun drv_fcxp->num_req_sgles));
3477*4882a593Smuzhiyun
3478*4882a593Smuzhiyun /* map rsp sg */
3479*4882a593Smuzhiyun drv_fcxp->rspbuf_info = bfad_fcxp_map_sg(bfad, rsp_kbuf,
3480*4882a593Smuzhiyun job->reply_payload.payload_len,
3481*4882a593Smuzhiyun &drv_fcxp->num_rsp_sgles);
3482*4882a593Smuzhiyun if (!drv_fcxp->rspbuf_info) {
3483*4882a593Smuzhiyun printk(KERN_INFO "bfa %s: fcpt response fcxp_map_sg failed\n",
3484*4882a593Smuzhiyun bfad->pci_name);
3485*4882a593Smuzhiyun rc = -ENOMEM;
3486*4882a593Smuzhiyun goto out_free_mem;
3487*4882a593Smuzhiyun }
3488*4882a593Smuzhiyun
3489*4882a593Smuzhiyun rsp_buf_info = (struct bfad_buf_info *)drv_fcxp->rspbuf_info;
3490*4882a593Smuzhiyun drv_fcxp->rsp_sge = (struct bfa_sge_s *)
3491*4882a593Smuzhiyun (((uint8_t *)drv_fcxp->rspbuf_info) +
3492*4882a593Smuzhiyun (sizeof(struct bfad_buf_info) *
3493*4882a593Smuzhiyun drv_fcxp->num_rsp_sgles));
3494*4882a593Smuzhiyun
3495*4882a593Smuzhiyun /* fcxp send */
3496*4882a593Smuzhiyun init_completion(&drv_fcxp->comp);
3497*4882a593Smuzhiyun rc = bfad_fcxp_bsg_send(job, drv_fcxp, bsg_fcpt);
3498*4882a593Smuzhiyun if (rc == BFA_STATUS_OK) {
3499*4882a593Smuzhiyun wait_for_completion(&drv_fcxp->comp);
3500*4882a593Smuzhiyun bsg_fcpt->status = drv_fcxp->req_status;
3501*4882a593Smuzhiyun } else {
3502*4882a593Smuzhiyun bsg_fcpt->status = rc;
3503*4882a593Smuzhiyun goto out_free_mem;
3504*4882a593Smuzhiyun }
3505*4882a593Smuzhiyun
3506*4882a593Smuzhiyun /* fill the job->reply data */
3507*4882a593Smuzhiyun if (drv_fcxp->req_status == BFA_STATUS_OK) {
3508*4882a593Smuzhiyun job->reply_len = drv_fcxp->rsp_len;
3509*4882a593Smuzhiyun bsg_reply->reply_payload_rcv_len = drv_fcxp->rsp_len;
3510*4882a593Smuzhiyun bsg_reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
3511*4882a593Smuzhiyun } else {
3512*4882a593Smuzhiyun bsg_reply->reply_payload_rcv_len =
3513*4882a593Smuzhiyun sizeof(struct fc_bsg_ctels_reply);
3514*4882a593Smuzhiyun job->reply_len = sizeof(uint32_t);
3515*4882a593Smuzhiyun bsg_reply->reply_data.ctels_reply.status =
3516*4882a593Smuzhiyun FC_CTELS_STATUS_REJECT;
3517*4882a593Smuzhiyun }
3518*4882a593Smuzhiyun
3519*4882a593Smuzhiyun /* Copy the response data to the reply_payload sg list */
3520*4882a593Smuzhiyun sg_copy_from_buffer(job->reply_payload.sg_list,
3521*4882a593Smuzhiyun job->reply_payload.sg_cnt,
3522*4882a593Smuzhiyun (uint8_t *)rsp_buf_info->virt,
3523*4882a593Smuzhiyun job->reply_payload.payload_len);
3524*4882a593Smuzhiyun
3525*4882a593Smuzhiyun out_free_mem:
3526*4882a593Smuzhiyun bfad_fcxp_free_mem(bfad, drv_fcxp->rspbuf_info,
3527*4882a593Smuzhiyun drv_fcxp->num_rsp_sgles);
3528*4882a593Smuzhiyun bfad_fcxp_free_mem(bfad, drv_fcxp->reqbuf_info,
3529*4882a593Smuzhiyun drv_fcxp->num_req_sgles);
3530*4882a593Smuzhiyun kfree(req_kbuf);
3531*4882a593Smuzhiyun kfree(rsp_kbuf);
3532*4882a593Smuzhiyun
3533*4882a593Smuzhiyun /* Need a copy to user op */
3534*4882a593Smuzhiyun if (copy_to_user((void *)(unsigned long)bsg_data->payload,
3535*4882a593Smuzhiyun (void *)bsg_fcpt, bsg_data->payload_len))
3536*4882a593Smuzhiyun rc = -EIO;
3537*4882a593Smuzhiyun
3538*4882a593Smuzhiyun kfree(bsg_fcpt);
3539*4882a593Smuzhiyun kfree(drv_fcxp);
3540*4882a593Smuzhiyun out:
3541*4882a593Smuzhiyun bsg_reply->result = rc;
3542*4882a593Smuzhiyun
3543*4882a593Smuzhiyun if (rc == BFA_STATUS_OK)
3544*4882a593Smuzhiyun bsg_job_done(job, bsg_reply->result,
3545*4882a593Smuzhiyun bsg_reply->reply_payload_rcv_len);
3546*4882a593Smuzhiyun
3547*4882a593Smuzhiyun return rc;
3548*4882a593Smuzhiyun }
3549*4882a593Smuzhiyun
3550*4882a593Smuzhiyun int
bfad_im_bsg_request(struct bsg_job * job)3551*4882a593Smuzhiyun bfad_im_bsg_request(struct bsg_job *job)
3552*4882a593Smuzhiyun {
3553*4882a593Smuzhiyun struct fc_bsg_request *bsg_request = job->request;
3554*4882a593Smuzhiyun struct fc_bsg_reply *bsg_reply = job->reply;
3555*4882a593Smuzhiyun uint32_t rc = BFA_STATUS_OK;
3556*4882a593Smuzhiyun
3557*4882a593Smuzhiyun switch (bsg_request->msgcode) {
3558*4882a593Smuzhiyun case FC_BSG_HST_VENDOR:
3559*4882a593Smuzhiyun /* Process BSG HST Vendor requests */
3560*4882a593Smuzhiyun rc = bfad_im_bsg_vendor_request(job);
3561*4882a593Smuzhiyun break;
3562*4882a593Smuzhiyun case FC_BSG_HST_ELS_NOLOGIN:
3563*4882a593Smuzhiyun case FC_BSG_RPT_ELS:
3564*4882a593Smuzhiyun case FC_BSG_HST_CT:
3565*4882a593Smuzhiyun case FC_BSG_RPT_CT:
3566*4882a593Smuzhiyun /* Process BSG ELS/CT commands */
3567*4882a593Smuzhiyun rc = bfad_im_bsg_els_ct_request(job);
3568*4882a593Smuzhiyun break;
3569*4882a593Smuzhiyun default:
3570*4882a593Smuzhiyun bsg_reply->result = rc = -EINVAL;
3571*4882a593Smuzhiyun bsg_reply->reply_payload_rcv_len = 0;
3572*4882a593Smuzhiyun break;
3573*4882a593Smuzhiyun }
3574*4882a593Smuzhiyun
3575*4882a593Smuzhiyun return rc;
3576*4882a593Smuzhiyun }
3577*4882a593Smuzhiyun
3578*4882a593Smuzhiyun int
bfad_im_bsg_timeout(struct bsg_job * job)3579*4882a593Smuzhiyun bfad_im_bsg_timeout(struct bsg_job *job)
3580*4882a593Smuzhiyun {
3581*4882a593Smuzhiyun /* Don't complete the BSG job request - return -EAGAIN
3582*4882a593Smuzhiyun * to reset bsg job timeout : for ELS/CT pass thru we
3583*4882a593Smuzhiyun * already have timer to track the request.
3584*4882a593Smuzhiyun */
3585*4882a593Smuzhiyun return -EAGAIN;
3586*4882a593Smuzhiyun }
3587