cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bfad.c (46455B)


      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 = -ENODEV;
    737		printk(KERN_ERR "dma_set_mask_and_coherent fail %p\n", pdev);
    738		goto out_release_region;
    739	}
    740
    741	/* Enable PCIE Advanced Error Recovery (AER) if kernel supports */
    742	pci_enable_pcie_error_reporting(pdev);
    743
    744	bfad->pci_bar0_kva = pci_iomap(pdev, 0, pci_resource_len(pdev, 0));
    745	bfad->pci_bar2_kva = pci_iomap(pdev, 2, pci_resource_len(pdev, 2));
    746
    747	if (bfad->pci_bar0_kva == NULL) {
    748		printk(KERN_ERR "Fail to map bar0\n");
    749		rc = -ENODEV;
    750		goto out_release_region;
    751	}
    752
    753	bfad->hal_pcidev.pci_slot = PCI_SLOT(pdev->devfn);
    754	bfad->hal_pcidev.pci_func = PCI_FUNC(pdev->devfn);
    755	bfad->hal_pcidev.pci_bar_kva = bfad->pci_bar0_kva;
    756	bfad->hal_pcidev.device_id = pdev->device;
    757	bfad->hal_pcidev.ssid = pdev->subsystem_device;
    758	bfad->pci_name = pci_name(pdev);
    759
    760	bfad->pci_attr.vendor_id = pdev->vendor;
    761	bfad->pci_attr.device_id = pdev->device;
    762	bfad->pci_attr.ssid = pdev->subsystem_device;
    763	bfad->pci_attr.ssvid = pdev->subsystem_vendor;
    764	bfad->pci_attr.pcifn = PCI_FUNC(pdev->devfn);
    765
    766	bfad->pcidev = pdev;
    767
    768	/* Adjust PCIe Maximum Read Request Size */
    769	if (pci_is_pcie(pdev) && pcie_max_read_reqsz) {
    770		if (pcie_max_read_reqsz >= 128 &&
    771		    pcie_max_read_reqsz <= 4096 &&
    772		    is_power_of_2(pcie_max_read_reqsz)) {
    773			int max_rq = pcie_get_readrq(pdev);
    774			printk(KERN_WARNING "BFA[%s]: "
    775				"pcie_max_read_request_size is %d, "
    776				"reset to %d\n", bfad->pci_name, max_rq,
    777				pcie_max_read_reqsz);
    778			pcie_set_readrq(pdev, pcie_max_read_reqsz);
    779		} else {
    780			printk(KERN_WARNING "BFA[%s]: invalid "
    781			       "pcie_max_read_request_size %d ignored\n",
    782			       bfad->pci_name, pcie_max_read_reqsz);
    783		}
    784	}
    785
    786	pci_save_state(pdev);
    787
    788	return 0;
    789
    790out_release_region:
    791	pci_release_regions(pdev);
    792out_disable_device:
    793	pci_disable_device(pdev);
    794out:
    795	return rc;
    796}
    797
    798void
    799bfad_pci_uninit(struct pci_dev *pdev, struct bfad_s *bfad)
    800{
    801	pci_iounmap(pdev, bfad->pci_bar0_kva);
    802	pci_iounmap(pdev, bfad->pci_bar2_kva);
    803	pci_release_regions(pdev);
    804	/* Disable PCIE Advanced Error Recovery (AER) */
    805	pci_disable_pcie_error_reporting(pdev);
    806	pci_disable_device(pdev);
    807}
    808
    809bfa_status_t
    810bfad_drv_init(struct bfad_s *bfad)
    811{
    812	bfa_status_t	rc;
    813	unsigned long	flags;
    814
    815	bfad->cfg_data.rport_del_timeout = rport_del_timeout;
    816	bfad->cfg_data.lun_queue_depth = bfa_lun_queue_depth;
    817	bfad->cfg_data.io_max_sge = bfa_io_max_sge;
    818	bfad->cfg_data.binding_method = FCP_PWWN_BINDING;
    819
    820	rc = bfad_hal_mem_alloc(bfad);
    821	if (rc != BFA_STATUS_OK) {
    822		printk(KERN_WARNING "bfad%d bfad_hal_mem_alloc failure\n",
    823		       bfad->inst_no);
    824		printk(KERN_WARNING
    825			"Not enough memory to attach all QLogic BR-series HBA ports. System may need more memory.\n");
    826		return BFA_STATUS_FAILED;
    827	}
    828
    829	bfad->bfa.trcmod = bfad->trcmod;
    830	bfad->bfa.plog = &bfad->plog_buf;
    831	bfa_plog_init(&bfad->plog_buf);
    832	bfa_plog_str(&bfad->plog_buf, BFA_PL_MID_DRVR, BFA_PL_EID_DRIVER_START,
    833		     0, "Driver Attach");
    834
    835	bfa_attach(&bfad->bfa, bfad, &bfad->ioc_cfg, &bfad->meminfo,
    836		   &bfad->hal_pcidev);
    837
    838	/* FCS INIT */
    839	spin_lock_irqsave(&bfad->bfad_lock, flags);
    840	bfad->bfa_fcs.trcmod = bfad->trcmod;
    841	bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE);
    842	bfad->bfa_fcs.fdmi_enabled = fdmi_enable;
    843	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
    844
    845	bfad->bfad_flags |= BFAD_DRV_INIT_DONE;
    846
    847	return BFA_STATUS_OK;
    848}
    849
    850void
    851bfad_drv_uninit(struct bfad_s *bfad)
    852{
    853	unsigned long   flags;
    854
    855	spin_lock_irqsave(&bfad->bfad_lock, flags);
    856	init_completion(&bfad->comp);
    857	bfa_iocfc_stop(&bfad->bfa);
    858	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
    859	wait_for_completion(&bfad->comp);
    860
    861	del_timer_sync(&bfad->hal_tmo);
    862	bfa_isr_disable(&bfad->bfa);
    863	bfa_detach(&bfad->bfa);
    864	bfad_remove_intr(bfad);
    865	bfad_hal_mem_release(bfad);
    866
    867	bfad->bfad_flags &= ~BFAD_DRV_INIT_DONE;
    868}
    869
    870void
    871bfad_drv_start(struct bfad_s *bfad)
    872{
    873	unsigned long	flags;
    874
    875	spin_lock_irqsave(&bfad->bfad_lock, flags);
    876	bfa_iocfc_start(&bfad->bfa);
    877	bfa_fcs_pbc_vport_init(&bfad->bfa_fcs);
    878	bfa_fcs_fabric_modstart(&bfad->bfa_fcs);
    879	bfad->bfad_flags |= BFAD_HAL_START_DONE;
    880	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
    881
    882	if (bfad->im)
    883		flush_workqueue(bfad->im->drv_workq);
    884}
    885
    886void
    887bfad_fcs_stop(struct bfad_s *bfad)
    888{
    889	unsigned long	flags;
    890
    891	spin_lock_irqsave(&bfad->bfad_lock, flags);
    892	init_completion(&bfad->comp);
    893	bfad->pport.flags |= BFAD_PORT_DELETE;
    894	bfa_fcs_exit(&bfad->bfa_fcs);
    895	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
    896	wait_for_completion(&bfad->comp);
    897
    898	bfa_sm_send_event(bfad, BFAD_E_FCS_EXIT_COMP);
    899}
    900
    901void
    902bfad_stop(struct bfad_s *bfad)
    903{
    904	unsigned long	flags;
    905
    906	spin_lock_irqsave(&bfad->bfad_lock, flags);
    907	init_completion(&bfad->comp);
    908	bfa_iocfc_stop(&bfad->bfa);
    909	bfad->bfad_flags &= ~BFAD_HAL_START_DONE;
    910	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
    911	wait_for_completion(&bfad->comp);
    912
    913	bfa_sm_send_event(bfad, BFAD_E_EXIT_COMP);
    914}
    915
    916bfa_status_t
    917bfad_cfg_pport(struct bfad_s *bfad, enum bfa_lport_role role)
    918{
    919	int		rc = BFA_STATUS_OK;
    920
    921	/* Allocate scsi_host for the physical port */
    922	if ((supported_fc4s & BFA_LPORT_ROLE_FCP_IM) &&
    923	    (role & BFA_LPORT_ROLE_FCP_IM)) {
    924		if (bfad->pport.im_port == NULL) {
    925			rc = BFA_STATUS_FAILED;
    926			goto out;
    927		}
    928
    929		rc = bfad_im_scsi_host_alloc(bfad, bfad->pport.im_port,
    930						&bfad->pcidev->dev);
    931		if (rc != BFA_STATUS_OK)
    932			goto out;
    933
    934		bfad->pport.roles |= BFA_LPORT_ROLE_FCP_IM;
    935	}
    936
    937	bfad->bfad_flags |= BFAD_CFG_PPORT_DONE;
    938
    939out:
    940	return rc;
    941}
    942
    943void
    944bfad_uncfg_pport(struct bfad_s *bfad)
    945{
    946	if ((supported_fc4s & BFA_LPORT_ROLE_FCP_IM) &&
    947	    (bfad->pport.roles & BFA_LPORT_ROLE_FCP_IM)) {
    948		bfad_im_scsi_host_free(bfad, bfad->pport.im_port);
    949		bfad_im_port_clean(bfad->pport.im_port);
    950		kfree(bfad->pport.im_port);
    951		bfad->pport.roles &= ~BFA_LPORT_ROLE_FCP_IM;
    952	}
    953
    954	bfad->bfad_flags &= ~BFAD_CFG_PPORT_DONE;
    955}
    956
    957bfa_status_t
    958bfad_start_ops(struct bfad_s *bfad) {
    959
    960	int	retval;
    961	unsigned long	flags;
    962	struct bfad_vport_s *vport, *vport_new;
    963	struct bfa_fcs_driver_info_s driver_info;
    964
    965	/* Limit min/max. xfer size to [64k-32MB] */
    966	if (max_xfer_size < BFAD_MIN_SECTORS >> 1)
    967		max_xfer_size = BFAD_MIN_SECTORS >> 1;
    968	if (max_xfer_size > BFAD_MAX_SECTORS >> 1)
    969		max_xfer_size = BFAD_MAX_SECTORS >> 1;
    970
    971	/* Fill the driver_info info to fcs*/
    972	memset(&driver_info, 0, sizeof(driver_info));
    973	strlcpy(driver_info.version, BFAD_DRIVER_VERSION,
    974		sizeof(driver_info.version));
    975	if (host_name)
    976		strlcpy(driver_info.host_machine_name, host_name,
    977			sizeof(driver_info.host_machine_name));
    978	if (os_name)
    979		strlcpy(driver_info.host_os_name, os_name,
    980			sizeof(driver_info.host_os_name));
    981	if (os_patch)
    982		strlcpy(driver_info.host_os_patch, os_patch,
    983			sizeof(driver_info.host_os_patch));
    984
    985	strlcpy(driver_info.os_device_name, bfad->pci_name,
    986		sizeof(driver_info.os_device_name));
    987
    988	/* FCS driver info init */
    989	spin_lock_irqsave(&bfad->bfad_lock, flags);
    990	bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info);
    991
    992	if (bfad->bfad_flags & BFAD_CFG_PPORT_DONE)
    993		bfa_fcs_update_cfg(&bfad->bfa_fcs);
    994	else
    995		bfa_fcs_init(&bfad->bfa_fcs);
    996
    997	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
    998
    999	if (!(bfad->bfad_flags & BFAD_CFG_PPORT_DONE)) {
   1000		retval = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM);
   1001		if (retval != BFA_STATUS_OK)
   1002			return BFA_STATUS_FAILED;
   1003	}
   1004
   1005	/* Setup fc host fixed attribute if the lk supports */
   1006	bfad_fc_host_init(bfad->pport.im_port);
   1007
   1008	/* BFAD level FC4 IM specific resource allocation */
   1009	retval = bfad_im_probe(bfad);
   1010	if (retval != BFA_STATUS_OK) {
   1011		printk(KERN_WARNING "bfad_im_probe failed\n");
   1012		if (bfa_sm_cmp_state(bfad, bfad_sm_initializing))
   1013			bfa_sm_set_state(bfad, bfad_sm_failed);
   1014		return BFA_STATUS_FAILED;
   1015	} else
   1016		bfad->bfad_flags |= BFAD_FC4_PROBE_DONE;
   1017
   1018	bfad_drv_start(bfad);
   1019
   1020	/* Complete pbc vport create */
   1021	list_for_each_entry_safe(vport, vport_new, &bfad->pbc_vport_list,
   1022				list_entry) {
   1023		struct fc_vport_identifiers vid;
   1024		struct fc_vport *fc_vport;
   1025		char pwwn_buf[BFA_STRING_32];
   1026
   1027		memset(&vid, 0, sizeof(vid));
   1028		vid.roles = FC_PORT_ROLE_FCP_INITIATOR;
   1029		vid.vport_type = FC_PORTTYPE_NPIV;
   1030		vid.disable = false;
   1031		vid.node_name = wwn_to_u64((u8 *)
   1032				(&((vport->fcs_vport).lport.port_cfg.nwwn)));
   1033		vid.port_name = wwn_to_u64((u8 *)
   1034				(&((vport->fcs_vport).lport.port_cfg.pwwn)));
   1035		fc_vport = fc_vport_create(bfad->pport.im_port->shost, 0, &vid);
   1036		if (!fc_vport) {
   1037			wwn2str(pwwn_buf, vid.port_name);
   1038			printk(KERN_WARNING "bfad%d: failed to create pbc vport"
   1039				" %s\n", bfad->inst_no, pwwn_buf);
   1040		}
   1041		list_del(&vport->list_entry);
   1042		kfree(vport);
   1043	}
   1044
   1045	/*
   1046	 * If bfa_linkup_delay is set to -1 default; try to retrive the
   1047	 * value using the bfad_get_linkup_delay(); else use the
   1048	 * passed in module param value as the bfa_linkup_delay.
   1049	 */
   1050	if (bfa_linkup_delay < 0) {
   1051		bfa_linkup_delay = bfad_get_linkup_delay(bfad);
   1052		bfad_rport_online_wait(bfad);
   1053		bfa_linkup_delay = -1;
   1054	} else
   1055		bfad_rport_online_wait(bfad);
   1056
   1057	BFA_LOG(KERN_INFO, bfad, bfa_log_level, "bfa device claimed\n");
   1058
   1059	return BFA_STATUS_OK;
   1060}
   1061
   1062int
   1063bfad_worker(void *ptr)
   1064{
   1065	struct bfad_s *bfad = ptr;
   1066	unsigned long flags;
   1067
   1068	if (kthread_should_stop())
   1069		return 0;
   1070
   1071	/* Send event BFAD_E_INIT_SUCCESS */
   1072	bfa_sm_send_event(bfad, BFAD_E_INIT_SUCCESS);
   1073
   1074	spin_lock_irqsave(&bfad->bfad_lock, flags);
   1075	bfad->bfad_tsk = NULL;
   1076	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1077
   1078	return 0;
   1079}
   1080
   1081/*
   1082 *  BFA driver interrupt functions
   1083 */
   1084irqreturn_t
   1085bfad_intx(int irq, void *dev_id)
   1086{
   1087	struct bfad_s	*bfad = dev_id;
   1088	struct list_head	doneq;
   1089	unsigned long	flags;
   1090	bfa_boolean_t rc;
   1091
   1092	spin_lock_irqsave(&bfad->bfad_lock, flags);
   1093	rc = bfa_intx(&bfad->bfa);
   1094	if (!rc) {
   1095		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1096		return IRQ_NONE;
   1097	}
   1098
   1099	bfa_comp_deq(&bfad->bfa, &doneq);
   1100	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1101
   1102	if (!list_empty(&doneq)) {
   1103		bfa_comp_process(&bfad->bfa, &doneq);
   1104
   1105		spin_lock_irqsave(&bfad->bfad_lock, flags);
   1106		bfa_comp_free(&bfad->bfa, &doneq);
   1107		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1108	}
   1109
   1110	return IRQ_HANDLED;
   1111
   1112}
   1113
   1114static irqreturn_t
   1115bfad_msix(int irq, void *dev_id)
   1116{
   1117	struct bfad_msix_s *vec = dev_id;
   1118	struct bfad_s *bfad = vec->bfad;
   1119	struct list_head doneq;
   1120	unsigned long   flags;
   1121
   1122	spin_lock_irqsave(&bfad->bfad_lock, flags);
   1123
   1124	bfa_msix(&bfad->bfa, vec->msix.entry);
   1125	bfa_comp_deq(&bfad->bfa, &doneq);
   1126	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1127
   1128	if (!list_empty(&doneq)) {
   1129		bfa_comp_process(&bfad->bfa, &doneq);
   1130
   1131		spin_lock_irqsave(&bfad->bfad_lock, flags);
   1132		bfa_comp_free(&bfad->bfa, &doneq);
   1133		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1134	}
   1135
   1136	return IRQ_HANDLED;
   1137}
   1138
   1139/*
   1140 * Initialize the MSIX entry table.
   1141 */
   1142static void
   1143bfad_init_msix_entry(struct bfad_s *bfad, struct msix_entry *msix_entries,
   1144			 int mask, int max_bit)
   1145{
   1146	int	i;
   1147	int	match = 0x00000001;
   1148
   1149	for (i = 0, bfad->nvec = 0; i < MAX_MSIX_ENTRY; i++) {
   1150		if (mask & match) {
   1151			bfad->msix_tab[bfad->nvec].msix.entry = i;
   1152			bfad->msix_tab[bfad->nvec].bfad = bfad;
   1153			msix_entries[bfad->nvec].entry = i;
   1154			bfad->nvec++;
   1155		}
   1156
   1157		match <<= 1;
   1158	}
   1159
   1160}
   1161
   1162int
   1163bfad_install_msix_handler(struct bfad_s *bfad)
   1164{
   1165	int i, error = 0;
   1166
   1167	for (i = 0; i < bfad->nvec; i++) {
   1168		sprintf(bfad->msix_tab[i].name, "bfa-%s-%s",
   1169				bfad->pci_name,
   1170				((bfa_asic_id_cb(bfad->hal_pcidev.device_id)) ?
   1171				msix_name_cb[i] : msix_name_ct[i]));
   1172
   1173		error = request_irq(bfad->msix_tab[i].msix.vector,
   1174				    (irq_handler_t) bfad_msix, 0,
   1175				    bfad->msix_tab[i].name, &bfad->msix_tab[i]);
   1176		bfa_trc(bfad, i);
   1177		bfa_trc(bfad, bfad->msix_tab[i].msix.vector);
   1178		if (error) {
   1179			int	j;
   1180
   1181			for (j = 0; j < i; j++)
   1182				free_irq(bfad->msix_tab[j].msix.vector,
   1183						&bfad->msix_tab[j]);
   1184
   1185			bfad->bfad_flags &= ~BFAD_MSIX_ON;
   1186			pci_disable_msix(bfad->pcidev);
   1187
   1188			return 1;
   1189		}
   1190	}
   1191
   1192	return 0;
   1193}
   1194
   1195/*
   1196 * Setup MSIX based interrupt.
   1197 */
   1198int
   1199bfad_setup_intr(struct bfad_s *bfad)
   1200{
   1201	int error;
   1202	u32 mask = 0, i, num_bit = 0, max_bit = 0;
   1203	struct msix_entry msix_entries[MAX_MSIX_ENTRY];
   1204	struct pci_dev *pdev = bfad->pcidev;
   1205	u16	reg;
   1206
   1207	/* Call BFA to get the msix map for this PCI function.  */
   1208	bfa_msix_getvecs(&bfad->bfa, &mask, &num_bit, &max_bit);
   1209
   1210	/* Set up the msix entry table */
   1211	bfad_init_msix_entry(bfad, msix_entries, mask, max_bit);
   1212
   1213	if ((bfa_asic_id_ctc(pdev->device) && !msix_disable_ct) ||
   1214	   (bfa_asic_id_cb(pdev->device) && !msix_disable_cb)) {
   1215
   1216		error = pci_enable_msix_exact(bfad->pcidev,
   1217					      msix_entries, bfad->nvec);
   1218		/* In CT1 & CT2, try to allocate just one vector */
   1219		if (error == -ENOSPC && bfa_asic_id_ctc(pdev->device)) {
   1220			printk(KERN_WARNING "bfa %s: trying one msix "
   1221			       "vector failed to allocate %d[%d]\n",
   1222			       bfad->pci_name, bfad->nvec, error);
   1223			bfad->nvec = 1;
   1224			error = pci_enable_msix_exact(bfad->pcidev,
   1225						      msix_entries, 1);
   1226		}
   1227
   1228		if (error) {
   1229			printk(KERN_WARNING "bfad%d: "
   1230			       "pci_enable_msix_exact failed (%d), "
   1231			       "use line based.\n",
   1232				bfad->inst_no, error);
   1233			goto line_based;
   1234		}
   1235
   1236		/* Disable INTX in MSI-X mode */
   1237		pci_read_config_word(pdev, PCI_COMMAND, &reg);
   1238
   1239		if (!(reg & PCI_COMMAND_INTX_DISABLE))
   1240			pci_write_config_word(pdev, PCI_COMMAND,
   1241				reg | PCI_COMMAND_INTX_DISABLE);
   1242
   1243		/* Save the vectors */
   1244		for (i = 0; i < bfad->nvec; i++) {
   1245			bfa_trc(bfad, msix_entries[i].vector);
   1246			bfad->msix_tab[i].msix.vector = msix_entries[i].vector;
   1247		}
   1248
   1249		bfa_msix_init(&bfad->bfa, bfad->nvec);
   1250
   1251		bfad->bfad_flags |= BFAD_MSIX_ON;
   1252
   1253		return 0;
   1254	}
   1255
   1256line_based:
   1257	error = request_irq(bfad->pcidev->irq, (irq_handler_t)bfad_intx,
   1258			    BFAD_IRQ_FLAGS, BFAD_DRIVER_NAME, bfad);
   1259	if (error)
   1260		return error;
   1261
   1262	bfad->bfad_flags |= BFAD_INTX_ON;
   1263
   1264	return 0;
   1265}
   1266
   1267void
   1268bfad_remove_intr(struct bfad_s *bfad)
   1269{
   1270	int	i;
   1271
   1272	if (bfad->bfad_flags & BFAD_MSIX_ON) {
   1273		for (i = 0; i < bfad->nvec; i++)
   1274			free_irq(bfad->msix_tab[i].msix.vector,
   1275					&bfad->msix_tab[i]);
   1276
   1277		pci_disable_msix(bfad->pcidev);
   1278		bfad->bfad_flags &= ~BFAD_MSIX_ON;
   1279	} else if (bfad->bfad_flags & BFAD_INTX_ON) {
   1280		free_irq(bfad->pcidev->irq, bfad);
   1281	}
   1282}
   1283
   1284/*
   1285 * PCI probe entry.
   1286 */
   1287int
   1288bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid)
   1289{
   1290	struct bfad_s	*bfad;
   1291	int		error = -ENODEV, retval, i;
   1292
   1293	/* For single port cards - only claim function 0 */
   1294	if ((pdev->device == BFA_PCI_DEVICE_ID_FC_8G1P) &&
   1295		(PCI_FUNC(pdev->devfn) != 0))
   1296		return -ENODEV;
   1297
   1298	bfad = kzalloc(sizeof(struct bfad_s), GFP_KERNEL);
   1299	if (!bfad) {
   1300		error = -ENOMEM;
   1301		goto out;
   1302	}
   1303
   1304	bfad->trcmod = kzalloc(sizeof(struct bfa_trc_mod_s), GFP_KERNEL);
   1305	if (!bfad->trcmod) {
   1306		printk(KERN_WARNING "Error alloc trace buffer!\n");
   1307		error = -ENOMEM;
   1308		goto out_alloc_trace_failure;
   1309	}
   1310
   1311	/* TRACE INIT */
   1312	bfa_trc_init(bfad->trcmod);
   1313	bfa_trc(bfad, bfad_inst);
   1314
   1315	/* AEN INIT */
   1316	INIT_LIST_HEAD(&bfad->free_aen_q);
   1317	INIT_LIST_HEAD(&bfad->active_aen_q);
   1318	for (i = 0; i < BFA_AEN_MAX_ENTRY; i++)
   1319		list_add_tail(&bfad->aen_list[i].qe, &bfad->free_aen_q);
   1320
   1321	if (!(bfad_load_fwimg(pdev))) {
   1322		kfree(bfad->trcmod);
   1323		goto out_alloc_trace_failure;
   1324	}
   1325
   1326	retval = bfad_pci_init(pdev, bfad);
   1327	if (retval) {
   1328		printk(KERN_WARNING "bfad_pci_init failure!\n");
   1329		error = retval;
   1330		goto out_pci_init_failure;
   1331	}
   1332
   1333	mutex_lock(&bfad_mutex);
   1334	bfad->inst_no = bfad_inst++;
   1335	list_add_tail(&bfad->list_entry, &bfad_list);
   1336	mutex_unlock(&bfad_mutex);
   1337
   1338	/* Initializing the state machine: State set to uninit */
   1339	bfa_sm_set_state(bfad, bfad_sm_uninit);
   1340
   1341	spin_lock_init(&bfad->bfad_lock);
   1342	spin_lock_init(&bfad->bfad_aen_spinlock);
   1343
   1344	pci_set_drvdata(pdev, bfad);
   1345
   1346	bfad->ref_count = 0;
   1347	bfad->pport.bfad = bfad;
   1348	INIT_LIST_HEAD(&bfad->pbc_vport_list);
   1349	INIT_LIST_HEAD(&bfad->vport_list);
   1350
   1351	/* Setup the debugfs node for this bfad */
   1352	if (bfa_debugfs_enable)
   1353		bfad_debugfs_init(&bfad->pport);
   1354
   1355	retval = bfad_drv_init(bfad);
   1356	if (retval != BFA_STATUS_OK)
   1357		goto out_drv_init_failure;
   1358
   1359	bfa_sm_send_event(bfad, BFAD_E_CREATE);
   1360
   1361	if (bfa_sm_cmp_state(bfad, bfad_sm_uninit))
   1362		goto out_bfad_sm_failure;
   1363
   1364	return 0;
   1365
   1366out_bfad_sm_failure:
   1367	bfad_hal_mem_release(bfad);
   1368out_drv_init_failure:
   1369	/* Remove the debugfs node for this bfad */
   1370	kfree(bfad->regdata);
   1371	bfad_debugfs_exit(&bfad->pport);
   1372	mutex_lock(&bfad_mutex);
   1373	bfad_inst--;
   1374	list_del(&bfad->list_entry);
   1375	mutex_unlock(&bfad_mutex);
   1376	bfad_pci_uninit(pdev, bfad);
   1377out_pci_init_failure:
   1378	kfree(bfad->trcmod);
   1379out_alloc_trace_failure:
   1380	kfree(bfad);
   1381out:
   1382	return error;
   1383}
   1384
   1385/*
   1386 * PCI remove entry.
   1387 */
   1388void
   1389bfad_pci_remove(struct pci_dev *pdev)
   1390{
   1391	struct bfad_s	      *bfad = pci_get_drvdata(pdev);
   1392	unsigned long	flags;
   1393
   1394	bfa_trc(bfad, bfad->inst_no);
   1395
   1396	spin_lock_irqsave(&bfad->bfad_lock, flags);
   1397	if (bfad->bfad_tsk != NULL) {
   1398		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1399		kthread_stop(bfad->bfad_tsk);
   1400	} else {
   1401		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1402	}
   1403
   1404	/* Send Event BFAD_E_STOP */
   1405	bfa_sm_send_event(bfad, BFAD_E_STOP);
   1406
   1407	/* Driver detach and dealloc mem */
   1408	spin_lock_irqsave(&bfad->bfad_lock, flags);
   1409	bfa_detach(&bfad->bfa);
   1410	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1411	bfad_hal_mem_release(bfad);
   1412
   1413	/* Remove the debugfs node for this bfad */
   1414	kfree(bfad->regdata);
   1415	bfad_debugfs_exit(&bfad->pport);
   1416
   1417	/* Cleaning the BFAD instance */
   1418	mutex_lock(&bfad_mutex);
   1419	bfad_inst--;
   1420	list_del(&bfad->list_entry);
   1421	mutex_unlock(&bfad_mutex);
   1422	bfad_pci_uninit(pdev, bfad);
   1423
   1424	kfree(bfad->trcmod);
   1425	kfree(bfad);
   1426}
   1427
   1428/*
   1429 * PCI Error Recovery entry, error detected.
   1430 */
   1431static pci_ers_result_t
   1432bfad_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
   1433{
   1434	struct bfad_s *bfad = pci_get_drvdata(pdev);
   1435	unsigned long	flags;
   1436	pci_ers_result_t ret = PCI_ERS_RESULT_NONE;
   1437
   1438	dev_printk(KERN_ERR, &pdev->dev,
   1439		   "error detected state: %d - flags: 0x%x\n",
   1440		   state, bfad->bfad_flags);
   1441
   1442	switch (state) {
   1443	case pci_channel_io_normal: /* non-fatal error */
   1444		spin_lock_irqsave(&bfad->bfad_lock, flags);
   1445		bfad->bfad_flags &= ~BFAD_EEH_BUSY;
   1446		/* Suspend/fail all bfa operations */
   1447		bfa_ioc_suspend(&bfad->bfa.ioc);
   1448		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1449		del_timer_sync(&bfad->hal_tmo);
   1450		ret = PCI_ERS_RESULT_CAN_RECOVER;
   1451		break;
   1452	case pci_channel_io_frozen: /* fatal error */
   1453		init_completion(&bfad->comp);
   1454		spin_lock_irqsave(&bfad->bfad_lock, flags);
   1455		bfad->bfad_flags |= BFAD_EEH_BUSY;
   1456		/* Suspend/fail all bfa operations */
   1457		bfa_ioc_suspend(&bfad->bfa.ioc);
   1458		bfa_fcs_stop(&bfad->bfa_fcs);
   1459		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1460		wait_for_completion(&bfad->comp);
   1461
   1462		bfad_remove_intr(bfad);
   1463		del_timer_sync(&bfad->hal_tmo);
   1464		pci_disable_device(pdev);
   1465		ret = PCI_ERS_RESULT_NEED_RESET;
   1466		break;
   1467	case pci_channel_io_perm_failure: /* PCI Card is DEAD */
   1468		spin_lock_irqsave(&bfad->bfad_lock, flags);
   1469		bfad->bfad_flags |= BFAD_EEH_BUSY |
   1470				    BFAD_EEH_PCI_CHANNEL_IO_PERM_FAILURE;
   1471		spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1472
   1473		/* If the error_detected handler is called with the reason
   1474		 * pci_channel_io_perm_failure - it will subsequently call
   1475		 * pci_remove() entry point to remove the pci device from the
   1476		 * system - So defer the cleanup to pci_remove(); cleaning up
   1477		 * here causes inconsistent state during pci_remove().
   1478		 */
   1479		ret = PCI_ERS_RESULT_DISCONNECT;
   1480		break;
   1481	default:
   1482		WARN_ON(1);
   1483	}
   1484
   1485	return ret;
   1486}
   1487
   1488static int restart_bfa(struct bfad_s *bfad)
   1489{
   1490	unsigned long flags;
   1491	struct pci_dev *pdev = bfad->pcidev;
   1492
   1493	bfa_attach(&bfad->bfa, bfad, &bfad->ioc_cfg,
   1494		   &bfad->meminfo, &bfad->hal_pcidev);
   1495
   1496	/* Enable Interrupt and wait bfa_init completion */
   1497	if (bfad_setup_intr(bfad)) {
   1498		dev_printk(KERN_WARNING, &pdev->dev,
   1499			   "%s: bfad_setup_intr failed\n", bfad->pci_name);
   1500		bfa_sm_send_event(bfad, BFAD_E_INIT_FAILED);
   1501		return -1;
   1502	}
   1503
   1504	init_completion(&bfad->comp);
   1505	spin_lock_irqsave(&bfad->bfad_lock, flags);
   1506	bfa_iocfc_init(&bfad->bfa);
   1507	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1508
   1509	/* Set up interrupt handler for each vectors */
   1510	if ((bfad->bfad_flags & BFAD_MSIX_ON) &&
   1511	    bfad_install_msix_handler(bfad))
   1512		dev_printk(KERN_WARNING, &pdev->dev,
   1513			   "%s: install_msix failed.\n", bfad->pci_name);
   1514
   1515	bfad_init_timer(bfad);
   1516	wait_for_completion(&bfad->comp);
   1517	bfad_drv_start(bfad);
   1518
   1519	return 0;
   1520}
   1521
   1522/*
   1523 * PCI Error Recovery entry, re-initialize the chip.
   1524 */
   1525static pci_ers_result_t
   1526bfad_pci_slot_reset(struct pci_dev *pdev)
   1527{
   1528	struct bfad_s *bfad = pci_get_drvdata(pdev);
   1529	u8 byte;
   1530	int rc;
   1531
   1532	dev_printk(KERN_ERR, &pdev->dev,
   1533		   "bfad_pci_slot_reset flags: 0x%x\n", bfad->bfad_flags);
   1534
   1535	if (pci_enable_device(pdev)) {
   1536		dev_printk(KERN_ERR, &pdev->dev, "Cannot re-enable "
   1537			   "PCI device after reset.\n");
   1538		return PCI_ERS_RESULT_DISCONNECT;
   1539	}
   1540
   1541	pci_restore_state(pdev);
   1542
   1543	/*
   1544	 * Read some byte (e.g. DMA max. payload size which can't
   1545	 * be 0xff any time) to make sure - we did not hit another PCI error
   1546	 * in the middle of recovery. If we did, then declare permanent failure.
   1547	 */
   1548	pci_read_config_byte(pdev, 0x68, &byte);
   1549	if (byte == 0xff) {
   1550		dev_printk(KERN_ERR, &pdev->dev,
   1551			   "slot_reset failed ... got another PCI error !\n");
   1552		goto out_disable_device;
   1553	}
   1554
   1555	pci_save_state(pdev);
   1556	pci_set_master(pdev);
   1557
   1558	rc = dma_set_mask_and_coherent(&bfad->pcidev->dev, DMA_BIT_MASK(64));
   1559	if (rc)
   1560		goto out_disable_device;
   1561
   1562	if (restart_bfa(bfad) == -1)
   1563		goto out_disable_device;
   1564
   1565	pci_enable_pcie_error_reporting(pdev);
   1566	dev_printk(KERN_WARNING, &pdev->dev,
   1567		   "slot_reset completed  flags: 0x%x!\n", bfad->bfad_flags);
   1568
   1569	return PCI_ERS_RESULT_RECOVERED;
   1570
   1571out_disable_device:
   1572	pci_disable_device(pdev);
   1573	return PCI_ERS_RESULT_DISCONNECT;
   1574}
   1575
   1576static pci_ers_result_t
   1577bfad_pci_mmio_enabled(struct pci_dev *pdev)
   1578{
   1579	unsigned long	flags;
   1580	struct bfad_s *bfad = pci_get_drvdata(pdev);
   1581
   1582	dev_printk(KERN_INFO, &pdev->dev, "mmio_enabled\n");
   1583
   1584	/* Fetch FW diagnostic information */
   1585	bfa_ioc_debug_save_ftrc(&bfad->bfa.ioc);
   1586
   1587	/* Cancel all pending IOs */
   1588	spin_lock_irqsave(&bfad->bfad_lock, flags);
   1589	init_completion(&bfad->comp);
   1590	bfa_fcs_stop(&bfad->bfa_fcs);
   1591	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1592	wait_for_completion(&bfad->comp);
   1593
   1594	bfad_remove_intr(bfad);
   1595	del_timer_sync(&bfad->hal_tmo);
   1596	pci_disable_device(pdev);
   1597
   1598	return PCI_ERS_RESULT_NEED_RESET;
   1599}
   1600
   1601static void
   1602bfad_pci_resume(struct pci_dev *pdev)
   1603{
   1604	unsigned long	flags;
   1605	struct bfad_s *bfad = pci_get_drvdata(pdev);
   1606
   1607	dev_printk(KERN_WARNING, &pdev->dev, "resume\n");
   1608
   1609	/* wait until the link is online */
   1610	bfad_rport_online_wait(bfad);
   1611
   1612	spin_lock_irqsave(&bfad->bfad_lock, flags);
   1613	bfad->bfad_flags &= ~BFAD_EEH_BUSY;
   1614	spin_unlock_irqrestore(&bfad->bfad_lock, flags);
   1615}
   1616
   1617struct pci_device_id bfad_id_table[] = {
   1618	{
   1619		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
   1620		.device = BFA_PCI_DEVICE_ID_FC_8G2P,
   1621		.subvendor = PCI_ANY_ID,
   1622		.subdevice = PCI_ANY_ID,
   1623	},
   1624	{
   1625		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
   1626		.device = BFA_PCI_DEVICE_ID_FC_8G1P,
   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_CT,
   1633		.subvendor = PCI_ANY_ID,
   1634		.subdevice = PCI_ANY_ID,
   1635		.class = (PCI_CLASS_SERIAL_FIBER << 8),
   1636		.class_mask = ~0,
   1637	},
   1638	{
   1639		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
   1640		.device = BFA_PCI_DEVICE_ID_CT_FC,
   1641		.subvendor = PCI_ANY_ID,
   1642		.subdevice = PCI_ANY_ID,
   1643		.class = (PCI_CLASS_SERIAL_FIBER << 8),
   1644		.class_mask = ~0,
   1645	},
   1646	{
   1647		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
   1648		.device = BFA_PCI_DEVICE_ID_CT2,
   1649		.subvendor = PCI_ANY_ID,
   1650		.subdevice = PCI_ANY_ID,
   1651		.class = (PCI_CLASS_SERIAL_FIBER << 8),
   1652		.class_mask = ~0,
   1653	},
   1654
   1655	{
   1656		.vendor = BFA_PCI_VENDOR_ID_BROCADE,
   1657		.device = BFA_PCI_DEVICE_ID_CT2_QUAD,
   1658		.subvendor = PCI_ANY_ID,
   1659		.subdevice = PCI_ANY_ID,
   1660		.class = (PCI_CLASS_SERIAL_FIBER << 8),
   1661		.class_mask = ~0,
   1662	},
   1663	{0, 0},
   1664};
   1665
   1666MODULE_DEVICE_TABLE(pci, bfad_id_table);
   1667
   1668/*
   1669 * PCI error recovery handlers.
   1670 */
   1671static struct pci_error_handlers bfad_err_handler = {
   1672	.error_detected = bfad_pci_error_detected,
   1673	.slot_reset = bfad_pci_slot_reset,
   1674	.mmio_enabled = bfad_pci_mmio_enabled,
   1675	.resume = bfad_pci_resume,
   1676};
   1677
   1678static struct pci_driver bfad_pci_driver = {
   1679	.name = BFAD_DRIVER_NAME,
   1680	.id_table = bfad_id_table,
   1681	.probe = bfad_pci_probe,
   1682	.remove = bfad_pci_remove,
   1683	.err_handler = &bfad_err_handler,
   1684};
   1685
   1686/*
   1687 * Driver module init.
   1688 */
   1689static int __init
   1690bfad_init(void)
   1691{
   1692	int		error = 0;
   1693
   1694	pr_info("QLogic BR-series BFA FC/FCOE SCSI driver - version: %s\n",
   1695			BFAD_DRIVER_VERSION);
   1696
   1697	if (num_sgpgs > 0)
   1698		num_sgpgs_parm = num_sgpgs;
   1699
   1700	error = bfad_im_module_init();
   1701	if (error) {
   1702		error = -ENOMEM;
   1703		printk(KERN_WARNING "bfad_im_module_init failure\n");
   1704		goto ext;
   1705	}
   1706
   1707	if (strcmp(FCPI_NAME, " fcpim") == 0)
   1708		supported_fc4s |= BFA_LPORT_ROLE_FCP_IM;
   1709
   1710	bfa_auto_recover = ioc_auto_recover;
   1711	bfa_fcs_rport_set_del_timeout(rport_del_timeout);
   1712	bfa_fcs_rport_set_max_logins(max_rport_logins);
   1713
   1714	error = pci_register_driver(&bfad_pci_driver);
   1715	if (error) {
   1716		printk(KERN_WARNING "pci_register_driver failure\n");
   1717		goto ext;
   1718	}
   1719
   1720	return 0;
   1721
   1722ext:
   1723	bfad_im_module_exit();
   1724	return error;
   1725}
   1726
   1727/*
   1728 * Driver module exit.
   1729 */
   1730static void __exit
   1731bfad_exit(void)
   1732{
   1733	pci_unregister_driver(&bfad_pci_driver);
   1734	bfad_im_module_exit();
   1735	bfad_free_fwimg();
   1736}
   1737
   1738/* Firmware handling */
   1739static void
   1740bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image,
   1741		u32 *bfi_image_size, char *fw_name)
   1742{
   1743	const struct firmware *fw;
   1744
   1745	if (request_firmware(&fw, fw_name, &pdev->dev)) {
   1746		printk(KERN_ALERT "Can't locate firmware %s\n", fw_name);
   1747		*bfi_image = NULL;
   1748		goto out;
   1749	}
   1750
   1751	*bfi_image = vmalloc(fw->size);
   1752	if (NULL == *bfi_image) {
   1753		printk(KERN_ALERT "Fail to allocate buffer for fw image "
   1754			"size=%x!\n", (u32) fw->size);
   1755		goto out;
   1756	}
   1757
   1758	memcpy(*bfi_image, fw->data, fw->size);
   1759	*bfi_image_size = fw->size/sizeof(u32);
   1760out:
   1761	release_firmware(fw);
   1762}
   1763
   1764static u32 *
   1765bfad_load_fwimg(struct pci_dev *pdev)
   1766{
   1767	if (bfa_asic_id_ct2(pdev->device)) {
   1768		if (bfi_image_ct2_size == 0)
   1769			bfad_read_firmware(pdev, &bfi_image_ct2,
   1770				&bfi_image_ct2_size, BFAD_FW_FILE_CT2);
   1771		return bfi_image_ct2;
   1772	} else if (bfa_asic_id_ct(pdev->device)) {
   1773		if (bfi_image_ct_size == 0)
   1774			bfad_read_firmware(pdev, &bfi_image_ct,
   1775				&bfi_image_ct_size, BFAD_FW_FILE_CT);
   1776		return bfi_image_ct;
   1777	} else if (bfa_asic_id_cb(pdev->device)) {
   1778		if (bfi_image_cb_size == 0)
   1779			bfad_read_firmware(pdev, &bfi_image_cb,
   1780				&bfi_image_cb_size, BFAD_FW_FILE_CB);
   1781		return bfi_image_cb;
   1782	}
   1783
   1784	return NULL;
   1785}
   1786
   1787static void
   1788bfad_free_fwimg(void)
   1789{
   1790	if (bfi_image_ct2_size && bfi_image_ct2)
   1791		vfree(bfi_image_ct2);
   1792	if (bfi_image_ct_size && bfi_image_ct)
   1793		vfree(bfi_image_ct);
   1794	if (bfi_image_cb_size && bfi_image_cb)
   1795		vfree(bfi_image_cb);
   1796}
   1797
   1798module_init(bfad_init);
   1799module_exit(bfad_exit);
   1800MODULE_LICENSE("GPL");
   1801MODULE_DESCRIPTION("QLogic BR-series Fibre Channel HBA Driver" BFAD_PROTO_NAME);
   1802MODULE_AUTHOR("QLogic Corporation");
   1803MODULE_VERSION(BFAD_DRIVER_VERSION);