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