Linux Audio

Check our new training course

Yocto distribution development and maintenance

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