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