xref: /kernel/linux/linux-5.10/drivers/scsi/bfa/bfad.c (revision 8c2ecf20)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
4 * Copyright (c) 2014- QLogic Corporation.
5 * All rights reserved
6 * www.qlogic.com
7 *
8 * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
9 */
10
11/*
12 *  bfad.c Linux driver PCI interface module.
13 */
14#include <linux/module.h>
15#include <linux/kthread.h>
16#include <linux/errno.h>
17#include <linux/sched.h>
18#include <linux/init.h>
19#include <linux/fs.h>
20#include <linux/pci.h>
21#include <linux/firmware.h>
22#include <linux/uaccess.h>
23#include <asm/fcntl.h>
24
25#include "bfad_drv.h"
26#include "bfad_im.h"
27#include "bfa_fcs.h"
28#include "bfa_defs.h"
29#include "bfa.h"
30
31BFA_TRC_FILE(LDRV, BFAD);
32DEFINE_MUTEX(bfad_mutex);
33LIST_HEAD(bfad_list);
34
35static int	bfad_inst;
36static int      num_sgpgs_parm;
37int		supported_fc4s;
38char		*host_name, *os_name, *os_patch;
39int		num_rports, num_ios, num_tms;
40int		num_fcxps, num_ufbufs;
41int		reqq_size, rspq_size, num_sgpgs;
42int		rport_del_timeout = BFA_FCS_RPORT_DEF_DEL_TIMEOUT;
43int		bfa_lun_queue_depth = BFAD_LUN_QUEUE_DEPTH;
44int		bfa_io_max_sge = BFAD_IO_MAX_SGE;
45int		bfa_log_level = 3; /* WARNING log level */
46int		ioc_auto_recover = BFA_TRUE;
47int		bfa_linkup_delay = -1;
48int		fdmi_enable = BFA_TRUE;
49int		pcie_max_read_reqsz;
50int		bfa_debugfs_enable = 1;
51int		msix_disable_cb = 0, msix_disable_ct = 0;
52int		max_xfer_size = BFAD_MAX_SECTORS >> 1;
53static int	max_rport_logins = BFA_FCS_MAX_RPORT_LOGINS;
54
55/* Firmware releated */
56u32	bfi_image_cb_size, bfi_image_ct_size, bfi_image_ct2_size;
57u32	*bfi_image_cb, *bfi_image_ct, *bfi_image_ct2;
58
59#define BFAD_FW_FILE_CB		"cbfw-3.2.5.1.bin"
60#define BFAD_FW_FILE_CT		"ctfw-3.2.5.1.bin"
61#define BFAD_FW_FILE_CT2	"ct2fw-3.2.5.1.bin"
62
63static u32 *bfad_load_fwimg(struct pci_dev *pdev);
64static void bfad_free_fwimg(void);
65static void bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image,
66		u32 *bfi_image_size, char *fw_name);
67
68static const char *msix_name_ct[] = {
69	"ctrl",
70	"cpe0", "cpe1", "cpe2", "cpe3",
71	"rme0", "rme1", "rme2", "rme3" };
72
73static const char *msix_name_cb[] = {
74	"cpe0", "cpe1", "cpe2", "cpe3",
75	"rme0", "rme1", "rme2", "rme3",
76	"eemc", "elpu0", "elpu1", "epss", "mlpu" };
77
78MODULE_FIRMWARE(BFAD_FW_FILE_CB);
79MODULE_FIRMWARE(BFAD_FW_FILE_CT);
80MODULE_FIRMWARE(BFAD_FW_FILE_CT2);
81
82module_param(os_name, charp, S_IRUGO | S_IWUSR);
83MODULE_PARM_DESC(os_name, "OS name of the hba host machine");
84module_param(os_patch, charp, S_IRUGO | S_IWUSR);
85MODULE_PARM_DESC(os_patch, "OS patch level of the hba host machine");
86module_param(host_name, charp, S_IRUGO | S_IWUSR);
87MODULE_PARM_DESC(host_name, "Hostname of the hba host machine");
88module_param(num_rports, int, S_IRUGO | S_IWUSR);
89MODULE_PARM_DESC(num_rports, "Max number of rports supported per port "
90				"(physical/logical), default=1024");
91module_param(num_ios, int, S_IRUGO | S_IWUSR);
92MODULE_PARM_DESC(num_ios, "Max number of ioim requests, default=2000");
93module_param(num_tms, int, S_IRUGO | S_IWUSR);
94MODULE_PARM_DESC(num_tms, "Max number of task im requests, default=128");
95module_param(num_fcxps, int, S_IRUGO | S_IWUSR);
96MODULE_PARM_DESC(num_fcxps, "Max number of fcxp requests, default=64");
97module_param(num_ufbufs, int, S_IRUGO | S_IWUSR);
98MODULE_PARM_DESC(num_ufbufs, "Max number of unsolicited frame "
99				"buffers, default=64");
100module_param(reqq_size, int, S_IRUGO | S_IWUSR);
101MODULE_PARM_DESC(reqq_size, "Max number of request queue elements, "
102				"default=256");
103module_param(rspq_size, int, S_IRUGO | S_IWUSR);
104MODULE_PARM_DESC(rspq_size, "Max number of response queue elements, "
105				"default=64");
106module_param(num_sgpgs, int, S_IRUGO | S_IWUSR);
107MODULE_PARM_DESC(num_sgpgs, "Number of scatter/gather pages, default=2048");
108module_param(rport_del_timeout, int, S_IRUGO | S_IWUSR);
109MODULE_PARM_DESC(rport_del_timeout, "Rport delete timeout, default=90 secs, "
110					"Range[>0]");
111module_param(bfa_lun_queue_depth, int, S_IRUGO | S_IWUSR);
112MODULE_PARM_DESC(bfa_lun_queue_depth, "Lun queue depth, default=32, Range[>0]");
113module_param(bfa_io_max_sge, int, S_IRUGO | S_IWUSR);
114MODULE_PARM_DESC(bfa_io_max_sge, "Max io scatter/gather elements, default=255");
115module_param(bfa_log_level, int, S_IRUGO | S_IWUSR);
116MODULE_PARM_DESC(bfa_log_level, "Driver log level, default=3, "
117				"Range[Critical:1|Error:2|Warning:3|Info:4]");
118module_param(ioc_auto_recover, int, S_IRUGO | S_IWUSR);
119MODULE_PARM_DESC(ioc_auto_recover, "IOC auto recovery, default=1, "
120				"Range[off:0|on:1]");
121module_param(bfa_linkup_delay, int, S_IRUGO | S_IWUSR);
122MODULE_PARM_DESC(bfa_linkup_delay, "Link up delay, default=30 secs for "
123			"boot port. Otherwise 10 secs in RHEL4 & 0 for "
124			"[RHEL5, SLES10, ESX40] Range[>0]");
125module_param(msix_disable_cb, int, S_IRUGO | S_IWUSR);
126MODULE_PARM_DESC(msix_disable_cb, "Disable Message Signaled Interrupts for QLogic-415/425/815/825 cards, default=0 Range[false:0|true:1]");
127module_param(msix_disable_ct, int, S_IRUGO | S_IWUSR);
128MODULE_PARM_DESC(msix_disable_ct, "Disable Message Signaled Interrupts if possible for QLogic-1010/1020/804/1007/902/1741 cards, default=0, Range[false:0|true:1]");
129module_param(fdmi_enable, int, S_IRUGO | S_IWUSR);
130MODULE_PARM_DESC(fdmi_enable, "Enables fdmi registration, default=1, "
131				"Range[false:0|true:1]");
132module_param(pcie_max_read_reqsz, int, S_IRUGO | S_IWUSR);
133MODULE_PARM_DESC(pcie_max_read_reqsz, "PCIe max read request size, default=0 "
134		"(use system setting), Range[128|256|512|1024|2048|4096]");
135module_param(bfa_debugfs_enable, int, S_IRUGO | S_IWUSR);
136MODULE_PARM_DESC(bfa_debugfs_enable, "Enables debugfs feature, default=1,"
137		" Range[false:0|true:1]");
138module_param(max_xfer_size, int, S_IRUGO | S_IWUSR);
139MODULE_PARM_DESC(max_xfer_size, "default=32MB,"
140		" Range[64k|128k|256k|512k|1024k|2048k]");
141module_param(max_rport_logins, int, S_IRUGO | S_IWUSR);
142MODULE_PARM_DESC(max_rport_logins, "Max number of logins to initiator and target rports on a port (physical/logical), default=1024");
143
144static void
145bfad_sm_uninit(struct bfad_s *bfad, enum bfad_sm_event event);
146static void
147bfad_sm_created(struct bfad_s *bfad, enum bfad_sm_event event);
148static void
149bfad_sm_initializing(struct bfad_s *bfad, enum bfad_sm_event event);
150static void
151bfad_sm_operational(struct bfad_s *bfad, enum bfad_sm_event event);
152static void
153bfad_sm_stopping(struct bfad_s *bfad, enum bfad_sm_event event);
154static void
155bfad_sm_failed(struct bfad_s *bfad, enum bfad_sm_event event);
156static void
157bfad_sm_fcs_exit(struct bfad_s *bfad, enum bfad_sm_event event);
158
159/*
160 * Beginning state for the driver instance, awaiting the pci_probe event
161 */
162static void
163bfad_sm_uninit(struct bfad_s *bfad, enum bfad_sm_event event)
164{
165	bfa_trc(bfad, event);
166
167	switch (event) {
168	case BFAD_E_CREATE:
169		bfa_sm_set_state(bfad, bfad_sm_created);
170		bfad->bfad_tsk = kthread_create(bfad_worker, (void *) bfad,
171						"%s", "bfad_worker");
172		if (IS_ERR(bfad->bfad_tsk)) {
173			printk(KERN_INFO "bfad[%d]: Kernel thread "
174				"creation failed!\n", bfad->inst_no);
175			bfa_sm_send_event(bfad, BFAD_E_KTHREAD_CREATE_FAILED);
176		}
177		bfa_sm_send_event(bfad, BFAD_E_INIT);
178		break;
179
180	case BFAD_E_STOP:
181		/* Ignore stop; already in uninit */
182		break;
183
184	default:
185		bfa_sm_fault(bfad, event);
186	}
187}
188
189/*
190 * Driver Instance is created, awaiting event INIT to initialize the bfad
191 */
192static void
193bfad_sm_created(struct bfad_s *bfad, enum bfad_sm_event event)
194{
195	unsigned long flags;
196	bfa_status_t ret;
197
198	bfa_trc(bfad, event);
199
200	switch (event) {
201	case BFAD_E_INIT:
202		bfa_sm_set_state(bfad, bfad_sm_initializing);
203
204		init_completion(&bfad->comp);
205
206		/* Enable Interrupt and wait bfa_init completion */
207		if (bfad_setup_intr(bfad)) {
208			printk(KERN_WARNING "bfad%d: bfad_setup_intr failed\n",
209					bfad->inst_no);
210			bfa_sm_send_event(bfad, BFAD_E_INIT_FAILED);
211			break;
212		}
213
214		spin_lock_irqsave(&bfad->bfad_lock, flags);
215		bfa_iocfc_init(&bfad->bfa);
216		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
217
218		/* Set up interrupt handler for each vectors */
219		if ((bfad->bfad_flags & BFAD_MSIX_ON) &&
220			bfad_install_msix_handler(bfad)) {
221			printk(KERN_WARNING "%s: install_msix failed, bfad%d\n",
222				__func__, bfad->inst_no);
223		}
224
225		bfad_init_timer(bfad);
226
227		wait_for_completion(&bfad->comp);
228
229		if ((bfad->bfad_flags & BFAD_HAL_INIT_DONE)) {
230			bfa_sm_send_event(bfad, BFAD_E_INIT_SUCCESS);
231		} else {
232			printk(KERN_WARNING
233				"bfa %s: bfa init failed\n",
234				bfad->pci_name);
235			spin_lock_irqsave(&bfad->bfad_lock, flags);
236			bfa_fcs_init(&bfad->bfa_fcs);
237			spin_unlock_irqrestore(&bfad->bfad_lock, flags);
238
239			ret = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM);
240			if (ret != BFA_STATUS_OK) {
241				init_completion(&bfad->comp);
242
243				spin_lock_irqsave(&bfad->bfad_lock, flags);
244				bfad->pport.flags |= BFAD_PORT_DELETE;
245				bfa_fcs_exit(&bfad->bfa_fcs);
246				spin_unlock_irqrestore(&bfad->bfad_lock, flags);
247
248				wait_for_completion(&bfad->comp);
249
250				bfa_sm_send_event(bfad, BFAD_E_INIT_FAILED);
251				break;
252			}
253			bfad->bfad_flags |= BFAD_HAL_INIT_FAIL;
254			bfa_sm_send_event(bfad, BFAD_E_HAL_INIT_FAILED);
255		}
256
257		break;
258
259	case BFAD_E_KTHREAD_CREATE_FAILED:
260		bfa_sm_set_state(bfad, bfad_sm_uninit);
261		break;
262
263	default:
264		bfa_sm_fault(bfad, event);
265	}
266}
267
268static void
269bfad_sm_initializing(struct bfad_s *bfad, enum bfad_sm_event event)
270{
271	int	retval;
272	unsigned long	flags;
273
274	bfa_trc(bfad, event);
275
276	switch (event) {
277	case BFAD_E_INIT_SUCCESS:
278		kthread_stop(bfad->bfad_tsk);
279		spin_lock_irqsave(&bfad->bfad_lock, flags);
280		bfad->bfad_tsk = NULL;
281		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
282
283		retval = bfad_start_ops(bfad);
284		if (retval != BFA_STATUS_OK) {
285			bfa_sm_set_state(bfad, bfad_sm_failed);
286			break;
287		}
288		bfa_sm_set_state(bfad, bfad_sm_operational);
289		break;
290
291	case BFAD_E_INIT_FAILED:
292		bfa_sm_set_state(bfad, bfad_sm_uninit);
293		kthread_stop(bfad->bfad_tsk);
294		spin_lock_irqsave(&bfad->bfad_lock, flags);
295		bfad->bfad_tsk = NULL;
296		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
297		break;
298
299	case BFAD_E_HAL_INIT_FAILED:
300		bfa_sm_set_state(bfad, bfad_sm_failed);
301		break;
302	default:
303		bfa_sm_fault(bfad, event);
304	}
305}
306
307static void
308bfad_sm_failed(struct bfad_s *bfad, enum bfad_sm_event event)
309{
310	int	retval;
311
312	bfa_trc(bfad, event);
313
314	switch (event) {
315	case BFAD_E_INIT_SUCCESS:
316		retval = bfad_start_ops(bfad);
317		if (retval != BFA_STATUS_OK)
318			break;
319		bfa_sm_set_state(bfad, bfad_sm_operational);
320		break;
321
322	case BFAD_E_STOP:
323		bfa_sm_set_state(bfad, bfad_sm_fcs_exit);
324		bfa_sm_send_event(bfad, BFAD_E_FCS_EXIT_COMP);
325		break;
326
327	case BFAD_E_EXIT_COMP:
328		bfa_sm_set_state(bfad, bfad_sm_uninit);
329		bfad_remove_intr(bfad);
330		del_timer_sync(&bfad->hal_tmo);
331		break;
332
333	default:
334		bfa_sm_fault(bfad, event);
335	}
336}
337
338static void
339bfad_sm_operational(struct bfad_s *bfad, enum bfad_sm_event event)
340{
341	bfa_trc(bfad, event);
342
343	switch (event) {
344	case BFAD_E_STOP:
345		bfa_sm_set_state(bfad, bfad_sm_fcs_exit);
346		bfad_fcs_stop(bfad);
347		break;
348
349	default:
350		bfa_sm_fault(bfad, event);
351	}
352}
353
354static void
355bfad_sm_fcs_exit(struct bfad_s *bfad, enum bfad_sm_event event)
356{
357	bfa_trc(bfad, event);
358
359	switch (event) {
360	case BFAD_E_FCS_EXIT_COMP:
361		bfa_sm_set_state(bfad, bfad_sm_stopping);
362		bfad_stop(bfad);
363		break;
364
365	default:
366		bfa_sm_fault(bfad, event);
367	}
368}
369
370static void
371bfad_sm_stopping(struct bfad_s *bfad, enum bfad_sm_event event)
372{
373	bfa_trc(bfad, event);
374
375	switch (event) {
376	case BFAD_E_EXIT_COMP:
377		bfa_sm_set_state(bfad, bfad_sm_uninit);
378		bfad_remove_intr(bfad);
379		del_timer_sync(&bfad->hal_tmo);
380		bfad_im_probe_undo(bfad);
381		bfad->bfad_flags &= ~BFAD_FC4_PROBE_DONE;
382		bfad_uncfg_pport(bfad);
383		break;
384
385	default:
386		bfa_sm_fault(bfad, event);
387		break;
388	}
389}
390
391/*
392 *  BFA callbacks
393 */
394void
395bfad_hcb_comp(void *arg, bfa_status_t status)
396{
397	struct bfad_hal_comp *fcomp = (struct bfad_hal_comp *)arg;
398
399	fcomp->status = status;
400	complete(&fcomp->comp);
401}
402
403/*
404 * bfa_init callback
405 */
406void
407bfa_cb_init(void *drv, bfa_status_t init_status)
408{
409	struct bfad_s	      *bfad = drv;
410
411	if (init_status == BFA_STATUS_OK) {
412		bfad->bfad_flags |= BFAD_HAL_INIT_DONE;
413
414		/*
415		 * If BFAD_HAL_INIT_FAIL flag is set:
416		 * Wake up the kernel thread to start
417		 * the bfad operations after HAL init done
418		 */
419		if ((bfad->bfad_flags & BFAD_HAL_INIT_FAIL)) {
420			bfad->bfad_flags &= ~BFAD_HAL_INIT_FAIL;
421			wake_up_process(bfad->bfad_tsk);
422		}
423	}
424
425	complete(&bfad->comp);
426}
427
428/*
429 *  BFA_FCS callbacks
430 */
431struct bfad_port_s *
432bfa_fcb_lport_new(struct bfad_s *bfad, struct bfa_fcs_lport_s *port,
433		 enum bfa_lport_role roles, struct bfad_vf_s *vf_drv,
434		 struct bfad_vport_s *vp_drv)
435{
436	bfa_status_t	rc;
437	struct bfad_port_s    *port_drv;
438
439	if (!vp_drv && !vf_drv) {
440		port_drv = &bfad->pport;
441		port_drv->pvb_type = BFAD_PORT_PHYS_BASE;
442	} else if (!vp_drv && vf_drv) {
443		port_drv = &vf_drv->base_port;
444		port_drv->pvb_type = BFAD_PORT_VF_BASE;
445	} else if (vp_drv && !vf_drv) {
446		port_drv = &vp_drv->drv_port;
447		port_drv->pvb_type = BFAD_PORT_PHYS_VPORT;
448	} else {
449		port_drv = &vp_drv->drv_port;
450		port_drv->pvb_type = BFAD_PORT_VF_VPORT;
451	}
452
453	port_drv->fcs_port = port;
454	port_drv->roles = roles;
455
456	if (roles & BFA_LPORT_ROLE_FCP_IM) {
457		rc = bfad_im_port_new(bfad, port_drv);
458		if (rc != BFA_STATUS_OK) {
459			bfad_im_port_delete(bfad, port_drv);
460			port_drv = NULL;
461		}
462	}
463
464	return port_drv;
465}
466
467/*
468 * FCS RPORT alloc callback, after successful PLOGI by FCS
469 */
470bfa_status_t
471bfa_fcb_rport_alloc(struct bfad_s *bfad, struct bfa_fcs_rport_s **rport,
472		    struct bfad_rport_s **rport_drv)
473{
474	bfa_status_t	rc = BFA_STATUS_OK;
475
476	*rport_drv = kzalloc(sizeof(struct bfad_rport_s), GFP_ATOMIC);
477	if (*rport_drv == NULL) {
478		rc = BFA_STATUS_ENOMEM;
479		goto ext;
480	}
481
482	*rport = &(*rport_drv)->fcs_rport;
483
484ext:
485	return rc;
486}
487
488/*
489 * FCS PBC VPORT Create
490 */
491void
492bfa_fcb_pbc_vport_create(struct bfad_s *bfad, struct bfi_pbc_vport_s pbc_vport)
493{
494
495	struct bfa_lport_cfg_s port_cfg = {0};
496	struct bfad_vport_s   *vport;
497	int rc;
498
499	vport = kzalloc(sizeof(struct bfad_vport_s), GFP_ATOMIC);
500	if (!vport) {
501		bfa_trc(bfad, 0);
502		return;
503	}
504
505	vport->drv_port.bfad = bfad;
506	port_cfg.roles = BFA_LPORT_ROLE_FCP_IM;
507	port_cfg.pwwn = pbc_vport.vp_pwwn;
508	port_cfg.nwwn = pbc_vport.vp_nwwn;
509	port_cfg.preboot_vp  = BFA_TRUE;
510
511	rc = bfa_fcs_pbc_vport_create(&vport->fcs_vport, &bfad->bfa_fcs, 0,
512				  &port_cfg, vport);
513
514	if (rc != BFA_STATUS_OK) {
515		bfa_trc(bfad, 0);
516		return;
517	}
518
519	list_add_tail(&vport->list_entry, &bfad->pbc_vport_list);
520}
521
522void
523bfad_hal_mem_release(struct bfad_s *bfad)
524{
525	struct bfa_meminfo_s *hal_meminfo = &bfad->meminfo;
526	struct bfa_mem_dma_s *dma_info, *dma_elem;
527	struct bfa_mem_kva_s *kva_info, *kva_elem;
528	struct list_head *dm_qe, *km_qe;
529
530	dma_info = &hal_meminfo->dma_info;
531	kva_info = &hal_meminfo->kva_info;
532
533	/* Iterate through the KVA meminfo queue */
534	list_for_each(km_qe, &kva_info->qe) {
535		kva_elem = (struct bfa_mem_kva_s *) km_qe;
536		vfree(kva_elem->kva);
537	}
538
539	/* Iterate through the DMA meminfo queue */
540	list_for_each(dm_qe, &dma_info->qe) {
541		dma_elem = (struct bfa_mem_dma_s *) dm_qe;
542		dma_free_coherent(&bfad->pcidev->dev,
543				dma_elem->mem_len, dma_elem->kva,
544				(dma_addr_t) dma_elem->dma);
545	}
546
547	memset(hal_meminfo, 0, sizeof(struct bfa_meminfo_s));
548}
549
550void
551bfad_update_hal_cfg(struct bfa_iocfc_cfg_s *bfa_cfg)
552{
553	if (num_rports > 0)
554		bfa_cfg->fwcfg.num_rports = num_rports;
555	if (num_ios > 0)
556		bfa_cfg->fwcfg.num_ioim_reqs = num_ios;
557	if (num_tms > 0)
558		bfa_cfg->fwcfg.num_tskim_reqs = num_tms;
559	if (num_fcxps > 0 && num_fcxps <= BFA_FCXP_MAX)
560		bfa_cfg->fwcfg.num_fcxp_reqs = num_fcxps;
561	if (num_ufbufs > 0 && num_ufbufs <= BFA_UF_MAX)
562		bfa_cfg->fwcfg.num_uf_bufs = num_ufbufs;
563	if (reqq_size > 0)
564		bfa_cfg->drvcfg.num_reqq_elems = reqq_size;
565	if (rspq_size > 0)
566		bfa_cfg->drvcfg.num_rspq_elems = rspq_size;
567	if (num_sgpgs > 0 && num_sgpgs <= BFA_SGPG_MAX)
568		bfa_cfg->drvcfg.num_sgpgs = num_sgpgs;
569
570	/*
571	 * populate the hal values back to the driver for sysfs use.
572	 * otherwise, the default values will be shown as 0 in sysfs
573	 */
574	num_rports = bfa_cfg->fwcfg.num_rports;
575	num_ios = bfa_cfg->fwcfg.num_ioim_reqs;
576	num_tms = bfa_cfg->fwcfg.num_tskim_reqs;
577	num_fcxps = bfa_cfg->fwcfg.num_fcxp_reqs;
578	num_ufbufs = bfa_cfg->fwcfg.num_uf_bufs;
579	reqq_size = bfa_cfg->drvcfg.num_reqq_elems;
580	rspq_size = bfa_cfg->drvcfg.num_rspq_elems;
581	num_sgpgs = bfa_cfg->drvcfg.num_sgpgs;
582}
583
584bfa_status_t
585bfad_hal_mem_alloc(struct bfad_s *bfad)
586{
587	struct bfa_meminfo_s *hal_meminfo = &bfad->meminfo;
588	struct bfa_mem_dma_s *dma_info, *dma_elem;
589	struct bfa_mem_kva_s *kva_info, *kva_elem;
590	struct list_head *dm_qe, *km_qe;
591	bfa_status_t	rc = BFA_STATUS_OK;
592	dma_addr_t	phys_addr;
593
594	bfa_cfg_get_default(&bfad->ioc_cfg);
595	bfad_update_hal_cfg(&bfad->ioc_cfg);
596	bfad->cfg_data.ioc_queue_depth = bfad->ioc_cfg.fwcfg.num_ioim_reqs;
597	bfa_cfg_get_meminfo(&bfad->ioc_cfg, hal_meminfo, &bfad->bfa);
598
599	dma_info = &hal_meminfo->dma_info;
600	kva_info = &hal_meminfo->kva_info;
601
602	/* Iterate through the KVA meminfo queue */
603	list_for_each(km_qe, &kva_info->qe) {
604		kva_elem = (struct bfa_mem_kva_s *) km_qe;
605		kva_elem->kva = vzalloc(kva_elem->mem_len);
606		if (kva_elem->kva == NULL) {
607			bfad_hal_mem_release(bfad);
608			rc = BFA_STATUS_ENOMEM;
609			goto ext;
610		}
611	}
612
613	/* Iterate through the DMA meminfo queue */
614	list_for_each(dm_qe, &dma_info->qe) {
615		dma_elem = (struct bfa_mem_dma_s *) dm_qe;
616		dma_elem->kva = dma_alloc_coherent(&bfad->pcidev->dev,
617						dma_elem->mem_len,
618						&phys_addr, GFP_KERNEL);
619		if (dma_elem->kva == NULL) {
620			bfad_hal_mem_release(bfad);
621			rc = BFA_STATUS_ENOMEM;
622			goto ext;
623		}
624		dma_elem->dma = phys_addr;
625		memset(dma_elem->kva, 0, dma_elem->mem_len);
626	}
627ext:
628	return rc;
629}
630
631/*
632 * Create a vport under a vf.
633 */
634bfa_status_t
635bfad_vport_create(struct bfad_s *bfad, u16 vf_id,
636		  struct bfa_lport_cfg_s *port_cfg, struct device *dev)
637{
638	struct bfad_vport_s   *vport;
639	int		rc = BFA_STATUS_OK;
640	unsigned long	flags;
641	struct completion fcomp;
642
643	vport = kzalloc(sizeof(struct bfad_vport_s), GFP_KERNEL);
644	if (!vport) {
645		rc = BFA_STATUS_ENOMEM;
646		goto ext;
647	}
648
649	vport->drv_port.bfad = bfad;
650	spin_lock_irqsave(&bfad->bfad_lock, flags);
651	rc = bfa_fcs_vport_create(&vport->fcs_vport, &bfad->bfa_fcs, vf_id,
652				  port_cfg, vport);
653	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
654
655	if (rc != BFA_STATUS_OK)
656		goto ext_free_vport;
657
658	if (port_cfg->roles & BFA_LPORT_ROLE_FCP_IM) {
659		rc = bfad_im_scsi_host_alloc(bfad, vport->drv_port.im_port,
660							dev);
661		if (rc != BFA_STATUS_OK)
662			goto ext_free_fcs_vport;
663	}
664
665	spin_lock_irqsave(&bfad->bfad_lock, flags);
666	bfa_fcs_vport_start(&vport->fcs_vport);
667	list_add_tail(&vport->list_entry, &bfad->vport_list);
668	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
669
670	return BFA_STATUS_OK;
671
672ext_free_fcs_vport:
673	spin_lock_irqsave(&bfad->bfad_lock, flags);
674	vport->comp_del = &fcomp;
675	init_completion(vport->comp_del);
676	bfa_fcs_vport_delete(&vport->fcs_vport);
677	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
678	wait_for_completion(vport->comp_del);
679ext_free_vport:
680	kfree(vport);
681ext:
682	return rc;
683}
684
685void
686bfad_bfa_tmo(struct timer_list *t)
687{
688	struct bfad_s	      *bfad = from_timer(bfad, t, hal_tmo);
689	unsigned long	flags;
690	struct list_head	       doneq;
691
692	spin_lock_irqsave(&bfad->bfad_lock, flags);
693
694	bfa_timer_beat(&bfad->bfa.timer_mod);
695
696	bfa_comp_deq(&bfad->bfa, &doneq);
697	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
698
699	if (!list_empty(&doneq)) {
700		bfa_comp_process(&bfad->bfa, &doneq);
701		spin_lock_irqsave(&bfad->bfad_lock, flags);
702		bfa_comp_free(&bfad->bfa, &doneq);
703		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
704	}
705
706	mod_timer(&bfad->hal_tmo,
707		  jiffies + msecs_to_jiffies(BFA_TIMER_FREQ));
708}
709
710void
711bfad_init_timer(struct bfad_s *bfad)
712{
713	timer_setup(&bfad->hal_tmo, bfad_bfa_tmo, 0);
714
715	mod_timer(&bfad->hal_tmo,
716		  jiffies + msecs_to_jiffies(BFA_TIMER_FREQ));
717}
718
719int
720bfad_pci_init(struct pci_dev *pdev, struct bfad_s *bfad)
721{
722	int rc = -ENODEV;
723
724	if (pci_enable_device(pdev)) {
725		printk(KERN_ERR "pci_enable_device fail %p\n", pdev);
726		goto out;
727	}
728
729	if (pci_request_regions(pdev, BFAD_DRIVER_NAME))
730		goto out_disable_device;
731
732	pci_set_master(pdev);
733
734	rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
735	if (rc)
736		rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
737
738	if (rc) {
739		rc = -ENODEV;
740		printk(KERN_ERR "dma_set_mask_and_coherent fail %p\n", pdev);
741		goto out_release_region;
742	}
743
744	/* Enable PCIE Advanced Error Recovery (AER) if kernel supports */
745	pci_enable_pcie_error_reporting(pdev);
746
747	bfad->pci_bar0_kva = pci_iomap(pdev, 0, pci_resource_len(pdev, 0));
748	bfad->pci_bar2_kva = pci_iomap(pdev, 2, pci_resource_len(pdev, 2));
749
750	if (bfad->pci_bar0_kva == NULL) {
751		printk(KERN_ERR "Fail to map bar0\n");
752		rc = -ENODEV;
753		goto out_release_region;
754	}
755
756	bfad->hal_pcidev.pci_slot = PCI_SLOT(pdev->devfn);
757	bfad->hal_pcidev.pci_func = PCI_FUNC(pdev->devfn);
758	bfad->hal_pcidev.pci_bar_kva = bfad->pci_bar0_kva;
759	bfad->hal_pcidev.device_id = pdev->device;
760	bfad->hal_pcidev.ssid = pdev->subsystem_device;
761	bfad->pci_name = pci_name(pdev);
762
763	bfad->pci_attr.vendor_id = pdev->vendor;
764	bfad->pci_attr.device_id = pdev->device;
765	bfad->pci_attr.ssid = pdev->subsystem_device;
766	bfad->pci_attr.ssvid = pdev->subsystem_vendor;
767	bfad->pci_attr.pcifn = PCI_FUNC(pdev->devfn);
768
769	bfad->pcidev = pdev;
770
771	/* Adjust PCIe Maximum Read Request Size */
772	if (pci_is_pcie(pdev) && pcie_max_read_reqsz) {
773		if (pcie_max_read_reqsz >= 128 &&
774		    pcie_max_read_reqsz <= 4096 &&
775		    is_power_of_2(pcie_max_read_reqsz)) {
776			int max_rq = pcie_get_readrq(pdev);
777			printk(KERN_WARNING "BFA[%s]: "
778				"pcie_max_read_request_size is %d, "
779				"reset to %d\n", bfad->pci_name, max_rq,
780				pcie_max_read_reqsz);
781			pcie_set_readrq(pdev, pcie_max_read_reqsz);
782		} else {
783			printk(KERN_WARNING "BFA[%s]: invalid "
784			       "pcie_max_read_request_size %d ignored\n",
785			       bfad->pci_name, pcie_max_read_reqsz);
786		}
787	}
788
789	pci_save_state(pdev);
790
791	return 0;
792
793out_release_region:
794	pci_release_regions(pdev);
795out_disable_device:
796	pci_disable_device(pdev);
797out:
798	return rc;
799}
800
801void
802bfad_pci_uninit(struct pci_dev *pdev, struct bfad_s *bfad)
803{
804	pci_iounmap(pdev, bfad->pci_bar0_kva);
805	pci_iounmap(pdev, bfad->pci_bar2_kva);
806	pci_release_regions(pdev);
807	/* Disable PCIE Advanced Error Recovery (AER) */
808	pci_disable_pcie_error_reporting(pdev);
809	pci_disable_device(pdev);
810}
811
812bfa_status_t
813bfad_drv_init(struct bfad_s *bfad)
814{
815	bfa_status_t	rc;
816	unsigned long	flags;
817
818	bfad->cfg_data.rport_del_timeout = rport_del_timeout;
819	bfad->cfg_data.lun_queue_depth = bfa_lun_queue_depth;
820	bfad->cfg_data.io_max_sge = bfa_io_max_sge;
821	bfad->cfg_data.binding_method = FCP_PWWN_BINDING;
822
823	rc = bfad_hal_mem_alloc(bfad);
824	if (rc != BFA_STATUS_OK) {
825		printk(KERN_WARNING "bfad%d bfad_hal_mem_alloc failure\n",
826		       bfad->inst_no);
827		printk(KERN_WARNING
828			"Not enough memory to attach all QLogic BR-series HBA ports. System may need more memory.\n");
829		return BFA_STATUS_FAILED;
830	}
831
832	bfad->bfa.trcmod = bfad->trcmod;
833	bfad->bfa.plog = &bfad->plog_buf;
834	bfa_plog_init(&bfad->plog_buf);
835	bfa_plog_str(&bfad->plog_buf, BFA_PL_MID_DRVR, BFA_PL_EID_DRIVER_START,
836		     0, "Driver Attach");
837
838	bfa_attach(&bfad->bfa, bfad, &bfad->ioc_cfg, &bfad->meminfo,
839		   &bfad->hal_pcidev);
840
841	/* FCS INIT */
842	spin_lock_irqsave(&bfad->bfad_lock, flags);
843	bfad->bfa_fcs.trcmod = bfad->trcmod;
844	bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE);
845	bfad->bfa_fcs.fdmi_enabled = fdmi_enable;
846	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
847
848	bfad->bfad_flags |= BFAD_DRV_INIT_DONE;
849
850	return BFA_STATUS_OK;
851}
852
853void
854bfad_drv_uninit(struct bfad_s *bfad)
855{
856	unsigned long   flags;
857
858	spin_lock_irqsave(&bfad->bfad_lock, flags);
859	init_completion(&bfad->comp);
860	bfa_iocfc_stop(&bfad->bfa);
861	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
862	wait_for_completion(&bfad->comp);
863
864	del_timer_sync(&bfad->hal_tmo);
865	bfa_isr_disable(&bfad->bfa);
866	bfa_detach(&bfad->bfa);
867	bfad_remove_intr(bfad);
868	bfad_hal_mem_release(bfad);
869
870	bfad->bfad_flags &= ~BFAD_DRV_INIT_DONE;
871}
872
873void
874bfad_drv_start(struct bfad_s *bfad)
875{
876	unsigned long	flags;
877
878	spin_lock_irqsave(&bfad->bfad_lock, flags);
879	bfa_iocfc_start(&bfad->bfa);
880	bfa_fcs_pbc_vport_init(&bfad->bfa_fcs);
881	bfa_fcs_fabric_modstart(&bfad->bfa_fcs);
882	bfad->bfad_flags |= BFAD_HAL_START_DONE;
883	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
884
885	if (bfad->im)
886		flush_workqueue(bfad->im->drv_workq);
887}
888
889void
890bfad_fcs_stop(struct bfad_s *bfad)
891{
892	unsigned long	flags;
893
894	spin_lock_irqsave(&bfad->bfad_lock, flags);
895	init_completion(&bfad->comp);
896	bfad->pport.flags |= BFAD_PORT_DELETE;
897	bfa_fcs_exit(&bfad->bfa_fcs);
898	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
899	wait_for_completion(&bfad->comp);
900
901	bfa_sm_send_event(bfad, BFAD_E_FCS_EXIT_COMP);
902}
903
904void
905bfad_stop(struct bfad_s *bfad)
906{
907	unsigned long	flags;
908
909	spin_lock_irqsave(&bfad->bfad_lock, flags);
910	init_completion(&bfad->comp);
911	bfa_iocfc_stop(&bfad->bfa);
912	bfad->bfad_flags &= ~BFAD_HAL_START_DONE;
913	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
914	wait_for_completion(&bfad->comp);
915
916	bfa_sm_send_event(bfad, BFAD_E_EXIT_COMP);
917}
918
919bfa_status_t
920bfad_cfg_pport(struct bfad_s *bfad, enum bfa_lport_role role)
921{
922	int		rc = BFA_STATUS_OK;
923
924	/* Allocate scsi_host for the physical port */
925	if ((supported_fc4s & BFA_LPORT_ROLE_FCP_IM) &&
926	    (role & BFA_LPORT_ROLE_FCP_IM)) {
927		if (bfad->pport.im_port == NULL) {
928			rc = BFA_STATUS_FAILED;
929			goto out;
930		}
931
932		rc = bfad_im_scsi_host_alloc(bfad, bfad->pport.im_port,
933						&bfad->pcidev->dev);
934		if (rc != BFA_STATUS_OK)
935			goto out;
936
937		bfad->pport.roles |= BFA_LPORT_ROLE_FCP_IM;
938	}
939
940	bfad->bfad_flags |= BFAD_CFG_PPORT_DONE;
941
942out:
943	return rc;
944}
945
946void
947bfad_uncfg_pport(struct bfad_s *bfad)
948{
949	if ((supported_fc4s & BFA_LPORT_ROLE_FCP_IM) &&
950	    (bfad->pport.roles & BFA_LPORT_ROLE_FCP_IM)) {
951		bfad_im_scsi_host_free(bfad, bfad->pport.im_port);
952		bfad_im_port_clean(bfad->pport.im_port);
953		kfree(bfad->pport.im_port);
954		bfad->pport.roles &= ~BFA_LPORT_ROLE_FCP_IM;
955	}
956
957	bfad->bfad_flags &= ~BFAD_CFG_PPORT_DONE;
958}
959
960bfa_status_t
961bfad_start_ops(struct bfad_s *bfad) {
962
963	int	retval;
964	unsigned long	flags;
965	struct bfad_vport_s *vport, *vport_new;
966	struct bfa_fcs_driver_info_s driver_info;
967
968	/* Limit min/max. xfer size to [64k-32MB] */
969	if (max_xfer_size < BFAD_MIN_SECTORS >> 1)
970		max_xfer_size = BFAD_MIN_SECTORS >> 1;
971	if (max_xfer_size > BFAD_MAX_SECTORS >> 1)
972		max_xfer_size = BFAD_MAX_SECTORS >> 1;
973
974	/* Fill the driver_info info to fcs*/
975	memset(&driver_info, 0, sizeof(driver_info));
976	strlcpy(driver_info.version, BFAD_DRIVER_VERSION,
977		sizeof(driver_info.version));
978	if (host_name)
979		strlcpy(driver_info.host_machine_name, host_name,
980			sizeof(driver_info.host_machine_name));
981	if (os_name)
982		strlcpy(driver_info.host_os_name, os_name,
983			sizeof(driver_info.host_os_name));
984	if (os_patch)
985		strlcpy(driver_info.host_os_patch, os_patch,
986			sizeof(driver_info.host_os_patch));
987
988	strlcpy(driver_info.os_device_name, bfad->pci_name,
989		sizeof(driver_info.os_device_name));
990
991	/* FCS driver info init */
992	spin_lock_irqsave(&bfad->bfad_lock, flags);
993	bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info);
994
995	if (bfad->bfad_flags & BFAD_CFG_PPORT_DONE)
996		bfa_fcs_update_cfg(&bfad->bfa_fcs);
997	else
998		bfa_fcs_init(&bfad->bfa_fcs);
999
1000	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1001
1002	if (!(bfad->bfad_flags & BFAD_CFG_PPORT_DONE)) {
1003		retval = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM);
1004		if (retval != BFA_STATUS_OK)
1005			return BFA_STATUS_FAILED;
1006	}
1007
1008	/* Setup fc host fixed attribute if the lk supports */
1009	bfad_fc_host_init(bfad->pport.im_port);
1010
1011	/* BFAD level FC4 IM specific resource allocation */
1012	retval = bfad_im_probe(bfad);
1013	if (retval != BFA_STATUS_OK) {
1014		printk(KERN_WARNING "bfad_im_probe failed\n");
1015		if (bfa_sm_cmp_state(bfad, bfad_sm_initializing))
1016			bfa_sm_set_state(bfad, bfad_sm_failed);
1017		return BFA_STATUS_FAILED;
1018	} else
1019		bfad->bfad_flags |= BFAD_FC4_PROBE_DONE;
1020
1021	bfad_drv_start(bfad);
1022
1023	/* Complete pbc vport create */
1024	list_for_each_entry_safe(vport, vport_new, &bfad->pbc_vport_list,
1025				list_entry) {
1026		struct fc_vport_identifiers vid;
1027		struct fc_vport *fc_vport;
1028		char pwwn_buf[BFA_STRING_32];
1029
1030		memset(&vid, 0, sizeof(vid));
1031		vid.roles = FC_PORT_ROLE_FCP_INITIATOR;
1032		vid.vport_type = FC_PORTTYPE_NPIV;
1033		vid.disable = false;
1034		vid.node_name = wwn_to_u64((u8 *)
1035				(&((vport->fcs_vport).lport.port_cfg.nwwn)));
1036		vid.port_name = wwn_to_u64((u8 *)
1037				(&((vport->fcs_vport).lport.port_cfg.pwwn)));
1038		fc_vport = fc_vport_create(bfad->pport.im_port->shost, 0, &vid);
1039		if (!fc_vport) {
1040			wwn2str(pwwn_buf, vid.port_name);
1041			printk(KERN_WARNING "bfad%d: failed to create pbc vport"
1042				" %s\n", bfad->inst_no, pwwn_buf);
1043		}
1044		list_del(&vport->list_entry);
1045		kfree(vport);
1046	}
1047
1048	/*
1049	 * If bfa_linkup_delay is set to -1 default; try to retrive the
1050	 * value using the bfad_get_linkup_delay(); else use the
1051	 * passed in module param value as the bfa_linkup_delay.
1052	 */
1053	if (bfa_linkup_delay < 0) {
1054		bfa_linkup_delay = bfad_get_linkup_delay(bfad);
1055		bfad_rport_online_wait(bfad);
1056		bfa_linkup_delay = -1;
1057	} else
1058		bfad_rport_online_wait(bfad);
1059
1060	BFA_LOG(KERN_INFO, bfad, bfa_log_level, "bfa device claimed\n");
1061
1062	return BFA_STATUS_OK;
1063}
1064
1065int
1066bfad_worker(void *ptr)
1067{
1068	struct bfad_s *bfad = ptr;
1069	unsigned long flags;
1070
1071	if (kthread_should_stop())
1072		return 0;
1073
1074	/* Send event BFAD_E_INIT_SUCCESS */
1075	bfa_sm_send_event(bfad, BFAD_E_INIT_SUCCESS);
1076
1077	spin_lock_irqsave(&bfad->bfad_lock, flags);
1078	bfad->bfad_tsk = NULL;
1079	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1080
1081	return 0;
1082}
1083
1084/*
1085 *  BFA driver interrupt functions
1086 */
1087irqreturn_t
1088bfad_intx(int irq, void *dev_id)
1089{
1090	struct bfad_s	*bfad = dev_id;
1091	struct list_head	doneq;
1092	unsigned long	flags;
1093	bfa_boolean_t rc;
1094
1095	spin_lock_irqsave(&bfad->bfad_lock, flags);
1096	rc = bfa_intx(&bfad->bfa);
1097	if (!rc) {
1098		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1099		return IRQ_NONE;
1100	}
1101
1102	bfa_comp_deq(&bfad->bfa, &doneq);
1103	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1104
1105	if (!list_empty(&doneq)) {
1106		bfa_comp_process(&bfad->bfa, &doneq);
1107
1108		spin_lock_irqsave(&bfad->bfad_lock, flags);
1109		bfa_comp_free(&bfad->bfa, &doneq);
1110		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1111	}
1112
1113	return IRQ_HANDLED;
1114
1115}
1116
1117static irqreturn_t
1118bfad_msix(int irq, void *dev_id)
1119{
1120	struct bfad_msix_s *vec = dev_id;
1121	struct bfad_s *bfad = vec->bfad;
1122	struct list_head doneq;
1123	unsigned long   flags;
1124
1125	spin_lock_irqsave(&bfad->bfad_lock, flags);
1126
1127	bfa_msix(&bfad->bfa, vec->msix.entry);
1128	bfa_comp_deq(&bfad->bfa, &doneq);
1129	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1130
1131	if (!list_empty(&doneq)) {
1132		bfa_comp_process(&bfad->bfa, &doneq);
1133
1134		spin_lock_irqsave(&bfad->bfad_lock, flags);
1135		bfa_comp_free(&bfad->bfa, &doneq);
1136		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1137	}
1138
1139	return IRQ_HANDLED;
1140}
1141
1142/*
1143 * Initialize the MSIX entry table.
1144 */
1145static void
1146bfad_init_msix_entry(struct bfad_s *bfad, struct msix_entry *msix_entries,
1147			 int mask, int max_bit)
1148{
1149	int	i;
1150	int	match = 0x00000001;
1151
1152	for (i = 0, bfad->nvec = 0; i < MAX_MSIX_ENTRY; i++) {
1153		if (mask & match) {
1154			bfad->msix_tab[bfad->nvec].msix.entry = i;
1155			bfad->msix_tab[bfad->nvec].bfad = bfad;
1156			msix_entries[bfad->nvec].entry = i;
1157			bfad->nvec++;
1158		}
1159
1160		match <<= 1;
1161	}
1162
1163}
1164
1165int
1166bfad_install_msix_handler(struct bfad_s *bfad)
1167{
1168	int i, error = 0;
1169
1170	for (i = 0; i < bfad->nvec; i++) {
1171		sprintf(bfad->msix_tab[i].name, "bfa-%s-%s",
1172				bfad->pci_name,
1173				((bfa_asic_id_cb(bfad->hal_pcidev.device_id)) ?
1174				msix_name_cb[i] : msix_name_ct[i]));
1175
1176		error = request_irq(bfad->msix_tab[i].msix.vector,
1177				    (irq_handler_t) bfad_msix, 0,
1178				    bfad->msix_tab[i].name, &bfad->msix_tab[i]);
1179		bfa_trc(bfad, i);
1180		bfa_trc(bfad, bfad->msix_tab[i].msix.vector);
1181		if (error) {
1182			int	j;
1183
1184			for (j = 0; j < i; j++)
1185				free_irq(bfad->msix_tab[j].msix.vector,
1186						&bfad->msix_tab[j]);
1187
1188			bfad->bfad_flags &= ~BFAD_MSIX_ON;
1189			pci_disable_msix(bfad->pcidev);
1190
1191			return 1;
1192		}
1193	}
1194
1195	return 0;
1196}
1197
1198/*
1199 * Setup MSIX based interrupt.
1200 */
1201int
1202bfad_setup_intr(struct bfad_s *bfad)
1203{
1204	int error;
1205	u32 mask = 0, i, num_bit = 0, max_bit = 0;
1206	struct msix_entry msix_entries[MAX_MSIX_ENTRY];
1207	struct pci_dev *pdev = bfad->pcidev;
1208	u16	reg;
1209
1210	/* Call BFA to get the msix map for this PCI function.  */
1211	bfa_msix_getvecs(&bfad->bfa, &mask, &num_bit, &max_bit);
1212
1213	/* Set up the msix entry table */
1214	bfad_init_msix_entry(bfad, msix_entries, mask, max_bit);
1215
1216	if ((bfa_asic_id_ctc(pdev->device) && !msix_disable_ct) ||
1217	   (bfa_asic_id_cb(pdev->device) && !msix_disable_cb)) {
1218
1219		error = pci_enable_msix_exact(bfad->pcidev,
1220					      msix_entries, bfad->nvec);
1221		/* In CT1 & CT2, try to allocate just one vector */
1222		if (error == -ENOSPC && bfa_asic_id_ctc(pdev->device)) {
1223			printk(KERN_WARNING "bfa %s: trying one msix "
1224			       "vector failed to allocate %d[%d]\n",
1225			       bfad->pci_name, bfad->nvec, error);
1226			bfad->nvec = 1;
1227			error = pci_enable_msix_exact(bfad->pcidev,
1228						      msix_entries, 1);
1229		}
1230
1231		if (error) {
1232			printk(KERN_WARNING "bfad%d: "
1233			       "pci_enable_msix_exact failed (%d), "
1234			       "use line based.\n",
1235				bfad->inst_no, error);
1236			goto line_based;
1237		}
1238
1239		/* Disable INTX in MSI-X mode */
1240		pci_read_config_word(pdev, PCI_COMMAND, &reg);
1241
1242		if (!(reg & PCI_COMMAND_INTX_DISABLE))
1243			pci_write_config_word(pdev, PCI_COMMAND,
1244				reg | PCI_COMMAND_INTX_DISABLE);
1245
1246		/* Save the vectors */
1247		for (i = 0; i < bfad->nvec; i++) {
1248			bfa_trc(bfad, msix_entries[i].vector);
1249			bfad->msix_tab[i].msix.vector = msix_entries[i].vector;
1250		}
1251
1252		bfa_msix_init(&bfad->bfa, bfad->nvec);
1253
1254		bfad->bfad_flags |= BFAD_MSIX_ON;
1255
1256		return 0;
1257	}
1258
1259line_based:
1260	error = request_irq(bfad->pcidev->irq, (irq_handler_t)bfad_intx,
1261			    BFAD_IRQ_FLAGS, BFAD_DRIVER_NAME, bfad);
1262	if (error)
1263		return error;
1264
1265	bfad->bfad_flags |= BFAD_INTX_ON;
1266
1267	return 0;
1268}
1269
1270void
1271bfad_remove_intr(struct bfad_s *bfad)
1272{
1273	int	i;
1274
1275	if (bfad->bfad_flags & BFAD_MSIX_ON) {
1276		for (i = 0; i < bfad->nvec; i++)
1277			free_irq(bfad->msix_tab[i].msix.vector,
1278					&bfad->msix_tab[i]);
1279
1280		pci_disable_msix(bfad->pcidev);
1281		bfad->bfad_flags &= ~BFAD_MSIX_ON;
1282	} else if (bfad->bfad_flags & BFAD_INTX_ON) {
1283		free_irq(bfad->pcidev->irq, bfad);
1284	}
1285}
1286
1287/*
1288 * PCI probe entry.
1289 */
1290int
1291bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid)
1292{
1293	struct bfad_s	*bfad;
1294	int		error = -ENODEV, retval, i;
1295
1296	/* For single port cards - only claim function 0 */
1297	if ((pdev->device == BFA_PCI_DEVICE_ID_FC_8G1P) &&
1298		(PCI_FUNC(pdev->devfn) != 0))
1299		return -ENODEV;
1300
1301	bfad = kzalloc(sizeof(struct bfad_s), GFP_KERNEL);
1302	if (!bfad) {
1303		error = -ENOMEM;
1304		goto out;
1305	}
1306
1307	bfad->trcmod = kzalloc(sizeof(struct bfa_trc_mod_s), GFP_KERNEL);
1308	if (!bfad->trcmod) {
1309		printk(KERN_WARNING "Error alloc trace buffer!\n");
1310		error = -ENOMEM;
1311		goto out_alloc_trace_failure;
1312	}
1313
1314	/* TRACE INIT */
1315	bfa_trc_init(bfad->trcmod);
1316	bfa_trc(bfad, bfad_inst);
1317
1318	/* AEN INIT */
1319	INIT_LIST_HEAD(&bfad->free_aen_q);
1320	INIT_LIST_HEAD(&bfad->active_aen_q);
1321	for (i = 0; i < BFA_AEN_MAX_ENTRY; i++)
1322		list_add_tail(&bfad->aen_list[i].qe, &bfad->free_aen_q);
1323
1324	if (!(bfad_load_fwimg(pdev))) {
1325		kfree(bfad->trcmod);
1326		goto out_alloc_trace_failure;
1327	}
1328
1329	retval = bfad_pci_init(pdev, bfad);
1330	if (retval) {
1331		printk(KERN_WARNING "bfad_pci_init failure!\n");
1332		error = retval;
1333		goto out_pci_init_failure;
1334	}
1335
1336	mutex_lock(&bfad_mutex);
1337	bfad->inst_no = bfad_inst++;
1338	list_add_tail(&bfad->list_entry, &bfad_list);
1339	mutex_unlock(&bfad_mutex);
1340
1341	/* Initializing the state machine: State set to uninit */
1342	bfa_sm_set_state(bfad, bfad_sm_uninit);
1343
1344	spin_lock_init(&bfad->bfad_lock);
1345	spin_lock_init(&bfad->bfad_aen_spinlock);
1346
1347	pci_set_drvdata(pdev, bfad);
1348
1349	bfad->ref_count = 0;
1350	bfad->pport.bfad = bfad;
1351	INIT_LIST_HEAD(&bfad->pbc_vport_list);
1352	INIT_LIST_HEAD(&bfad->vport_list);
1353
1354	/* Setup the debugfs node for this bfad */
1355	if (bfa_debugfs_enable)
1356		bfad_debugfs_init(&bfad->pport);
1357
1358	retval = bfad_drv_init(bfad);
1359	if (retval != BFA_STATUS_OK)
1360		goto out_drv_init_failure;
1361
1362	bfa_sm_send_event(bfad, BFAD_E_CREATE);
1363
1364	if (bfa_sm_cmp_state(bfad, bfad_sm_uninit))
1365		goto out_bfad_sm_failure;
1366
1367	return 0;
1368
1369out_bfad_sm_failure:
1370	bfad_hal_mem_release(bfad);
1371out_drv_init_failure:
1372	/* Remove the debugfs node for this bfad */
1373	kfree(bfad->regdata);
1374	bfad_debugfs_exit(&bfad->pport);
1375	mutex_lock(&bfad_mutex);
1376	bfad_inst--;
1377	list_del(&bfad->list_entry);
1378	mutex_unlock(&bfad_mutex);
1379	bfad_pci_uninit(pdev, bfad);
1380out_pci_init_failure:
1381	kfree(bfad->trcmod);
1382out_alloc_trace_failure:
1383	kfree(bfad);
1384out:
1385	return error;
1386}
1387
1388/*
1389 * PCI remove entry.
1390 */
1391void
1392bfad_pci_remove(struct pci_dev *pdev)
1393{
1394	struct bfad_s	      *bfad = pci_get_drvdata(pdev);
1395	unsigned long	flags;
1396
1397	bfa_trc(bfad, bfad->inst_no);
1398
1399	spin_lock_irqsave(&bfad->bfad_lock, flags);
1400	if (bfad->bfad_tsk != NULL) {
1401		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1402		kthread_stop(bfad->bfad_tsk);
1403	} else {
1404		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1405	}
1406
1407	/* Send Event BFAD_E_STOP */
1408	bfa_sm_send_event(bfad, BFAD_E_STOP);
1409
1410	/* Driver detach and dealloc mem */
1411	spin_lock_irqsave(&bfad->bfad_lock, flags);
1412	bfa_detach(&bfad->bfa);
1413	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1414	bfad_hal_mem_release(bfad);
1415
1416	/* Remove the debugfs node for this bfad */
1417	kfree(bfad->regdata);
1418	bfad_debugfs_exit(&bfad->pport);
1419
1420	/* Cleaning the BFAD instance */
1421	mutex_lock(&bfad_mutex);
1422	bfad_inst--;
1423	list_del(&bfad->list_entry);
1424	mutex_unlock(&bfad_mutex);
1425	bfad_pci_uninit(pdev, bfad);
1426
1427	kfree(bfad->trcmod);
1428	kfree(bfad);
1429}
1430
1431/*
1432 * PCI Error Recovery entry, error detected.
1433 */
1434static pci_ers_result_t
1435bfad_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
1436{
1437	struct bfad_s *bfad = pci_get_drvdata(pdev);
1438	unsigned long	flags;
1439	pci_ers_result_t ret = PCI_ERS_RESULT_NONE;
1440
1441	dev_printk(KERN_ERR, &pdev->dev,
1442		   "error detected state: %d - flags: 0x%x\n",
1443		   state, bfad->bfad_flags);
1444
1445	switch (state) {
1446	case pci_channel_io_normal: /* non-fatal error */
1447		spin_lock_irqsave(&bfad->bfad_lock, flags);
1448		bfad->bfad_flags &= ~BFAD_EEH_BUSY;
1449		/* Suspend/fail all bfa operations */
1450		bfa_ioc_suspend(&bfad->bfa.ioc);
1451		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1452		del_timer_sync(&bfad->hal_tmo);
1453		ret = PCI_ERS_RESULT_CAN_RECOVER;
1454		break;
1455	case pci_channel_io_frozen: /* fatal error */
1456		init_completion(&bfad->comp);
1457		spin_lock_irqsave(&bfad->bfad_lock, flags);
1458		bfad->bfad_flags |= BFAD_EEH_BUSY;
1459		/* Suspend/fail all bfa operations */
1460		bfa_ioc_suspend(&bfad->bfa.ioc);
1461		bfa_fcs_stop(&bfad->bfa_fcs);
1462		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1463		wait_for_completion(&bfad->comp);
1464
1465		bfad_remove_intr(bfad);
1466		del_timer_sync(&bfad->hal_tmo);
1467		pci_disable_device(pdev);
1468		ret = PCI_ERS_RESULT_NEED_RESET;
1469		break;
1470	case pci_channel_io_perm_failure: /* PCI Card is DEAD */
1471		spin_lock_irqsave(&bfad->bfad_lock, flags);
1472		bfad->bfad_flags |= BFAD_EEH_BUSY |
1473				    BFAD_EEH_PCI_CHANNEL_IO_PERM_FAILURE;
1474		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1475
1476		/* If the error_detected handler is called with the reason
1477		 * pci_channel_io_perm_failure - it will subsequently call
1478		 * pci_remove() entry point to remove the pci device from the
1479		 * system - So defer the cleanup to pci_remove(); cleaning up
1480		 * here causes inconsistent state during pci_remove().
1481		 */
1482		ret = PCI_ERS_RESULT_DISCONNECT;
1483		break;
1484	default:
1485		WARN_ON(1);
1486	}
1487
1488	return ret;
1489}
1490
1491static int restart_bfa(struct bfad_s *bfad)
1492{
1493	unsigned long flags;
1494	struct pci_dev *pdev = bfad->pcidev;
1495
1496	bfa_attach(&bfad->bfa, bfad, &bfad->ioc_cfg,
1497		   &bfad->meminfo, &bfad->hal_pcidev);
1498
1499	/* Enable Interrupt and wait bfa_init completion */
1500	if (bfad_setup_intr(bfad)) {
1501		dev_printk(KERN_WARNING, &pdev->dev,
1502			   "%s: bfad_setup_intr failed\n", bfad->pci_name);
1503		bfa_sm_send_event(bfad, BFAD_E_INIT_FAILED);
1504		return -1;
1505	}
1506
1507	init_completion(&bfad->comp);
1508	spin_lock_irqsave(&bfad->bfad_lock, flags);
1509	bfa_iocfc_init(&bfad->bfa);
1510	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1511
1512	/* Set up interrupt handler for each vectors */
1513	if ((bfad->bfad_flags & BFAD_MSIX_ON) &&
1514	    bfad_install_msix_handler(bfad))
1515		dev_printk(KERN_WARNING, &pdev->dev,
1516			   "%s: install_msix failed.\n", bfad->pci_name);
1517
1518	bfad_init_timer(bfad);
1519	wait_for_completion(&bfad->comp);
1520	bfad_drv_start(bfad);
1521
1522	return 0;
1523}
1524
1525/*
1526 * PCI Error Recovery entry, re-initialize the chip.
1527 */
1528static pci_ers_result_t
1529bfad_pci_slot_reset(struct pci_dev *pdev)
1530{
1531	struct bfad_s *bfad = pci_get_drvdata(pdev);
1532	u8 byte;
1533	int rc;
1534
1535	dev_printk(KERN_ERR, &pdev->dev,
1536		   "bfad_pci_slot_reset flags: 0x%x\n", bfad->bfad_flags);
1537
1538	if (pci_enable_device(pdev)) {
1539		dev_printk(KERN_ERR, &pdev->dev, "Cannot re-enable "
1540			   "PCI device after reset.\n");
1541		return PCI_ERS_RESULT_DISCONNECT;
1542	}
1543
1544	pci_restore_state(pdev);
1545
1546	/*
1547	 * Read some byte (e.g. DMA max. payload size which can't
1548	 * be 0xff any time) to make sure - we did not hit another PCI error
1549	 * in the middle of recovery. If we did, then declare permanent failure.
1550	 */
1551	pci_read_config_byte(pdev, 0x68, &byte);
1552	if (byte == 0xff) {
1553		dev_printk(KERN_ERR, &pdev->dev,
1554			   "slot_reset failed ... got another PCI error !\n");
1555		goto out_disable_device;
1556	}
1557
1558	pci_save_state(pdev);
1559	pci_set_master(pdev);
1560
1561	rc = dma_set_mask_and_coherent(&bfad->pcidev->dev, DMA_BIT_MASK(64));
1562	if (rc)
1563		rc = dma_set_mask_and_coherent(&bfad->pcidev->dev,
1564					       DMA_BIT_MASK(32));
1565	if (rc)
1566		goto out_disable_device;
1567
1568	if (restart_bfa(bfad) == -1)
1569		goto out_disable_device;
1570
1571	pci_enable_pcie_error_reporting(pdev);
1572	dev_printk(KERN_WARNING, &pdev->dev,
1573		   "slot_reset completed  flags: 0x%x!\n", bfad->bfad_flags);
1574
1575	return PCI_ERS_RESULT_RECOVERED;
1576
1577out_disable_device:
1578	pci_disable_device(pdev);
1579	return PCI_ERS_RESULT_DISCONNECT;
1580}
1581
1582static pci_ers_result_t
1583bfad_pci_mmio_enabled(struct pci_dev *pdev)
1584{
1585	unsigned long	flags;
1586	struct bfad_s *bfad = pci_get_drvdata(pdev);
1587
1588	dev_printk(KERN_INFO, &pdev->dev, "mmio_enabled\n");
1589
1590	/* Fetch FW diagnostic information */
1591	bfa_ioc_debug_save_ftrc(&bfad->bfa.ioc);
1592
1593	/* Cancel all pending IOs */
1594	spin_lock_irqsave(&bfad->bfad_lock, flags);
1595	init_completion(&bfad->comp);
1596	bfa_fcs_stop(&bfad->bfa_fcs);
1597	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1598	wait_for_completion(&bfad->comp);
1599
1600	bfad_remove_intr(bfad);
1601	del_timer_sync(&bfad->hal_tmo);
1602	pci_disable_device(pdev);
1603
1604	return PCI_ERS_RESULT_NEED_RESET;
1605}
1606
1607static void
1608bfad_pci_resume(struct pci_dev *pdev)
1609{
1610	unsigned long	flags;
1611	struct bfad_s *bfad = pci_get_drvdata(pdev);
1612
1613	dev_printk(KERN_WARNING, &pdev->dev, "resume\n");
1614
1615	/* wait until the link is online */
1616	bfad_rport_online_wait(bfad);
1617
1618	spin_lock_irqsave(&bfad->bfad_lock, flags);
1619	bfad->bfad_flags &= ~BFAD_EEH_BUSY;
1620	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1621}
1622
1623struct pci_device_id bfad_id_table[] = {
1624	{
1625		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
1626		.device = BFA_PCI_DEVICE_ID_FC_8G2P,
1627		.subvendor = PCI_ANY_ID,
1628		.subdevice = PCI_ANY_ID,
1629	},
1630	{
1631		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
1632		.device = BFA_PCI_DEVICE_ID_FC_8G1P,
1633		.subvendor = PCI_ANY_ID,
1634		.subdevice = PCI_ANY_ID,
1635	},
1636	{
1637		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
1638		.device = BFA_PCI_DEVICE_ID_CT,
1639		.subvendor = PCI_ANY_ID,
1640		.subdevice = PCI_ANY_ID,
1641		.class = (PCI_CLASS_SERIAL_FIBER << 8),
1642		.class_mask = ~0,
1643	},
1644	{
1645		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
1646		.device = BFA_PCI_DEVICE_ID_CT_FC,
1647		.subvendor = PCI_ANY_ID,
1648		.subdevice = PCI_ANY_ID,
1649		.class = (PCI_CLASS_SERIAL_FIBER << 8),
1650		.class_mask = ~0,
1651	},
1652	{
1653		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
1654		.device = BFA_PCI_DEVICE_ID_CT2,
1655		.subvendor = PCI_ANY_ID,
1656		.subdevice = PCI_ANY_ID,
1657		.class = (PCI_CLASS_SERIAL_FIBER << 8),
1658		.class_mask = ~0,
1659	},
1660
1661	{
1662		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
1663		.device = BFA_PCI_DEVICE_ID_CT2_QUAD,
1664		.subvendor = PCI_ANY_ID,
1665		.subdevice = PCI_ANY_ID,
1666		.class = (PCI_CLASS_SERIAL_FIBER << 8),
1667		.class_mask = ~0,
1668	},
1669	{0, 0},
1670};
1671
1672MODULE_DEVICE_TABLE(pci, bfad_id_table);
1673
1674/*
1675 * PCI error recovery handlers.
1676 */
1677static struct pci_error_handlers bfad_err_handler = {
1678	.error_detected = bfad_pci_error_detected,
1679	.slot_reset = bfad_pci_slot_reset,
1680	.mmio_enabled = bfad_pci_mmio_enabled,
1681	.resume = bfad_pci_resume,
1682};
1683
1684static struct pci_driver bfad_pci_driver = {
1685	.name = BFAD_DRIVER_NAME,
1686	.id_table = bfad_id_table,
1687	.probe = bfad_pci_probe,
1688	.remove = bfad_pci_remove,
1689	.err_handler = &bfad_err_handler,
1690};
1691
1692/*
1693 * Driver module init.
1694 */
1695static int __init
1696bfad_init(void)
1697{
1698	int		error = 0;
1699
1700	pr_info("QLogic BR-series BFA FC/FCOE SCSI driver - version: %s\n",
1701			BFAD_DRIVER_VERSION);
1702
1703	if (num_sgpgs > 0)
1704		num_sgpgs_parm = num_sgpgs;
1705
1706	error = bfad_im_module_init();
1707	if (error) {
1708		error = -ENOMEM;
1709		printk(KERN_WARNING "bfad_im_module_init failure\n");
1710		goto ext;
1711	}
1712
1713	if (strcmp(FCPI_NAME, " fcpim") == 0)
1714		supported_fc4s |= BFA_LPORT_ROLE_FCP_IM;
1715
1716	bfa_auto_recover = ioc_auto_recover;
1717	bfa_fcs_rport_set_del_timeout(rport_del_timeout);
1718	bfa_fcs_rport_set_max_logins(max_rport_logins);
1719
1720	error = pci_register_driver(&bfad_pci_driver);
1721	if (error) {
1722		printk(KERN_WARNING "pci_register_driver failure\n");
1723		goto ext;
1724	}
1725
1726	return 0;
1727
1728ext:
1729	bfad_im_module_exit();
1730	return error;
1731}
1732
1733/*
1734 * Driver module exit.
1735 */
1736static void __exit
1737bfad_exit(void)
1738{
1739	pci_unregister_driver(&bfad_pci_driver);
1740	bfad_im_module_exit();
1741	bfad_free_fwimg();
1742}
1743
1744/* Firmware handling */
1745static void
1746bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image,
1747		u32 *bfi_image_size, char *fw_name)
1748{
1749	const struct firmware *fw;
1750
1751	if (request_firmware(&fw, fw_name, &pdev->dev)) {
1752		printk(KERN_ALERT "Can't locate firmware %s\n", fw_name);
1753		*bfi_image = NULL;
1754		goto out;
1755	}
1756
1757	*bfi_image = vmalloc(fw->size);
1758	if (NULL == *bfi_image) {
1759		printk(KERN_ALERT "Fail to allocate buffer for fw image "
1760			"size=%x!\n", (u32) fw->size);
1761		goto out;
1762	}
1763
1764	memcpy(*bfi_image, fw->data, fw->size);
1765	*bfi_image_size = fw->size/sizeof(u32);
1766out:
1767	release_firmware(fw);
1768}
1769
1770static u32 *
1771bfad_load_fwimg(struct pci_dev *pdev)
1772{
1773	if (bfa_asic_id_ct2(pdev->device)) {
1774		if (bfi_image_ct2_size == 0)
1775			bfad_read_firmware(pdev, &bfi_image_ct2,
1776				&bfi_image_ct2_size, BFAD_FW_FILE_CT2);
1777		return bfi_image_ct2;
1778	} else if (bfa_asic_id_ct(pdev->device)) {
1779		if (bfi_image_ct_size == 0)
1780			bfad_read_firmware(pdev, &bfi_image_ct,
1781				&bfi_image_ct_size, BFAD_FW_FILE_CT);
1782		return bfi_image_ct;
1783	} else if (bfa_asic_id_cb(pdev->device)) {
1784		if (bfi_image_cb_size == 0)
1785			bfad_read_firmware(pdev, &bfi_image_cb,
1786				&bfi_image_cb_size, BFAD_FW_FILE_CB);
1787		return bfi_image_cb;
1788	}
1789
1790	return NULL;
1791}
1792
1793static void
1794bfad_free_fwimg(void)
1795{
1796	if (bfi_image_ct2_size && bfi_image_ct2)
1797		vfree(bfi_image_ct2);
1798	if (bfi_image_ct_size && bfi_image_ct)
1799		vfree(bfi_image_ct);
1800	if (bfi_image_cb_size && bfi_image_cb)
1801		vfree(bfi_image_cb);
1802}
1803
1804module_init(bfad_init);
1805module_exit(bfad_exit);
1806MODULE_LICENSE("GPL");
1807MODULE_DESCRIPTION("QLogic BR-series Fibre Channel HBA Driver" BFAD_PROTO_NAME);
1808MODULE_AUTHOR("QLogic Corporation");
1809MODULE_VERSION(BFAD_DRIVER_VERSION);
1810