linux/drivers/scsi/qla2xxx/qla_init.c
<<
>>
Prefs
   1/*
   2 * QLogic Fibre Channel HBA Driver
   3 * Copyright (c)  2003-2005 QLogic Corporation
   4 *
   5 * See LICENSE.qla2xxx for copyright and licensing details.
   6 */
   7#include "qla_def.h"
   8
   9#include <linux/delay.h>
  10#include <linux/vmalloc.h>
  11
  12#include "qla_devtbl.h"
  13
  14#ifdef CONFIG_SPARC
  15#include <asm/prom.h>
  16#endif
  17
  18/* XXX(hch): this is ugly, but we don't want to pull in exioctl.h */
  19#ifndef EXT_IS_LUN_BIT_SET
  20#define EXT_IS_LUN_BIT_SET(P,L) \
  21    (((P)->mask[L/8] & (0x80 >> (L%8)))?1:0)
  22#define EXT_SET_LUN_BIT(P,L) \
  23    ((P)->mask[L/8] |= (0x80 >> (L%8)))
  24#endif
  25
  26/*
  27*  QLogic ISP2x00 Hardware Support Function Prototypes.
  28*/
  29static int qla2x00_isp_firmware(scsi_qla_host_t *);
  30static void qla2x00_resize_request_q(scsi_qla_host_t *);
  31static int qla2x00_setup_chip(scsi_qla_host_t *);
  32static void qla2x00_init_response_q_entries(scsi_qla_host_t *);
  33static int qla2x00_init_rings(scsi_qla_host_t *);
  34static int qla2x00_fw_ready(scsi_qla_host_t *);
  35static int qla2x00_configure_hba(scsi_qla_host_t *);
  36static int qla2x00_configure_loop(scsi_qla_host_t *);
  37static int qla2x00_configure_local_loop(scsi_qla_host_t *);
  38static int qla2x00_configure_fabric(scsi_qla_host_t *);
  39static int qla2x00_find_all_fabric_devs(scsi_qla_host_t *, struct list_head *);
  40static int qla2x00_device_resync(scsi_qla_host_t *);
  41static int qla2x00_fabric_dev_login(scsi_qla_host_t *, fc_port_t *,
  42    uint16_t *);
  43
  44static int qla2x00_restart_isp(scsi_qla_host_t *);
  45
  46static int qla2x00_find_new_loop_id(scsi_qla_host_t *ha, fc_port_t *dev);
  47
  48/****************************************************************************/
  49/*                QLogic ISP2x00 Hardware Support Functions.                */
  50/****************************************************************************/
  51
  52/*
  53* qla2x00_initialize_adapter
  54*      Initialize board.
  55*
  56* Input:
  57*      ha = adapter block pointer.
  58*
  59* Returns:
  60*      0 = success
  61*/
  62int
  63qla2x00_initialize_adapter(scsi_qla_host_t *ha)
  64{
  65        int     rval;
  66
  67        /* Clear adapter flags. */
  68        ha->flags.online = 0;
  69        ha->flags.reset_active = 0;
  70        atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
  71        atomic_set(&ha->loop_state, LOOP_DOWN);
  72        ha->device_flags = DFLG_NO_CABLE;
  73        ha->dpc_flags = 0;
  74        ha->flags.management_server_logged_in = 0;
  75        ha->marker_needed = 0;
  76        ha->mbx_flags = 0;
  77        ha->isp_abort_cnt = 0;
  78        ha->beacon_blink_led = 0;
  79        set_bit(REGISTER_FDMI_NEEDED, &ha->dpc_flags);
  80
  81        qla_printk(KERN_INFO, ha, "Configuring PCI space...\n");
  82        rval = ha->isp_ops->pci_config(ha);
  83        if (rval) {
  84                DEBUG2(printk("scsi(%ld): Unable to configure PCI space.\n",
  85                    ha->host_no));
  86                return (rval);
  87        }
  88
  89        ha->isp_ops->reset_chip(ha);
  90
  91        ha->isp_ops->get_flash_version(ha, ha->request_ring);
  92
  93        qla_printk(KERN_INFO, ha, "Configure NVRAM parameters...\n");
  94
  95        ha->isp_ops->nvram_config(ha);
  96
  97        if (ha->flags.disable_serdes) {
  98                /* Mask HBA via NVRAM settings? */
  99                qla_printk(KERN_INFO, ha, "Masking HBA WWPN "
 100                    "%02x%02x%02x%02x%02x%02x%02x%02x (via NVRAM).\n",
 101                    ha->port_name[0], ha->port_name[1],
 102                    ha->port_name[2], ha->port_name[3],
 103                    ha->port_name[4], ha->port_name[5],
 104                    ha->port_name[6], ha->port_name[7]);
 105                return QLA_FUNCTION_FAILED;
 106        }
 107
 108        qla_printk(KERN_INFO, ha, "Verifying loaded RISC code...\n");
 109
 110        if (qla2x00_isp_firmware(ha) != QLA_SUCCESS) {
 111                rval = ha->isp_ops->chip_diag(ha);
 112                if (rval)
 113                        return (rval);
 114                rval = qla2x00_setup_chip(ha);
 115                if (rval)
 116                        return (rval);
 117        }
 118        rval = qla2x00_init_rings(ha);
 119
 120        return (rval);
 121}
 122
 123/**
 124 * qla2100_pci_config() - Setup ISP21xx PCI configuration registers.
 125 * @ha: HA context
 126 *
 127 * Returns 0 on success.
 128 */
 129int
 130qla2100_pci_config(scsi_qla_host_t *ha)
 131{
 132        uint16_t w;
 133        uint32_t d;
 134        unsigned long flags;
 135        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
 136
 137        pci_set_master(ha->pdev);
 138        pci_try_set_mwi(ha->pdev);
 139
 140        pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
 141        w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
 142        pci_write_config_word(ha->pdev, PCI_COMMAND, w);
 143
 144        /* Reset expansion ROM address decode enable */
 145        pci_read_config_dword(ha->pdev, PCI_ROM_ADDRESS, &d);
 146        d &= ~PCI_ROM_ADDRESS_ENABLE;
 147        pci_write_config_dword(ha->pdev, PCI_ROM_ADDRESS, d);
 148
 149        /* Get PCI bus information. */
 150        spin_lock_irqsave(&ha->hardware_lock, flags);
 151        ha->pci_attr = RD_REG_WORD(&reg->ctrl_status);
 152        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 153
 154        return QLA_SUCCESS;
 155}
 156
 157/**
 158 * qla2300_pci_config() - Setup ISP23xx PCI configuration registers.
 159 * @ha: HA context
 160 *
 161 * Returns 0 on success.
 162 */
 163int
 164qla2300_pci_config(scsi_qla_host_t *ha)
 165{
 166        uint16_t        w;
 167        uint32_t        d;
 168        unsigned long   flags = 0;
 169        uint32_t        cnt;
 170        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
 171
 172        pci_set_master(ha->pdev);
 173        pci_try_set_mwi(ha->pdev);
 174
 175        pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
 176        w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
 177
 178        if (IS_QLA2322(ha) || IS_QLA6322(ha))
 179                w &= ~PCI_COMMAND_INTX_DISABLE;
 180        pci_write_config_word(ha->pdev, PCI_COMMAND, w);
 181
 182        /*
 183         * If this is a 2300 card and not 2312, reset the
 184         * COMMAND_INVALIDATE due to a bug in the 2300. Unfortunately,
 185         * the 2310 also reports itself as a 2300 so we need to get the
 186         * fb revision level -- a 6 indicates it really is a 2300 and
 187         * not a 2310.
 188         */
 189        if (IS_QLA2300(ha)) {
 190                spin_lock_irqsave(&ha->hardware_lock, flags);
 191
 192                /* Pause RISC. */
 193                WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
 194                for (cnt = 0; cnt < 30000; cnt++) {
 195                        if ((RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) != 0)
 196                                break;
 197
 198                        udelay(10);
 199                }
 200
 201                /* Select FPM registers. */
 202                WRT_REG_WORD(&reg->ctrl_status, 0x20);
 203                RD_REG_WORD(&reg->ctrl_status);
 204
 205                /* Get the fb rev level */
 206                ha->fb_rev = RD_FB_CMD_REG(ha, reg);
 207
 208                if (ha->fb_rev == FPM_2300)
 209                        pci_clear_mwi(ha->pdev);
 210
 211                /* Deselect FPM registers. */
 212                WRT_REG_WORD(&reg->ctrl_status, 0x0);
 213                RD_REG_WORD(&reg->ctrl_status);
 214
 215                /* Release RISC module. */
 216                WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
 217                for (cnt = 0; cnt < 30000; cnt++) {
 218                        if ((RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0)
 219                                break;
 220
 221                        udelay(10);
 222                }
 223
 224                spin_unlock_irqrestore(&ha->hardware_lock, flags);
 225        }
 226
 227        pci_write_config_byte(ha->pdev, PCI_LATENCY_TIMER, 0x80);
 228
 229        /* Reset expansion ROM address decode enable */
 230        pci_read_config_dword(ha->pdev, PCI_ROM_ADDRESS, &d);
 231        d &= ~PCI_ROM_ADDRESS_ENABLE;
 232        pci_write_config_dword(ha->pdev, PCI_ROM_ADDRESS, d);
 233
 234        /* Get PCI bus information. */
 235        spin_lock_irqsave(&ha->hardware_lock, flags);
 236        ha->pci_attr = RD_REG_WORD(&reg->ctrl_status);
 237        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 238
 239        return QLA_SUCCESS;
 240}
 241
 242/**
 243 * qla24xx_pci_config() - Setup ISP24xx PCI configuration registers.
 244 * @ha: HA context
 245 *
 246 * Returns 0 on success.
 247 */
 248int
 249qla24xx_pci_config(scsi_qla_host_t *ha)
 250{
 251        uint16_t w;
 252        uint32_t d;
 253        unsigned long flags = 0;
 254        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
 255
 256        pci_set_master(ha->pdev);
 257        pci_try_set_mwi(ha->pdev);
 258
 259        pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
 260        w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
 261        w &= ~PCI_COMMAND_INTX_DISABLE;
 262        pci_write_config_word(ha->pdev, PCI_COMMAND, w);
 263
 264        pci_write_config_byte(ha->pdev, PCI_LATENCY_TIMER, 0x80);
 265
 266        /* PCI-X -- adjust Maximum Memory Read Byte Count (2048). */
 267        if (pci_find_capability(ha->pdev, PCI_CAP_ID_PCIX))
 268                pcix_set_mmrbc(ha->pdev, 2048);
 269
 270        /* PCIe -- adjust Maximum Read Request Size (2048). */
 271        if (pci_find_capability(ha->pdev, PCI_CAP_ID_EXP))
 272                pcie_set_readrq(ha->pdev, 2048);
 273
 274        /* Reset expansion ROM address decode enable */
 275        pci_read_config_dword(ha->pdev, PCI_ROM_ADDRESS, &d);
 276        d &= ~PCI_ROM_ADDRESS_ENABLE;
 277        pci_write_config_dword(ha->pdev, PCI_ROM_ADDRESS, d);
 278
 279        ha->chip_revision = ha->pdev->revision;
 280
 281        /* Get PCI bus information. */
 282        spin_lock_irqsave(&ha->hardware_lock, flags);
 283        ha->pci_attr = RD_REG_DWORD(&reg->ctrl_status);
 284        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 285
 286        return QLA_SUCCESS;
 287}
 288
 289/**
 290 * qla25xx_pci_config() - Setup ISP25xx PCI configuration registers.
 291 * @ha: HA context
 292 *
 293 * Returns 0 on success.
 294 */
 295int
 296qla25xx_pci_config(scsi_qla_host_t *ha)
 297{
 298        uint16_t w;
 299        uint32_t d;
 300
 301        pci_set_master(ha->pdev);
 302        pci_try_set_mwi(ha->pdev);
 303
 304        pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
 305        w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
 306        w &= ~PCI_COMMAND_INTX_DISABLE;
 307        pci_write_config_word(ha->pdev, PCI_COMMAND, w);
 308
 309        /* PCIe -- adjust Maximum Read Request Size (2048). */
 310        if (pci_find_capability(ha->pdev, PCI_CAP_ID_EXP))
 311                pcie_set_readrq(ha->pdev, 2048);
 312
 313        /* Reset expansion ROM address decode enable */
 314        pci_read_config_dword(ha->pdev, PCI_ROM_ADDRESS, &d);
 315        d &= ~PCI_ROM_ADDRESS_ENABLE;
 316        pci_write_config_dword(ha->pdev, PCI_ROM_ADDRESS, d);
 317
 318        ha->chip_revision = ha->pdev->revision;
 319
 320        return QLA_SUCCESS;
 321}
 322
 323/**
 324 * qla2x00_isp_firmware() - Choose firmware image.
 325 * @ha: HA context
 326 *
 327 * Returns 0 on success.
 328 */
 329static int
 330qla2x00_isp_firmware(scsi_qla_host_t *ha)
 331{
 332        int  rval;
 333
 334        /* Assume loading risc code */
 335        rval = QLA_FUNCTION_FAILED;
 336
 337        if (ha->flags.disable_risc_code_load) {
 338                DEBUG2(printk("scsi(%ld): RISC CODE NOT loaded\n",
 339                    ha->host_no));
 340                qla_printk(KERN_INFO, ha, "RISC CODE NOT loaded\n");
 341
 342                /* Verify checksum of loaded RISC code. */
 343                rval = qla2x00_verify_checksum(ha, ha->fw_srisc_address);
 344        }
 345
 346        if (rval) {
 347                DEBUG2_3(printk("scsi(%ld): **** Load RISC code ****\n",
 348                    ha->host_no));
 349        }
 350
 351        return (rval);
 352}
 353
 354/**
 355 * qla2x00_reset_chip() - Reset ISP chip.
 356 * @ha: HA context
 357 *
 358 * Returns 0 on success.
 359 */
 360void
 361qla2x00_reset_chip(scsi_qla_host_t *ha)
 362{
 363        unsigned long   flags = 0;
 364        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
 365        uint32_t        cnt;
 366        uint16_t        cmd;
 367
 368        ha->isp_ops->disable_intrs(ha);
 369
 370        spin_lock_irqsave(&ha->hardware_lock, flags);
 371
 372        /* Turn off master enable */
 373        cmd = 0;
 374        pci_read_config_word(ha->pdev, PCI_COMMAND, &cmd);
 375        cmd &= ~PCI_COMMAND_MASTER;
 376        pci_write_config_word(ha->pdev, PCI_COMMAND, cmd);
 377
 378        if (!IS_QLA2100(ha)) {
 379                /* Pause RISC. */
 380                WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
 381                if (IS_QLA2200(ha) || IS_QLA2300(ha)) {
 382                        for (cnt = 0; cnt < 30000; cnt++) {
 383                                if ((RD_REG_WORD(&reg->hccr) &
 384                                    HCCR_RISC_PAUSE) != 0)
 385                                        break;
 386                                udelay(100);
 387                        }
 388                } else {
 389                        RD_REG_WORD(&reg->hccr);        /* PCI Posting. */
 390                        udelay(10);
 391                }
 392
 393                /* Select FPM registers. */
 394                WRT_REG_WORD(&reg->ctrl_status, 0x20);
 395                RD_REG_WORD(&reg->ctrl_status);         /* PCI Posting. */
 396
 397                /* FPM Soft Reset. */
 398                WRT_REG_WORD(&reg->fpm_diag_config, 0x100);
 399                RD_REG_WORD(&reg->fpm_diag_config);     /* PCI Posting. */
 400
 401                /* Toggle Fpm Reset. */
 402                if (!IS_QLA2200(ha)) {
 403                        WRT_REG_WORD(&reg->fpm_diag_config, 0x0);
 404                        RD_REG_WORD(&reg->fpm_diag_config); /* PCI Posting. */
 405                }
 406
 407                /* Select frame buffer registers. */
 408                WRT_REG_WORD(&reg->ctrl_status, 0x10);
 409                RD_REG_WORD(&reg->ctrl_status);         /* PCI Posting. */
 410
 411                /* Reset frame buffer FIFOs. */
 412                if (IS_QLA2200(ha)) {
 413                        WRT_FB_CMD_REG(ha, reg, 0xa000);
 414                        RD_FB_CMD_REG(ha, reg);         /* PCI Posting. */
 415                } else {
 416                        WRT_FB_CMD_REG(ha, reg, 0x00fc);
 417
 418                        /* Read back fb_cmd until zero or 3 seconds max */
 419                        for (cnt = 0; cnt < 3000; cnt++) {
 420                                if ((RD_FB_CMD_REG(ha, reg) & 0xff) == 0)
 421                                        break;
 422                                udelay(100);
 423                        }
 424                }
 425
 426                /* Select RISC module registers. */
 427                WRT_REG_WORD(&reg->ctrl_status, 0);
 428                RD_REG_WORD(&reg->ctrl_status);         /* PCI Posting. */
 429
 430                /* Reset RISC processor. */
 431                WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
 432                RD_REG_WORD(&reg->hccr);                /* PCI Posting. */
 433
 434                /* Release RISC processor. */
 435                WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
 436                RD_REG_WORD(&reg->hccr);                /* PCI Posting. */
 437        }
 438
 439        WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
 440        WRT_REG_WORD(&reg->hccr, HCCR_CLR_HOST_INT);
 441
 442        /* Reset ISP chip. */
 443        WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
 444
 445        /* Wait for RISC to recover from reset. */
 446        if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) {
 447                /*
 448                 * It is necessary to for a delay here since the card doesn't
 449                 * respond to PCI reads during a reset. On some architectures
 450                 * this will result in an MCA.
 451                 */
 452                udelay(20);
 453                for (cnt = 30000; cnt; cnt--) {
 454                        if ((RD_REG_WORD(&reg->ctrl_status) &
 455                            CSR_ISP_SOFT_RESET) == 0)
 456                                break;
 457                        udelay(100);
 458                }
 459        } else
 460                udelay(10);
 461
 462        /* Reset RISC processor. */
 463        WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
 464
 465        WRT_REG_WORD(&reg->semaphore, 0);
 466
 467        /* Release RISC processor. */
 468        WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
 469        RD_REG_WORD(&reg->hccr);                        /* PCI Posting. */
 470
 471        if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) {
 472                for (cnt = 0; cnt < 30000; cnt++) {
 473                        if (RD_MAILBOX_REG(ha, reg, 0) != MBS_BUSY)
 474                                break;
 475
 476                        udelay(100);
 477                }
 478        } else
 479                udelay(100);
 480
 481        /* Turn on master enable */
 482        cmd |= PCI_COMMAND_MASTER;
 483        pci_write_config_word(ha->pdev, PCI_COMMAND, cmd);
 484
 485        /* Disable RISC pause on FPM parity error. */
 486        if (!IS_QLA2100(ha)) {
 487                WRT_REG_WORD(&reg->hccr, HCCR_DISABLE_PARITY_PAUSE);
 488                RD_REG_WORD(&reg->hccr);                /* PCI Posting. */
 489        }
 490
 491        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 492}
 493
 494/**
 495 * qla24xx_reset_risc() - Perform full reset of ISP24xx RISC.
 496 * @ha: HA context
 497 *
 498 * Returns 0 on success.
 499 */
 500static inline void
 501qla24xx_reset_risc(scsi_qla_host_t *ha)
 502{
 503        unsigned long flags = 0;
 504        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
 505        uint32_t cnt, d2;
 506        uint16_t wd;
 507
 508        spin_lock_irqsave(&ha->hardware_lock, flags);
 509
 510        /* Reset RISC. */
 511        WRT_REG_DWORD(&reg->ctrl_status, CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
 512        for (cnt = 0; cnt < 30000; cnt++) {
 513                if ((RD_REG_DWORD(&reg->ctrl_status) & CSRX_DMA_ACTIVE) == 0)
 514                        break;
 515
 516                udelay(10);
 517        }
 518
 519        WRT_REG_DWORD(&reg->ctrl_status,
 520            CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
 521        pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
 522
 523        udelay(100);
 524        /* Wait for firmware to complete NVRAM accesses. */
 525        d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
 526        for (cnt = 10000 ; cnt && d2; cnt--) {
 527                udelay(5);
 528                d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
 529                barrier();
 530        }
 531
 532        /* Wait for soft-reset to complete. */
 533        d2 = RD_REG_DWORD(&reg->ctrl_status);
 534        for (cnt = 6000000 ; cnt && (d2 & CSRX_ISP_SOFT_RESET); cnt--) {
 535                udelay(5);
 536                d2 = RD_REG_DWORD(&reg->ctrl_status);
 537                barrier();
 538        }
 539
 540        WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET);
 541        RD_REG_DWORD(&reg->hccr);
 542
 543        WRT_REG_DWORD(&reg->hccr, HCCRX_REL_RISC_PAUSE);
 544        RD_REG_DWORD(&reg->hccr);
 545
 546        WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_RESET);
 547        RD_REG_DWORD(&reg->hccr);
 548
 549        d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
 550        for (cnt = 6000000 ; cnt && d2; cnt--) {
 551                udelay(5);
 552                d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
 553                barrier();
 554        }
 555
 556        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 557}
 558
 559/**
 560 * qla24xx_reset_chip() - Reset ISP24xx chip.
 561 * @ha: HA context
 562 *
 563 * Returns 0 on success.
 564 */
 565void
 566qla24xx_reset_chip(scsi_qla_host_t *ha)
 567{
 568        ha->isp_ops->disable_intrs(ha);
 569
 570        /* Perform RISC reset. */
 571        qla24xx_reset_risc(ha);
 572}
 573
 574/**
 575 * qla2x00_chip_diag() - Test chip for proper operation.
 576 * @ha: HA context
 577 *
 578 * Returns 0 on success.
 579 */
 580int
 581qla2x00_chip_diag(scsi_qla_host_t *ha)
 582{
 583        int             rval;
 584        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
 585        unsigned long   flags = 0;
 586        uint16_t        data;
 587        uint32_t        cnt;
 588        uint16_t        mb[5];
 589
 590        /* Assume a failed state */
 591        rval = QLA_FUNCTION_FAILED;
 592
 593        DEBUG3(printk("scsi(%ld): Testing device at %lx.\n",
 594            ha->host_no, (u_long)&reg->flash_address));
 595
 596        spin_lock_irqsave(&ha->hardware_lock, flags);
 597
 598        /* Reset ISP chip. */
 599        WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
 600
 601        /*
 602         * We need to have a delay here since the card will not respond while
 603         * in reset causing an MCA on some architectures.
 604         */
 605        udelay(20);
 606        data = qla2x00_debounce_register(&reg->ctrl_status);
 607        for (cnt = 6000000 ; cnt && (data & CSR_ISP_SOFT_RESET); cnt--) {
 608                udelay(5);
 609                data = RD_REG_WORD(&reg->ctrl_status);
 610                barrier();
 611        }
 612
 613        if (!cnt)
 614                goto chip_diag_failed;
 615
 616        DEBUG3(printk("scsi(%ld): Reset register cleared by chip reset\n",
 617            ha->host_no));
 618
 619        /* Reset RISC processor. */
 620        WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
 621        WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
 622
 623        /* Workaround for QLA2312 PCI parity error */
 624        if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) {
 625                data = qla2x00_debounce_register(MAILBOX_REG(ha, reg, 0));
 626                for (cnt = 6000000; cnt && (data == MBS_BUSY); cnt--) {
 627                        udelay(5);
 628                        data = RD_MAILBOX_REG(ha, reg, 0);
 629                        barrier();
 630                }
 631        } else
 632                udelay(10);
 633
 634        if (!cnt)
 635                goto chip_diag_failed;
 636
 637        /* Check product ID of chip */
 638        DEBUG3(printk("scsi(%ld): Checking product ID of chip\n", ha->host_no));
 639
 640        mb[1] = RD_MAILBOX_REG(ha, reg, 1);
 641        mb[2] = RD_MAILBOX_REG(ha, reg, 2);
 642        mb[3] = RD_MAILBOX_REG(ha, reg, 3);
 643        mb[4] = qla2x00_debounce_register(MAILBOX_REG(ha, reg, 4));
 644        if (mb[1] != PROD_ID_1 || (mb[2] != PROD_ID_2 && mb[2] != PROD_ID_2a) ||
 645            mb[3] != PROD_ID_3) {
 646                qla_printk(KERN_WARNING, ha,
 647                    "Wrong product ID = 0x%x,0x%x,0x%x\n", mb[1], mb[2], mb[3]);
 648
 649                goto chip_diag_failed;
 650        }
 651        ha->product_id[0] = mb[1];
 652        ha->product_id[1] = mb[2];
 653        ha->product_id[2] = mb[3];
 654        ha->product_id[3] = mb[4];
 655
 656        /* Adjust fw RISC transfer size */
 657        if (ha->request_q_length > 1024)
 658                ha->fw_transfer_size = REQUEST_ENTRY_SIZE * 1024;
 659        else
 660                ha->fw_transfer_size = REQUEST_ENTRY_SIZE *
 661                    ha->request_q_length;
 662
 663        if (IS_QLA2200(ha) &&
 664            RD_MAILBOX_REG(ha, reg, 7) == QLA2200A_RISC_ROM_VER) {
 665                /* Limit firmware transfer size with a 2200A */
 666                DEBUG3(printk("scsi(%ld): Found QLA2200A chip.\n",
 667                    ha->host_no));
 668
 669                ha->device_type |= DT_ISP2200A;
 670                ha->fw_transfer_size = 128;
 671        }
 672
 673        /* Wrap Incoming Mailboxes Test. */
 674        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 675
 676        DEBUG3(printk("scsi(%ld): Checking mailboxes.\n", ha->host_no));
 677        rval = qla2x00_mbx_reg_test(ha);
 678        if (rval) {
 679                DEBUG(printk("scsi(%ld): Failed mailbox send register test\n",
 680                    ha->host_no));
 681                qla_printk(KERN_WARNING, ha,
 682                    "Failed mailbox send register test\n");
 683        }
 684        else {
 685                /* Flag a successful rval */
 686                rval = QLA_SUCCESS;
 687        }
 688        spin_lock_irqsave(&ha->hardware_lock, flags);
 689
 690chip_diag_failed:
 691        if (rval)
 692                DEBUG2_3(printk("scsi(%ld): Chip diagnostics **** FAILED "
 693                    "****\n", ha->host_no));
 694
 695        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 696
 697        return (rval);
 698}
 699
 700/**
 701 * qla24xx_chip_diag() - Test ISP24xx for proper operation.
 702 * @ha: HA context
 703 *
 704 * Returns 0 on success.
 705 */
 706int
 707qla24xx_chip_diag(scsi_qla_host_t *ha)
 708{
 709        int rval;
 710
 711        /* Perform RISC reset. */
 712        qla24xx_reset_risc(ha);
 713
 714        ha->fw_transfer_size = REQUEST_ENTRY_SIZE * 1024;
 715
 716        rval = qla2x00_mbx_reg_test(ha);
 717        if (rval) {
 718                DEBUG(printk("scsi(%ld): Failed mailbox send register test\n",
 719                    ha->host_no));
 720                qla_printk(KERN_WARNING, ha,
 721                    "Failed mailbox send register test\n");
 722        } else {
 723                /* Flag a successful rval */
 724                rval = QLA_SUCCESS;
 725        }
 726
 727        return rval;
 728}
 729
 730void
 731qla2x00_alloc_fw_dump(scsi_qla_host_t *ha)
 732{
 733        int rval;
 734        uint32_t dump_size, fixed_size, mem_size, req_q_size, rsp_q_size,
 735            eft_size, fce_size;
 736        dma_addr_t tc_dma;
 737        void *tc;
 738
 739        if (ha->fw_dump) {
 740                qla_printk(KERN_WARNING, ha,
 741                    "Firmware dump previously allocated.\n");
 742                return;
 743        }
 744
 745        ha->fw_dumped = 0;
 746        fixed_size = mem_size = eft_size = fce_size = 0;
 747        if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
 748                fixed_size = sizeof(struct qla2100_fw_dump);
 749        } else if (IS_QLA23XX(ha)) {
 750                fixed_size = offsetof(struct qla2300_fw_dump, data_ram);
 751                mem_size = (ha->fw_memory_size - 0x11000 + 1) *
 752                    sizeof(uint16_t);
 753        } else if (IS_FWI2_CAPABLE(ha)) {
 754                fixed_size = IS_QLA25XX(ha) ?
 755                    offsetof(struct qla25xx_fw_dump, ext_mem):
 756                    offsetof(struct qla24xx_fw_dump, ext_mem);
 757                mem_size = (ha->fw_memory_size - 0x100000 + 1) *
 758                    sizeof(uint32_t);
 759
 760                /* Allocate memory for Extended Trace Buffer. */
 761                tc = dma_alloc_coherent(&ha->pdev->dev, EFT_SIZE, &tc_dma,
 762                    GFP_KERNEL);
 763                if (!tc) {
 764                        qla_printk(KERN_WARNING, ha, "Unable to allocate "
 765                            "(%d KB) for EFT.\n", EFT_SIZE / 1024);
 766                        goto cont_alloc;
 767                }
 768
 769                memset(tc, 0, EFT_SIZE);
 770                rval = qla2x00_enable_eft_trace(ha, tc_dma, EFT_NUM_BUFFERS);
 771                if (rval) {
 772                        qla_printk(KERN_WARNING, ha, "Unable to initialize "
 773                            "EFT (%d).\n", rval);
 774                        dma_free_coherent(&ha->pdev->dev, EFT_SIZE, tc,
 775                            tc_dma);
 776                        goto cont_alloc;
 777                }
 778
 779                qla_printk(KERN_INFO, ha, "Allocated (%d KB) for EFT...\n",
 780                    EFT_SIZE / 1024);
 781
 782                eft_size = EFT_SIZE;
 783                ha->eft_dma = tc_dma;
 784                ha->eft = tc;
 785
 786                /* Allocate memory for Fibre Channel Event Buffer. */
 787                if (!IS_QLA25XX(ha))
 788                        goto cont_alloc;
 789
 790                tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma,
 791                    GFP_KERNEL);
 792                if (!tc) {
 793                        qla_printk(KERN_WARNING, ha, "Unable to allocate "
 794                            "(%d KB) for FCE.\n", FCE_SIZE / 1024);
 795                        goto cont_alloc;
 796                }
 797
 798                memset(tc, 0, FCE_SIZE);
 799                rval = qla2x00_enable_fce_trace(ha, tc_dma, FCE_NUM_BUFFERS,
 800                    ha->fce_mb, &ha->fce_bufs);
 801                if (rval) {
 802                        qla_printk(KERN_WARNING, ha, "Unable to initialize "
 803                            "FCE (%d).\n", rval);
 804                        dma_free_coherent(&ha->pdev->dev, FCE_SIZE, tc,
 805                            tc_dma);
 806                        ha->flags.fce_enabled = 0;
 807                        goto cont_alloc;
 808                }
 809
 810                qla_printk(KERN_INFO, ha, "Allocated (%d KB) for FCE...\n",
 811                    FCE_SIZE / 1024);
 812
 813                fce_size = sizeof(struct qla2xxx_fce_chain) + EFT_SIZE;
 814                ha->flags.fce_enabled = 1;
 815                ha->fce_dma = tc_dma;
 816                ha->fce = tc;
 817        }
 818cont_alloc:
 819        req_q_size = ha->request_q_length * sizeof(request_t);
 820        rsp_q_size = ha->response_q_length * sizeof(response_t);
 821
 822        dump_size = offsetof(struct qla2xxx_fw_dump, isp);
 823        dump_size += fixed_size + mem_size + req_q_size + rsp_q_size +
 824            eft_size + fce_size;
 825
 826        ha->fw_dump = vmalloc(dump_size);
 827        if (!ha->fw_dump) {
 828                qla_printk(KERN_WARNING, ha, "Unable to allocate (%d KB) for "
 829                    "firmware dump!!!\n", dump_size / 1024);
 830
 831                if (ha->eft) {
 832                        dma_free_coherent(&ha->pdev->dev, eft_size, ha->eft,
 833                            ha->eft_dma);
 834                        ha->eft = NULL;
 835                        ha->eft_dma = 0;
 836                }
 837                return;
 838        }
 839
 840        qla_printk(KERN_INFO, ha, "Allocated (%d KB) for firmware dump...\n",
 841            dump_size / 1024);
 842
 843        ha->fw_dump_len = dump_size;
 844        ha->fw_dump->signature[0] = 'Q';
 845        ha->fw_dump->signature[1] = 'L';
 846        ha->fw_dump->signature[2] = 'G';
 847        ha->fw_dump->signature[3] = 'C';
 848        ha->fw_dump->version = __constant_htonl(1);
 849
 850        ha->fw_dump->fixed_size = htonl(fixed_size);
 851        ha->fw_dump->mem_size = htonl(mem_size);
 852        ha->fw_dump->req_q_size = htonl(req_q_size);
 853        ha->fw_dump->rsp_q_size = htonl(rsp_q_size);
 854
 855        ha->fw_dump->eft_size = htonl(eft_size);
 856        ha->fw_dump->eft_addr_l = htonl(LSD(ha->eft_dma));
 857        ha->fw_dump->eft_addr_h = htonl(MSD(ha->eft_dma));
 858
 859        ha->fw_dump->header_size =
 860            htonl(offsetof(struct qla2xxx_fw_dump, isp));
 861}
 862
 863/**
 864 * qla2x00_resize_request_q() - Resize request queue given available ISP memory.
 865 * @ha: HA context
 866 *
 867 * Returns 0 on success.
 868 */
 869static void
 870qla2x00_resize_request_q(scsi_qla_host_t *ha)
 871{
 872        int rval;
 873        uint16_t fw_iocb_cnt = 0;
 874        uint16_t request_q_length = REQUEST_ENTRY_CNT_2XXX_EXT_MEM;
 875        dma_addr_t request_dma;
 876        request_t *request_ring;
 877
 878        /* Valid only on recent ISPs. */
 879        if (IS_QLA2100(ha) || IS_QLA2200(ha))
 880                return;
 881
 882        /* Retrieve IOCB counts available to the firmware. */
 883        rval = qla2x00_get_resource_cnts(ha, NULL, NULL, NULL, &fw_iocb_cnt,
 884            &ha->max_npiv_vports);
 885        if (rval)
 886                return;
 887        /* No point in continuing if current settings are sufficient. */
 888        if (fw_iocb_cnt < 1024)
 889                return;
 890        if (ha->request_q_length >= request_q_length)
 891                return;
 892
 893        /* Attempt to claim larger area for request queue. */
 894        request_ring = dma_alloc_coherent(&ha->pdev->dev,
 895            (request_q_length + 1) * sizeof(request_t), &request_dma,
 896            GFP_KERNEL);
 897        if (request_ring == NULL)
 898                return;
 899
 900        /* Resize successful, report extensions. */
 901        qla_printk(KERN_INFO, ha, "Extended memory detected (%d KB)...\n",
 902            (ha->fw_memory_size + 1) / 1024);
 903        qla_printk(KERN_INFO, ha, "Resizing request queue depth "
 904            "(%d -> %d)...\n", ha->request_q_length, request_q_length);
 905
 906        /* Clear old allocations. */
 907        dma_free_coherent(&ha->pdev->dev,
 908            (ha->request_q_length + 1) * sizeof(request_t), ha->request_ring,
 909            ha->request_dma);
 910
 911        /* Begin using larger queue. */
 912        ha->request_q_length = request_q_length;
 913        ha->request_ring = request_ring;
 914        ha->request_dma = request_dma;
 915}
 916
 917/**
 918 * qla2x00_setup_chip() - Load and start RISC firmware.
 919 * @ha: HA context
 920 *
 921 * Returns 0 on success.
 922 */
 923static int
 924qla2x00_setup_chip(scsi_qla_host_t *ha)
 925{
 926        int rval;
 927        uint32_t srisc_address = 0;
 928        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
 929        unsigned long flags;
 930
 931        if (!IS_FWI2_CAPABLE(ha) && !IS_QLA2100(ha) && !IS_QLA2200(ha)) {
 932                /* Disable SRAM, Instruction RAM and GP RAM parity.  */
 933                spin_lock_irqsave(&ha->hardware_lock, flags);
 934                WRT_REG_WORD(&reg->hccr, (HCCR_ENABLE_PARITY + 0x0));
 935                RD_REG_WORD(&reg->hccr);
 936                spin_unlock_irqrestore(&ha->hardware_lock, flags);
 937        }
 938
 939        /* Load firmware sequences */
 940        rval = ha->isp_ops->load_risc(ha, &srisc_address);
 941        if (rval == QLA_SUCCESS) {
 942                DEBUG(printk("scsi(%ld): Verifying Checksum of loaded RISC "
 943                    "code.\n", ha->host_no));
 944
 945                rval = qla2x00_verify_checksum(ha, srisc_address);
 946                if (rval == QLA_SUCCESS) {
 947                        /* Start firmware execution. */
 948                        DEBUG(printk("scsi(%ld): Checksum OK, start "
 949                            "firmware.\n", ha->host_no));
 950
 951                        rval = qla2x00_execute_fw(ha, srisc_address);
 952                        /* Retrieve firmware information. */
 953                        if (rval == QLA_SUCCESS && ha->fw_major_version == 0) {
 954                                qla2x00_get_fw_version(ha,
 955                                    &ha->fw_major_version,
 956                                    &ha->fw_minor_version,
 957                                    &ha->fw_subminor_version,
 958                                    &ha->fw_attributes, &ha->fw_memory_size);
 959                                qla2x00_resize_request_q(ha);
 960                                ha->flags.npiv_supported = 0;
 961                                if ((IS_QLA24XX(ha) || IS_QLA25XX(ha)) &&
 962                                    (ha->fw_attributes & BIT_2)) {
 963                                        ha->flags.npiv_supported = 1;
 964                                        if ((!ha->max_npiv_vports) ||
 965                                            ((ha->max_npiv_vports + 1) %
 966                                            MIN_MULTI_ID_FABRIC))
 967                                                ha->max_npiv_vports =
 968                                                    MIN_MULTI_ID_FABRIC - 1;
 969                                }
 970
 971                                if (ql2xallocfwdump)
 972                                        qla2x00_alloc_fw_dump(ha);
 973                        }
 974                } else {
 975                        DEBUG2(printk(KERN_INFO
 976                            "scsi(%ld): ISP Firmware failed checksum.\n",
 977                            ha->host_no));
 978                }
 979        }
 980
 981        if (!IS_FWI2_CAPABLE(ha) && !IS_QLA2100(ha) && !IS_QLA2200(ha)) {
 982                /* Enable proper parity. */
 983                spin_lock_irqsave(&ha->hardware_lock, flags);
 984                if (IS_QLA2300(ha))
 985                        /* SRAM parity */
 986                        WRT_REG_WORD(&reg->hccr, HCCR_ENABLE_PARITY + 0x1);
 987                else
 988                        /* SRAM, Instruction RAM and GP RAM parity */
 989                        WRT_REG_WORD(&reg->hccr, HCCR_ENABLE_PARITY + 0x7);
 990                RD_REG_WORD(&reg->hccr);
 991                spin_unlock_irqrestore(&ha->hardware_lock, flags);
 992        }
 993
 994        if (rval) {
 995                DEBUG2_3(printk("scsi(%ld): Setup chip **** FAILED ****.\n",
 996                    ha->host_no));
 997        }
 998
 999        return (rval);
1000}
1001
1002/**
1003 * qla2x00_init_response_q_entries() - Initializes response queue entries.
1004 * @ha: HA context
1005 *
1006 * Beginning of request ring has initialization control block already built
1007 * by nvram config routine.
1008 *
1009 * Returns 0 on success.
1010 */
1011static void
1012qla2x00_init_response_q_entries(scsi_qla_host_t *ha)
1013{
1014        uint16_t cnt;
1015        response_t *pkt;
1016
1017        pkt = ha->response_ring_ptr;
1018        for (cnt = 0; cnt < ha->response_q_length; cnt++) {
1019                pkt->signature = RESPONSE_PROCESSED;
1020                pkt++;
1021        }
1022
1023}
1024
1025/**
1026 * qla2x00_update_fw_options() - Read and process firmware options.
1027 * @ha: HA context
1028 *
1029 * Returns 0 on success.
1030 */
1031void
1032qla2x00_update_fw_options(scsi_qla_host_t *ha)
1033{
1034        uint16_t swing, emphasis, tx_sens, rx_sens;
1035
1036        memset(ha->fw_options, 0, sizeof(ha->fw_options));
1037        qla2x00_get_fw_options(ha, ha->fw_options);
1038
1039        if (IS_QLA2100(ha) || IS_QLA2200(ha))
1040                return;
1041
1042        /* Serial Link options. */
1043        DEBUG3(printk("scsi(%ld): Serial link options:\n",
1044            ha->host_no));
1045        DEBUG3(qla2x00_dump_buffer((uint8_t *)&ha->fw_seriallink_options,
1046            sizeof(ha->fw_seriallink_options)));
1047
1048        ha->fw_options[1] &= ~FO1_SET_EMPHASIS_SWING;
1049        if (ha->fw_seriallink_options[3] & BIT_2) {
1050                ha->fw_options[1] |= FO1_SET_EMPHASIS_SWING;
1051
1052                /*  1G settings */
1053                swing = ha->fw_seriallink_options[2] & (BIT_2 | BIT_1 | BIT_0);
1054                emphasis = (ha->fw_seriallink_options[2] &
1055                    (BIT_4 | BIT_3)) >> 3;
1056                tx_sens = ha->fw_seriallink_options[0] &
1057                    (BIT_3 | BIT_2 | BIT_1 | BIT_0);
1058                rx_sens = (ha->fw_seriallink_options[0] &
1059                    (BIT_7 | BIT_6 | BIT_5 | BIT_4)) >> 4;
1060                ha->fw_options[10] = (emphasis << 14) | (swing << 8);
1061                if (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA6312(ha)) {
1062                        if (rx_sens == 0x0)
1063                                rx_sens = 0x3;
1064                        ha->fw_options[10] |= (tx_sens << 4) | rx_sens;
1065                } else if (IS_QLA2322(ha) || IS_QLA6322(ha))
1066                        ha->fw_options[10] |= BIT_5 |
1067                            ((rx_sens & (BIT_1 | BIT_0)) << 2) |
1068                            (tx_sens & (BIT_1 | BIT_0));
1069
1070                /*  2G settings */
1071                swing = (ha->fw_seriallink_options[2] &
1072                    (BIT_7 | BIT_6 | BIT_5)) >> 5;
1073                emphasis = ha->fw_seriallink_options[3] & (BIT_1 | BIT_0);
1074                tx_sens = ha->fw_seriallink_options[1] &
1075                    (BIT_3 | BIT_2 | BIT_1 | BIT_0);
1076                rx_sens = (ha->fw_seriallink_options[1] &
1077                    (BIT_7 | BIT_6 | BIT_5 | BIT_4)) >> 4;
1078                ha->fw_options[11] = (emphasis << 14) | (swing << 8);
1079                if (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA6312(ha)) {
1080                        if (rx_sens == 0x0)
1081                                rx_sens = 0x3;
1082                        ha->fw_options[11] |= (tx_sens << 4) | rx_sens;
1083                } else if (IS_QLA2322(ha) || IS_QLA6322(ha))
1084                        ha->fw_options[11] |= BIT_5 |
1085                            ((rx_sens & (BIT_1 | BIT_0)) << 2) |
1086                            (tx_sens & (BIT_1 | BIT_0));
1087        }
1088
1089        /* FCP2 options. */
1090        /*  Return command IOCBs without waiting for an ABTS to complete. */
1091        ha->fw_options[3] |= BIT_13;
1092
1093        /* LED scheme. */
1094        if (ha->flags.enable_led_scheme)
1095                ha->fw_options[2] |= BIT_12;
1096
1097        /* Detect ISP6312. */
1098        if (IS_QLA6312(ha))
1099                ha->fw_options[2] |= BIT_13;
1100
1101        /* Update firmware options. */
1102        qla2x00_set_fw_options(ha, ha->fw_options);
1103}
1104
1105void
1106qla24xx_update_fw_options(scsi_qla_host_t *ha)
1107{
1108        int rval;
1109
1110        /* Update Serial Link options. */
1111        if ((le16_to_cpu(ha->fw_seriallink_options24[0]) & BIT_0) == 0)
1112                return;
1113
1114        rval = qla2x00_set_serdes_params(ha,
1115            le16_to_cpu(ha->fw_seriallink_options24[1]),
1116            le16_to_cpu(ha->fw_seriallink_options24[2]),
1117            le16_to_cpu(ha->fw_seriallink_options24[3]));
1118        if (rval != QLA_SUCCESS) {
1119                qla_printk(KERN_WARNING, ha,
1120                    "Unable to update Serial Link options (%x).\n", rval);
1121        }
1122}
1123
1124void
1125qla2x00_config_rings(struct scsi_qla_host *ha)
1126{
1127        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
1128
1129        /* Setup ring parameters in initialization control block. */
1130        ha->init_cb->request_q_outpointer = __constant_cpu_to_le16(0);
1131        ha->init_cb->response_q_inpointer = __constant_cpu_to_le16(0);
1132        ha->init_cb->request_q_length = cpu_to_le16(ha->request_q_length);
1133        ha->init_cb->response_q_length = cpu_to_le16(ha->response_q_length);
1134        ha->init_cb->request_q_address[0] = cpu_to_le32(LSD(ha->request_dma));
1135        ha->init_cb->request_q_address[1] = cpu_to_le32(MSD(ha->request_dma));
1136        ha->init_cb->response_q_address[0] = cpu_to_le32(LSD(ha->response_dma));
1137        ha->init_cb->response_q_address[1] = cpu_to_le32(MSD(ha->response_dma));
1138
1139        WRT_REG_WORD(ISP_REQ_Q_IN(ha, reg), 0);
1140        WRT_REG_WORD(ISP_REQ_Q_OUT(ha, reg), 0);
1141        WRT_REG_WORD(ISP_RSP_Q_IN(ha, reg), 0);
1142        WRT_REG_WORD(ISP_RSP_Q_OUT(ha, reg), 0);
1143        RD_REG_WORD(ISP_RSP_Q_OUT(ha, reg));            /* PCI Posting. */
1144}
1145
1146void
1147qla24xx_config_rings(struct scsi_qla_host *ha)
1148{
1149        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
1150        struct init_cb_24xx *icb;
1151
1152        /* Setup ring parameters in initialization control block. */
1153        icb = (struct init_cb_24xx *)ha->init_cb;
1154        icb->request_q_outpointer = __constant_cpu_to_le16(0);
1155        icb->response_q_inpointer = __constant_cpu_to_le16(0);
1156        icb->request_q_length = cpu_to_le16(ha->request_q_length);
1157        icb->response_q_length = cpu_to_le16(ha->response_q_length);
1158        icb->request_q_address[0] = cpu_to_le32(LSD(ha->request_dma));
1159        icb->request_q_address[1] = cpu_to_le32(MSD(ha->request_dma));
1160        icb->response_q_address[0] = cpu_to_le32(LSD(ha->response_dma));
1161        icb->response_q_address[1] = cpu_to_le32(MSD(ha->response_dma));
1162
1163        WRT_REG_DWORD(&reg->req_q_in, 0);
1164        WRT_REG_DWORD(&reg->req_q_out, 0);
1165        WRT_REG_DWORD(&reg->rsp_q_in, 0);
1166        WRT_REG_DWORD(&reg->rsp_q_out, 0);
1167        RD_REG_DWORD(&reg->rsp_q_out);
1168}
1169
1170/**
1171 * qla2x00_init_rings() - Initializes firmware.
1172 * @ha: HA context
1173 *
1174 * Beginning of request ring has initialization control block already built
1175 * by nvram config routine.
1176 *
1177 * Returns 0 on success.
1178 */
1179static int
1180qla2x00_init_rings(scsi_qla_host_t *ha)
1181{
1182        int     rval;
1183        unsigned long flags = 0;
1184        int cnt;
1185        struct mid_init_cb_24xx *mid_init_cb =
1186            (struct mid_init_cb_24xx *) ha->init_cb;
1187
1188        spin_lock_irqsave(&ha->hardware_lock, flags);
1189
1190        /* Clear outstanding commands array. */
1191        for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS; cnt++)
1192                ha->outstanding_cmds[cnt] = NULL;
1193
1194        ha->current_outstanding_cmd = 0;
1195
1196        /* Clear RSCN queue. */
1197        ha->rscn_in_ptr = 0;
1198        ha->rscn_out_ptr = 0;
1199
1200        /* Initialize firmware. */
1201        ha->request_ring_ptr  = ha->request_ring;
1202        ha->req_ring_index    = 0;
1203        ha->req_q_cnt         = ha->request_q_length;
1204        ha->response_ring_ptr = ha->response_ring;
1205        ha->rsp_ring_index    = 0;
1206
1207        /* Initialize response queue entries */
1208        qla2x00_init_response_q_entries(ha);
1209
1210        ha->isp_ops->config_rings(ha);
1211
1212        spin_unlock_irqrestore(&ha->hardware_lock, flags);
1213
1214        /* Update any ISP specific firmware options before initialization. */
1215        ha->isp_ops->update_fw_options(ha);
1216
1217        DEBUG(printk("scsi(%ld): Issue init firmware.\n", ha->host_no));
1218
1219        if (ha->flags.npiv_supported)
1220                mid_init_cb->count = cpu_to_le16(ha->max_npiv_vports);
1221
1222        mid_init_cb->options = __constant_cpu_to_le16(BIT_1);
1223
1224        rval = qla2x00_init_firmware(ha, ha->init_cb_size);
1225        if (rval) {
1226                DEBUG2_3(printk("scsi(%ld): Init firmware **** FAILED ****.\n",
1227                    ha->host_no));
1228        } else {
1229                DEBUG3(printk("scsi(%ld): Init firmware -- success.\n",
1230                    ha->host_no));
1231        }
1232
1233        return (rval);
1234}
1235
1236/**
1237 * qla2x00_fw_ready() - Waits for firmware ready.
1238 * @ha: HA context
1239 *
1240 * Returns 0 on success.
1241 */
1242static int
1243qla2x00_fw_ready(scsi_qla_host_t *ha)
1244{
1245        int             rval;
1246        unsigned long   wtime, mtime;
1247        uint16_t        min_wait;       /* Minimum wait time if loop is down */
1248        uint16_t        wait_time;      /* Wait time if loop is coming ready */
1249        uint16_t        fw_state;
1250
1251        rval = QLA_SUCCESS;
1252
1253        /* 20 seconds for loop down. */
1254        min_wait = 20;
1255
1256        /*
1257         * Firmware should take at most one RATOV to login, plus 5 seconds for
1258         * our own processing.
1259         */
1260        if ((wait_time = (ha->retry_count*ha->login_timeout) + 5) < min_wait) {
1261                wait_time = min_wait;
1262        }
1263
1264        /* Min wait time if loop down */
1265        mtime = jiffies + (min_wait * HZ);
1266
1267        /* wait time before firmware ready */
1268        wtime = jiffies + (wait_time * HZ);
1269
1270        /* Wait for ISP to finish LIP */
1271        if (!ha->flags.init_done)
1272                qla_printk(KERN_INFO, ha, "Waiting for LIP to complete...\n");
1273
1274        DEBUG3(printk("scsi(%ld): Waiting for LIP to complete...\n",
1275            ha->host_no));
1276
1277        do {
1278                rval = qla2x00_get_firmware_state(ha, &fw_state);
1279                if (rval == QLA_SUCCESS) {
1280                        if (fw_state < FSTATE_LOSS_OF_SYNC) {
1281                                ha->device_flags &= ~DFLG_NO_CABLE;
1282                        }
1283                        if (fw_state == FSTATE_READY) {
1284                                DEBUG(printk("scsi(%ld): F/W Ready - OK \n",
1285                                    ha->host_no));
1286
1287                                qla2x00_get_retry_cnt(ha, &ha->retry_count,
1288                                    &ha->login_timeout, &ha->r_a_tov);
1289
1290                                rval = QLA_SUCCESS;
1291                                break;
1292                        }
1293
1294                        rval = QLA_FUNCTION_FAILED;
1295
1296                        if (atomic_read(&ha->loop_down_timer) &&
1297                            fw_state != FSTATE_READY) {
1298                                /* Loop down. Timeout on min_wait for states
1299                                 * other than Wait for Login.
1300                                 */
1301                                if (time_after_eq(jiffies, mtime)) {
1302                                        qla_printk(KERN_INFO, ha,
1303                                            "Cable is unplugged...\n");
1304
1305                                        ha->device_flags |= DFLG_NO_CABLE;
1306                                        break;
1307                                }
1308                        }
1309                } else {
1310                        /* Mailbox cmd failed. Timeout on min_wait. */
1311                        if (time_after_eq(jiffies, mtime))
1312                                break;
1313                }
1314
1315                if (time_after_eq(jiffies, wtime))
1316                        break;
1317
1318                /* Delay for a while */
1319                msleep(500);
1320
1321                DEBUG3(printk("scsi(%ld): fw_state=%x curr time=%lx.\n",
1322                    ha->host_no, fw_state, jiffies));
1323        } while (1);
1324
1325        DEBUG(printk("scsi(%ld): fw_state=%x curr time=%lx.\n",
1326            ha->host_no, fw_state, jiffies));
1327
1328        if (rval) {
1329                DEBUG2_3(printk("scsi(%ld): Firmware ready **** FAILED ****.\n",
1330                    ha->host_no));
1331        }
1332
1333        return (rval);
1334}
1335
1336/*
1337*  qla2x00_configure_hba
1338*      Setup adapter context.
1339*
1340* Input:
1341*      ha = adapter state pointer.
1342*
1343* Returns:
1344*      0 = success
1345*
1346* Context:
1347*      Kernel context.
1348*/
1349static int
1350qla2x00_configure_hba(scsi_qla_host_t *ha)
1351{
1352        int       rval;
1353        uint16_t      loop_id;
1354        uint16_t      topo;
1355        uint16_t      sw_cap;
1356        uint8_t       al_pa;
1357        uint8_t       area;
1358        uint8_t       domain;
1359        char            connect_type[22];
1360
1361        /* Get host addresses. */
1362        rval = qla2x00_get_adapter_id(ha,
1363            &loop_id, &al_pa, &area, &domain, &topo, &sw_cap);
1364        if (rval != QLA_SUCCESS) {
1365                if (LOOP_TRANSITION(ha) || atomic_read(&ha->loop_down_timer) ||
1366                    (rval == QLA_COMMAND_ERROR && loop_id == 0x7)) {
1367                        DEBUG2(printk("%s(%ld) Loop is in a transition state\n",
1368                            __func__, ha->host_no));
1369                } else {
1370                        qla_printk(KERN_WARNING, ha,
1371                            "ERROR -- Unable to get host loop ID.\n");
1372                        set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
1373                }
1374                return (rval);
1375        }
1376
1377        if (topo == 4) {
1378                qla_printk(KERN_INFO, ha,
1379                        "Cannot get topology - retrying.\n");
1380                return (QLA_FUNCTION_FAILED);
1381        }
1382
1383        ha->loop_id = loop_id;
1384
1385        /* initialize */
1386        ha->min_external_loopid = SNS_FIRST_LOOP_ID;
1387        ha->operating_mode = LOOP;
1388        ha->switch_cap = 0;
1389
1390        switch (topo) {
1391        case 0:
1392                DEBUG3(printk("scsi(%ld): HBA in NL topology.\n",
1393                    ha->host_no));
1394                ha->current_topology = ISP_CFG_NL;
1395                strcpy(connect_type, "(Loop)");
1396                break;
1397
1398        case 1:
1399                DEBUG3(printk("scsi(%ld): HBA in FL topology.\n",
1400                    ha->host_no));
1401                ha->switch_cap = sw_cap;
1402                ha->current_topology = ISP_CFG_FL;
1403                strcpy(connect_type, "(FL_Port)");
1404                break;
1405
1406        case 2:
1407                DEBUG3(printk("scsi(%ld): HBA in N P2P topology.\n",
1408                    ha->host_no));
1409                ha->operating_mode = P2P;
1410                ha->current_topology = ISP_CFG_N;
1411                strcpy(connect_type, "(N_Port-to-N_Port)");
1412                break;
1413
1414        case 3:
1415                DEBUG3(printk("scsi(%ld): HBA in F P2P topology.\n",
1416                    ha->host_no));
1417                ha->switch_cap = sw_cap;
1418                ha->operating_mode = P2P;
1419                ha->current_topology = ISP_CFG_F;
1420                strcpy(connect_type, "(F_Port)");
1421                break;
1422
1423        default:
1424                DEBUG3(printk("scsi(%ld): HBA in unknown topology %x. "
1425                    "Using NL.\n",
1426                    ha->host_no, topo));
1427                ha->current_topology = ISP_CFG_NL;
1428                strcpy(connect_type, "(Loop)");
1429                break;
1430        }
1431
1432        /* Save Host port and loop ID. */
1433        /* byte order - Big Endian */
1434        ha->d_id.b.domain = domain;
1435        ha->d_id.b.area = area;
1436        ha->d_id.b.al_pa = al_pa;
1437
1438        if (!ha->flags.init_done)
1439                qla_printk(KERN_INFO, ha,
1440                    "Topology - %s, Host Loop address 0x%x\n",
1441                    connect_type, ha->loop_id);
1442
1443        if (rval) {
1444                DEBUG2_3(printk("scsi(%ld): FAILED.\n", ha->host_no));
1445        } else {
1446                DEBUG3(printk("scsi(%ld): exiting normally.\n", ha->host_no));
1447        }
1448
1449        return(rval);
1450}
1451
1452static inline void
1453qla2x00_set_model_info(scsi_qla_host_t *ha, uint8_t *model, size_t len, char *def)
1454{
1455        char *st, *en;
1456        uint16_t index;
1457
1458        if (memcmp(model, BINZERO, len) != 0) {
1459                strncpy(ha->model_number, model, len);
1460                st = en = ha->model_number;
1461                en += len - 1;
1462                while (en > st) {
1463                        if (*en != 0x20 && *en != 0x00)
1464                                break;
1465                        *en-- = '\0';
1466                }
1467
1468                index = (ha->pdev->subsystem_device & 0xff);
1469                if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_QLOGIC &&
1470                    index < QLA_MODEL_NAMES)
1471                        ha->model_desc = qla2x00_model_name[index * 2 + 1];
1472        } else {
1473                index = (ha->pdev->subsystem_device & 0xff);
1474                if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_QLOGIC &&
1475                    index < QLA_MODEL_NAMES) {
1476                        strcpy(ha->model_number,
1477                            qla2x00_model_name[index * 2]);
1478                        ha->model_desc = qla2x00_model_name[index * 2 + 1];
1479                } else {
1480                        strcpy(ha->model_number, def);
1481                }
1482        }
1483}
1484
1485/* On sparc systems, obtain port and node WWN from firmware
1486 * properties.
1487 */
1488static void qla2xxx_nvram_wwn_from_ofw(scsi_qla_host_t *ha, nvram_t *nv)
1489{
1490#ifdef CONFIG_SPARC
1491        struct pci_dev *pdev = ha->pdev;
1492        struct device_node *dp = pci_device_to_OF_node(pdev);
1493        const u8 *val;
1494        int len;
1495
1496        val = of_get_property(dp, "port-wwn", &len);
1497        if (val && len >= WWN_SIZE)
1498                memcpy(nv->port_name, val, WWN_SIZE);
1499
1500        val = of_get_property(dp, "node-wwn", &len);
1501        if (val && len >= WWN_SIZE)
1502                memcpy(nv->node_name, val, WWN_SIZE);
1503#endif
1504}
1505
1506/*
1507* NVRAM configuration for ISP 2xxx
1508*
1509* Input:
1510*      ha                = adapter block pointer.
1511*
1512* Output:
1513*      initialization control block in response_ring
1514*      host adapters parameters in host adapter block
1515*
1516* Returns:
1517*      0 = success.
1518*/
1519int
1520qla2x00_nvram_config(scsi_qla_host_t *ha)
1521{
1522        int             rval;
1523        uint8_t         chksum = 0;
1524        uint16_t        cnt;
1525        uint8_t         *dptr1, *dptr2;
1526        init_cb_t       *icb = ha->init_cb;
1527        nvram_t         *nv = ha->nvram;
1528        uint8_t         *ptr = ha->nvram;
1529        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
1530
1531        rval = QLA_SUCCESS;
1532
1533        /* Determine NVRAM starting address. */
1534        ha->nvram_size = sizeof(nvram_t);
1535        ha->nvram_base = 0;
1536        if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA2300(ha))
1537                if ((RD_REG_WORD(&reg->ctrl_status) >> 14) == 1)
1538                        ha->nvram_base = 0x80;
1539
1540        /* Get NVRAM data and calculate checksum. */
1541        ha->isp_ops->read_nvram(ha, ptr, ha->nvram_base, ha->nvram_size);
1542        for (cnt = 0, chksum = 0; cnt < ha->nvram_size; cnt++)
1543                chksum += *ptr++;
1544
1545        DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no));
1546        DEBUG5(qla2x00_dump_buffer((uint8_t *)nv, ha->nvram_size));
1547
1548        /* Bad NVRAM data, set defaults parameters. */
1549        if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' ||
1550            nv->id[2] != 'P' || nv->id[3] != ' ' || nv->nvram_version < 1) {
1551                /* Reset NVRAM data. */
1552                qla_printk(KERN_WARNING, ha, "Inconsistent NVRAM detected: "
1553                    "checksum=0x%x id=%c version=0x%x.\n", chksum, nv->id[0],
1554                    nv->nvram_version);
1555                qla_printk(KERN_WARNING, ha, "Falling back to functioning (yet "
1556                    "invalid -- WWPN) defaults.\n");
1557
1558                /*
1559                 * Set default initialization control block.
1560                 */
1561                memset(nv, 0, ha->nvram_size);
1562                nv->parameter_block_version = ICB_VERSION;
1563
1564                if (IS_QLA23XX(ha)) {
1565                        nv->firmware_options[0] = BIT_2 | BIT_1;
1566                        nv->firmware_options[1] = BIT_7 | BIT_5;
1567                        nv->add_firmware_options[0] = BIT_5;
1568                        nv->add_firmware_options[1] = BIT_5 | BIT_4;
1569                        nv->frame_payload_size = __constant_cpu_to_le16(2048);
1570                        nv->special_options[1] = BIT_7;
1571                } else if (IS_QLA2200(ha)) {
1572                        nv->firmware_options[0] = BIT_2 | BIT_1;
1573                        nv->firmware_options[1] = BIT_7 | BIT_5;
1574                        nv->add_firmware_options[0] = BIT_5;
1575                        nv->add_firmware_options[1] = BIT_5 | BIT_4;
1576                        nv->frame_payload_size = __constant_cpu_to_le16(1024);
1577                } else if (IS_QLA2100(ha)) {
1578                        nv->firmware_options[0] = BIT_3 | BIT_1;
1579                        nv->firmware_options[1] = BIT_5;
1580                        nv->frame_payload_size = __constant_cpu_to_le16(1024);
1581                }
1582
1583                nv->max_iocb_allocation = __constant_cpu_to_le16(256);
1584                nv->execution_throttle = __constant_cpu_to_le16(16);
1585                nv->retry_count = 8;
1586                nv->retry_delay = 1;
1587
1588                nv->port_name[0] = 33;
1589                nv->port_name[3] = 224;
1590                nv->port_name[4] = 139;
1591
1592                qla2xxx_nvram_wwn_from_ofw(ha, nv);
1593
1594                nv->login_timeout = 4;
1595
1596                /*
1597                 * Set default host adapter parameters
1598                 */
1599                nv->host_p[1] = BIT_2;
1600                nv->reset_delay = 5;
1601                nv->port_down_retry_count = 8;
1602                nv->max_luns_per_target = __constant_cpu_to_le16(8);
1603                nv->link_down_timeout = 60;
1604
1605                rval = 1;
1606        }
1607
1608#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2)
1609        /*
1610         * The SN2 does not provide BIOS emulation which means you can't change
1611         * potentially bogus BIOS settings. Force the use of default settings
1612         * for link rate and frame size.  Hope that the rest of the settings
1613         * are valid.
1614         */
1615        if (ia64_platform_is("sn2")) {
1616                nv->frame_payload_size = __constant_cpu_to_le16(2048);
1617                if (IS_QLA23XX(ha))
1618                        nv->special_options[1] = BIT_7;
1619        }
1620#endif
1621
1622        /* Reset Initialization control block */
1623        memset(icb, 0, ha->init_cb_size);
1624
1625        /*
1626         * Setup driver NVRAM options.
1627         */
1628        nv->firmware_options[0] |= (BIT_6 | BIT_1);
1629        nv->firmware_options[0] &= ~(BIT_5 | BIT_4);
1630        nv->firmware_options[1] |= (BIT_5 | BIT_0);
1631        nv->firmware_options[1] &= ~BIT_4;
1632
1633        if (IS_QLA23XX(ha)) {
1634                nv->firmware_options[0] |= BIT_2;
1635                nv->firmware_options[0] &= ~BIT_3;
1636                nv->add_firmware_options[1] |= BIT_5 | BIT_4;
1637
1638                if (IS_QLA2300(ha)) {
1639                        if (ha->fb_rev == FPM_2310) {
1640                                strcpy(ha->model_number, "QLA2310");
1641                        } else {
1642                                strcpy(ha->model_number, "QLA2300");
1643                        }
1644                } else {
1645                        qla2x00_set_model_info(ha, nv->model_number,
1646                            sizeof(nv->model_number), "QLA23xx");
1647                }
1648        } else if (IS_QLA2200(ha)) {
1649                nv->firmware_options[0] |= BIT_2;
1650                /*
1651                 * 'Point-to-point preferred, else loop' is not a safe
1652                 * connection mode setting.
1653                 */
1654                if ((nv->add_firmware_options[0] & (BIT_6 | BIT_5 | BIT_4)) ==
1655                    (BIT_5 | BIT_4)) {
1656                        /* Force 'loop preferred, else point-to-point'. */
1657                        nv->add_firmware_options[0] &= ~(BIT_6 | BIT_5 | BIT_4);
1658                        nv->add_firmware_options[0] |= BIT_5;
1659                }
1660                strcpy(ha->model_number, "QLA22xx");
1661        } else /*if (IS_QLA2100(ha))*/ {
1662                strcpy(ha->model_number, "QLA2100");
1663        }
1664
1665        /*
1666         * Copy over NVRAM RISC parameter block to initialization control block.
1667         */
1668        dptr1 = (uint8_t *)icb;
1669        dptr2 = (uint8_t *)&nv->parameter_block_version;
1670        cnt = (uint8_t *)&icb->request_q_outpointer - (uint8_t *)&icb->version;
1671        while (cnt--)
1672                *dptr1++ = *dptr2++;
1673
1674        /* Copy 2nd half. */
1675        dptr1 = (uint8_t *)icb->add_firmware_options;
1676        cnt = (uint8_t *)icb->reserved_3 - (uint8_t *)icb->add_firmware_options;
1677        while (cnt--)
1678                *dptr1++ = *dptr2++;
1679
1680        /* Use alternate WWN? */
1681        if (nv->host_p[1] & BIT_7) {
1682                memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE);
1683                memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE);
1684        }
1685
1686        /* Prepare nodename */
1687        if ((icb->firmware_options[1] & BIT_6) == 0) {
1688                /*
1689                 * Firmware will apply the following mask if the nodename was
1690                 * not provided.
1691                 */
1692                memcpy(icb->node_name, icb->port_name, WWN_SIZE);
1693                icb->node_name[0] &= 0xF0;
1694        }
1695
1696        /*
1697         * Set host adapter parameters.
1698         */
1699        if (nv->host_p[0] & BIT_7)
1700                ql2xextended_error_logging = 1;
1701        ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0);
1702        /* Always load RISC code on non ISP2[12]00 chips. */
1703        if (!IS_QLA2100(ha) && !IS_QLA2200(ha))
1704                ha->flags.disable_risc_code_load = 0;
1705        ha->flags.enable_lip_reset = ((nv->host_p[1] & BIT_1) ? 1 : 0);
1706        ha->flags.enable_lip_full_login = ((nv->host_p[1] & BIT_2) ? 1 : 0);
1707        ha->flags.enable_target_reset = ((nv->host_p[1] & BIT_3) ? 1 : 0);
1708        ha->flags.enable_led_scheme = (nv->special_options[1] & BIT_4) ? 1 : 0;
1709        ha->flags.disable_serdes = 0;
1710
1711        ha->operating_mode =
1712            (icb->add_firmware_options[0] & (BIT_6 | BIT_5 | BIT_4)) >> 4;
1713
1714        memcpy(ha->fw_seriallink_options, nv->seriallink_options,
1715            sizeof(ha->fw_seriallink_options));
1716
1717        /* save HBA serial number */
1718        ha->serial0 = icb->port_name[5];
1719        ha->serial1 = icb->port_name[6];
1720        ha->serial2 = icb->port_name[7];
1721        ha->node_name = icb->node_name;
1722        ha->port_name = icb->port_name;
1723
1724        icb->execution_throttle = __constant_cpu_to_le16(0xFFFF);
1725
1726        ha->retry_count = nv->retry_count;
1727
1728        /* Set minimum login_timeout to 4 seconds. */
1729        if (nv->login_timeout < ql2xlogintimeout)
1730                nv->login_timeout = ql2xlogintimeout;
1731        if (nv->login_timeout < 4)
1732                nv->login_timeout = 4;
1733        ha->login_timeout = nv->login_timeout;
1734        icb->login_timeout = nv->login_timeout;
1735
1736        /* Set minimum RATOV to 100 tenths of a second. */
1737        ha->r_a_tov = 100;
1738
1739        ha->loop_reset_delay = nv->reset_delay;
1740
1741        /* Link Down Timeout = 0:
1742         *
1743         *      When Port Down timer expires we will start returning
1744         *      I/O's to OS with "DID_NO_CONNECT".
1745         *
1746         * Link Down Timeout != 0:
1747         *
1748         *       The driver waits for the link to come up after link down
1749         *       before returning I/Os to OS with "DID_NO_CONNECT".
1750         */
1751        if (nv->link_down_timeout == 0) {
1752                ha->loop_down_abort_time =
1753                    (LOOP_DOWN_TIME - LOOP_DOWN_TIMEOUT);
1754        } else {
1755                ha->link_down_timeout =  nv->link_down_timeout;
1756                ha->loop_down_abort_time =
1757                    (LOOP_DOWN_TIME - ha->link_down_timeout);
1758        }
1759
1760        /*
1761         * Need enough time to try and get the port back.
1762         */
1763        ha->port_down_retry_count = nv->port_down_retry_count;
1764        if (qlport_down_retry)
1765                ha->port_down_retry_count = qlport_down_retry;
1766        /* Set login_retry_count */
1767        ha->login_retry_count  = nv->retry_count;
1768        if (ha->port_down_retry_count == nv->port_down_retry_count &&
1769            ha->port_down_retry_count > 3)
1770                ha->login_retry_count = ha->port_down_retry_count;
1771        else if (ha->port_down_retry_count > (int)ha->login_retry_count)
1772                ha->login_retry_count = ha->port_down_retry_count;
1773        if (ql2xloginretrycount)
1774                ha->login_retry_count = ql2xloginretrycount;
1775
1776        icb->lun_enables = __constant_cpu_to_le16(0);
1777        icb->command_resource_count = 0;
1778        icb->immediate_notify_resource_count = 0;
1779        icb->timeout = __constant_cpu_to_le16(0);
1780
1781        if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
1782                /* Enable RIO */
1783                icb->firmware_options[0] &= ~BIT_3;
1784                icb->add_firmware_options[0] &=
1785                    ~(BIT_3 | BIT_2 | BIT_1 | BIT_0);
1786                icb->add_firmware_options[0] |= BIT_2;
1787                icb->response_accumulation_timer = 3;
1788                icb->interrupt_delay_timer = 5;
1789
1790                ha->flags.process_response_queue = 1;
1791        } else {
1792                /* Enable ZIO. */
1793                if (!ha->flags.init_done) {
1794                        ha->zio_mode = icb->add_firmware_options[0] &
1795                            (BIT_3 | BIT_2 | BIT_1 | BIT_0);
1796                        ha->zio_timer = icb->interrupt_delay_timer ?
1797                            icb->interrupt_delay_timer: 2;
1798                }
1799                icb->add_firmware_options[0] &=
1800                    ~(BIT_3 | BIT_2 | BIT_1 | BIT_0);
1801                ha->flags.process_response_queue = 0;
1802                if (ha->zio_mode != QLA_ZIO_DISABLED) {
1803                        ha->zio_mode = QLA_ZIO_MODE_6;
1804
1805                        DEBUG2(printk("scsi(%ld): ZIO mode %d enabled; timer "
1806                            "delay (%d us).\n", ha->host_no, ha->zio_mode,
1807                            ha->zio_timer * 100));
1808                        qla_printk(KERN_INFO, ha,
1809                            "ZIO mode %d enabled; timer delay (%d us).\n",
1810                            ha->zio_mode, ha->zio_timer * 100);
1811
1812                        icb->add_firmware_options[0] |= (uint8_t)ha->zio_mode;
1813                        icb->interrupt_delay_timer = (uint8_t)ha->zio_timer;
1814                        ha->flags.process_response_queue = 1;
1815                }
1816        }
1817
1818        if (rval) {
1819                DEBUG2_3(printk(KERN_WARNING
1820                    "scsi(%ld): NVRAM configuration failed!\n", ha->host_no));
1821        }
1822        return (rval);
1823}
1824
1825static void
1826qla2x00_rport_del(void *data)
1827{
1828        fc_port_t *fcport = data;
1829        struct fc_rport *rport;
1830        unsigned long flags;
1831
1832        spin_lock_irqsave(&fcport->rport_lock, flags);
1833        rport = fcport->drport;
1834        fcport->drport = NULL;
1835        spin_unlock_irqrestore(&fcport->rport_lock, flags);
1836        if (rport)
1837                fc_remote_port_delete(rport);
1838}
1839
1840/**
1841 * qla2x00_alloc_fcport() - Allocate a generic fcport.
1842 * @ha: HA context
1843 * @flags: allocation flags
1844 *
1845 * Returns a pointer to the allocated fcport, or NULL, if none available.
1846 */
1847static fc_port_t *
1848qla2x00_alloc_fcport(scsi_qla_host_t *ha, gfp_t flags)
1849{
1850        fc_port_t *fcport;
1851
1852        fcport = kzalloc(sizeof(fc_port_t), flags);
1853        if (!fcport)
1854                return NULL;
1855
1856        /* Setup fcport template structure. */
1857        fcport->ha = ha;
1858        fcport->vp_idx = ha->vp_idx;
1859        fcport->port_type = FCT_UNKNOWN;
1860        fcport->loop_id = FC_NO_LOOP_ID;
1861        atomic_set(&fcport->state, FCS_UNCONFIGURED);
1862        fcport->flags = FCF_RLC_SUPPORT;
1863        fcport->supported_classes = FC_COS_UNSPECIFIED;
1864        spin_lock_init(&fcport->rport_lock);
1865
1866        return fcport;
1867}
1868
1869/*
1870 * qla2x00_configure_loop
1871 *      Updates Fibre Channel Device Database with what is actually on loop.
1872 *
1873 * Input:
1874 *      ha                = adapter block pointer.
1875 *
1876 * Returns:
1877 *      0 = success.
1878 *      1 = error.
1879 *      2 = database was full and device was not configured.
1880 */
1881static int
1882qla2x00_configure_loop(scsi_qla_host_t *ha)
1883{
1884        int  rval;
1885        unsigned long flags, save_flags;
1886
1887        rval = QLA_SUCCESS;
1888
1889        /* Get Initiator ID */
1890        if (test_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags)) {
1891                rval = qla2x00_configure_hba(ha);
1892                if (rval != QLA_SUCCESS) {
1893                        DEBUG(printk("scsi(%ld): Unable to configure HBA.\n",
1894                            ha->host_no));
1895                        return (rval);
1896                }
1897        }
1898
1899        save_flags = flags = ha->dpc_flags;
1900        DEBUG(printk("scsi(%ld): Configure loop -- dpc flags =0x%lx\n",
1901            ha->host_no, flags));
1902
1903        /*
1904         * If we have both an RSCN and PORT UPDATE pending then handle them
1905         * both at the same time.
1906         */
1907        clear_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
1908        clear_bit(RSCN_UPDATE, &ha->dpc_flags);
1909
1910        /* Determine what we need to do */
1911        if (ha->current_topology == ISP_CFG_FL &&
1912            (test_bit(LOCAL_LOOP_UPDATE, &flags))) {
1913
1914                ha->flags.rscn_queue_overflow = 1;
1915                set_bit(RSCN_UPDATE, &flags);
1916
1917        } else if (ha->current_topology == ISP_CFG_F &&
1918            (test_bit(LOCAL_LOOP_UPDATE, &flags))) {
1919
1920                ha->flags.rscn_queue_overflow = 1;
1921                set_bit(RSCN_UPDATE, &flags);
1922                clear_bit(LOCAL_LOOP_UPDATE, &flags);
1923
1924        } else if (ha->current_topology == ISP_CFG_N) {
1925                clear_bit(RSCN_UPDATE, &flags);
1926
1927        } else if (!ha->flags.online ||
1928            (test_bit(ABORT_ISP_ACTIVE, &flags))) {
1929
1930                ha->flags.rscn_queue_overflow = 1;
1931                set_bit(RSCN_UPDATE, &flags);
1932                set_bit(LOCAL_LOOP_UPDATE, &flags);
1933        }
1934
1935        if (test_bit(LOCAL_LOOP_UPDATE, &flags)) {
1936                if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) {
1937                        rval = QLA_FUNCTION_FAILED;
1938                } else {
1939                        rval = qla2x00_configure_local_loop(ha);
1940                }
1941        }
1942
1943        if (rval == QLA_SUCCESS && test_bit(RSCN_UPDATE, &flags)) {
1944                if (LOOP_TRANSITION(ha)) {
1945                        rval = QLA_FUNCTION_FAILED;
1946                } else {
1947                        rval = qla2x00_configure_fabric(ha);
1948                }
1949        }
1950
1951        if (rval == QLA_SUCCESS) {
1952                if (atomic_read(&ha->loop_down_timer) ||
1953                    test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) {
1954                        rval = QLA_FUNCTION_FAILED;
1955                } else {
1956                        atomic_set(&ha->loop_state, LOOP_READY);
1957
1958                        DEBUG(printk("scsi(%ld): LOOP READY\n", ha->host_no));
1959                }
1960        }
1961
1962        if (rval) {
1963                DEBUG2_3(printk("%s(%ld): *** FAILED ***\n",
1964                    __func__, ha->host_no));
1965        } else {
1966                DEBUG3(printk("%s: exiting normally\n", __func__));
1967        }
1968
1969        /* Restore state if a resync event occured during processing */
1970        if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) {
1971                if (test_bit(LOCAL_LOOP_UPDATE, &save_flags))
1972                        set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
1973                if (test_bit(RSCN_UPDATE, &save_flags))
1974                        set_bit(RSCN_UPDATE, &ha->dpc_flags);
1975        }
1976
1977        return (rval);
1978}
1979
1980
1981
1982/*
1983 * qla2x00_configure_local_loop
1984 *      Updates Fibre Channel Device Database with local loop devices.
1985 *
1986 * Input:
1987 *      ha = adapter block pointer.
1988 *
1989 * Returns:
1990 *      0 = success.
1991 */
1992static int
1993qla2x00_configure_local_loop(scsi_qla_host_t *ha)
1994{
1995        int             rval, rval2;
1996        int             found_devs;
1997        int             found;
1998        fc_port_t       *fcport, *new_fcport;
1999
2000        uint16_t        index;
2001        uint16_t        entries;
2002        char            *id_iter;
2003        uint16_t        loop_id;
2004        uint8_t         domain, area, al_pa;
2005        scsi_qla_host_t *pha = to_qla_parent(ha);
2006
2007        found_devs = 0;
2008        new_fcport = NULL;
2009        entries = MAX_FIBRE_DEVICES;
2010
2011        DEBUG3(printk("scsi(%ld): Getting FCAL position map\n", ha->host_no));
2012        DEBUG3(qla2x00_get_fcal_position_map(ha, NULL));
2013
2014        /* Get list of logged in devices. */
2015        memset(ha->gid_list, 0, GID_LIST_SIZE);
2016        rval = qla2x00_get_id_list(ha, ha->gid_list, ha->gid_list_dma,
2017            &entries);
2018        if (rval != QLA_SUCCESS)
2019                goto cleanup_allocation;
2020
2021        DEBUG3(printk("scsi(%ld): Entries in ID list (%d)\n",
2022            ha->host_no, entries));
2023        DEBUG3(qla2x00_dump_buffer((uint8_t *)ha->gid_list,
2024            entries * sizeof(struct gid_list_info)));
2025
2026        /* Allocate temporary fcport for any new fcports discovered. */
2027        new_fcport = qla2x00_alloc_fcport(ha, GFP_KERNEL);
2028        if (new_fcport == NULL) {
2029                rval = QLA_MEMORY_ALLOC_FAILED;
2030                goto cleanup_allocation;
2031        }
2032        new_fcport->flags &= ~FCF_FABRIC_DEVICE;
2033
2034        /*
2035         * Mark local devices that were present with FCF_DEVICE_LOST for now.
2036         */
2037        list_for_each_entry(fcport, &pha->fcports, list) {
2038                if (fcport->vp_idx != ha->vp_idx)
2039                        continue;
2040
2041                if (atomic_read(&fcport->state) == FCS_ONLINE &&
2042                    fcport->port_type != FCT_BROADCAST &&
2043                    (fcport->flags & FCF_FABRIC_DEVICE) == 0) {
2044
2045                        DEBUG(printk("scsi(%ld): Marking port lost, "
2046                            "loop_id=0x%04x\n",
2047                            ha->host_no, fcport->loop_id));
2048
2049                        atomic_set(&fcport->state, FCS_DEVICE_LOST);
2050                        fcport->flags &= ~FCF_FARP_DONE;
2051                }
2052        }
2053
2054        /* Add devices to port list. */
2055        id_iter = (char *)ha->gid_list;
2056        for (index = 0; index < entries; index++) {
2057                domain = ((struct gid_list_info *)id_iter)->domain;
2058                area = ((struct gid_list_info *)id_iter)->area;
2059                al_pa = ((struct gid_list_info *)id_iter)->al_pa;
2060                if (IS_QLA2100(ha) || IS_QLA2200(ha))
2061                        loop_id = (uint16_t)
2062                            ((struct gid_list_info *)id_iter)->loop_id_2100;
2063                else
2064                        loop_id = le16_to_cpu(
2065                            ((struct gid_list_info *)id_iter)->loop_id);
2066                id_iter += ha->gid_list_info_size;
2067
2068                /* Bypass reserved domain fields. */
2069                if ((domain & 0xf0) == 0xf0)
2070                        continue;
2071
2072                /* Bypass if not same domain and area of adapter. */
2073                if (area && domain &&
2074                    (area != ha->d_id.b.area || domain != ha->d_id.b.domain))
2075                        continue;
2076
2077                /* Bypass invalid local loop ID. */
2078                if (loop_id > LAST_LOCAL_LOOP_ID)
2079                        continue;
2080
2081                /* Fill in member data. */
2082                new_fcport->d_id.b.domain = domain;
2083                new_fcport->d_id.b.area = area;
2084                new_fcport->d_id.b.al_pa = al_pa;
2085                new_fcport->loop_id = loop_id;
2086                new_fcport->vp_idx = ha->vp_idx;
2087                rval2 = qla2x00_get_port_database(ha, new_fcport, 0);
2088                if (rval2 != QLA_SUCCESS) {
2089                        DEBUG2(printk("scsi(%ld): Failed to retrieve fcport "
2090                            "information -- get_port_database=%x, "
2091                            "loop_id=0x%04x\n",
2092                            ha->host_no, rval2, new_fcport->loop_id));
2093                        DEBUG2(printk("scsi(%ld): Scheduling resync...\n",
2094                            ha->host_no));
2095                        set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
2096                        continue;
2097                }
2098
2099                /* Check for matching device in port list. */
2100                found = 0;
2101                fcport = NULL;
2102                list_for_each_entry(fcport, &pha->fcports, list) {
2103                        if (fcport->vp_idx != ha->vp_idx)
2104                                continue;
2105
2106                        if (memcmp(new_fcport->port_name, fcport->port_name,
2107                            WWN_SIZE))
2108                                continue;
2109
2110                        fcport->flags &= ~(FCF_FABRIC_DEVICE |
2111                            FCF_PERSISTENT_BOUND);
2112                        fcport->loop_id = new_fcport->loop_id;
2113                        fcport->port_type = new_fcport->port_type;
2114                        fcport->d_id.b24 = new_fcport->d_id.b24;
2115                        memcpy(fcport->node_name, new_fcport->node_name,
2116                            WWN_SIZE);
2117
2118                        found++;
2119                        break;
2120                }
2121
2122                if (!found) {
2123                        /* New device, add to fcports list. */
2124                        new_fcport->flags &= ~FCF_PERSISTENT_BOUND;
2125                        if (ha->parent) {
2126                                new_fcport->ha = ha;
2127                                new_fcport->vp_idx = ha->vp_idx;
2128                                list_add_tail(&new_fcport->vp_fcport,
2129                                    &ha->vp_fcports);
2130                        }
2131                        list_add_tail(&new_fcport->list, &pha->fcports);
2132
2133                        /* Allocate a new replacement fcport. */
2134                        fcport = new_fcport;
2135                        new_fcport = qla2x00_alloc_fcport(ha, GFP_KERNEL);
2136                        if (new_fcport == NULL) {
2137                                rval = QLA_MEMORY_ALLOC_FAILED;
2138                                goto cleanup_allocation;
2139                        }
2140                        new_fcport->flags &= ~FCF_FABRIC_DEVICE;
2141                }
2142
2143                /* Base iIDMA settings on HBA port speed. */
2144                fcport->fp_speed = ha->link_data_rate;
2145
2146                qla2x00_update_fcport(ha, fcport);
2147
2148                found_devs++;
2149        }
2150
2151cleanup_allocation:
2152        kfree(new_fcport);
2153
2154        if (rval != QLA_SUCCESS) {
2155                DEBUG2(printk("scsi(%ld): Configure local loop error exit: "
2156                    "rval=%x\n", ha->host_no, rval));
2157        }
2158
2159        if (found_devs) {
2160                ha->device_flags |= DFLG_LOCAL_DEVICES;
2161                ha->device_flags &= ~DFLG_RETRY_LOCAL_DEVICES;
2162        }
2163
2164        return (rval);
2165}
2166
2167static void
2168qla2x00_probe_for_all_luns(scsi_qla_host_t *ha)
2169{
2170        fc_port_t       *fcport;
2171
2172        qla2x00_mark_all_devices_lost(ha, 0);
2173        list_for_each_entry(fcport, &ha->fcports, list) {
2174                if (fcport->port_type != FCT_TARGET)
2175                        continue;
2176
2177                qla2x00_update_fcport(ha, fcport);
2178        }
2179}
2180
2181static void
2182qla2x00_iidma_fcport(scsi_qla_host_t *ha, fc_port_t *fcport)
2183{
2184#define LS_UNKNOWN      2
2185        static char *link_speeds[5] = { "1", "2", "?", "4", "8" };
2186        int rval;
2187        uint16_t mb[6];
2188
2189        if (!IS_IIDMA_CAPABLE(ha))
2190                return;
2191
2192        if (fcport->fp_speed == PORT_SPEED_UNKNOWN ||
2193            fcport->fp_speed > ha->link_data_rate)
2194                return;
2195
2196        rval = qla2x00_set_idma_speed(ha, fcport->loop_id, fcport->fp_speed,
2197            mb);
2198        if (rval != QLA_SUCCESS) {
2199                DEBUG2(printk("scsi(%ld): Unable to adjust iIDMA "
2200                    "%02x%02x%02x%02x%02x%02x%02x%02x -- %04x %x %04x %04x.\n",
2201                    ha->host_no, fcport->port_name[0], fcport->port_name[1],
2202                    fcport->port_name[2], fcport->port_name[3],
2203                    fcport->port_name[4], fcport->port_name[5],
2204                    fcport->port_name[6], fcport->port_name[7], rval,
2205                    fcport->fp_speed, mb[0], mb[1]));
2206        } else {
2207                DEBUG2(qla_printk(KERN_INFO, ha,
2208                    "iIDMA adjusted to %s GB/s on "
2209                    "%02x%02x%02x%02x%02x%02x%02x%02x.\n",
2210                    link_speeds[fcport->fp_speed], fcport->port_name[0],
2211                    fcport->port_name[1], fcport->port_name[2],
2212                    fcport->port_name[3], fcport->port_name[4],
2213                    fcport->port_name[5], fcport->port_name[6],
2214                    fcport->port_name[7]));
2215        }
2216}
2217
2218static void
2219qla2x00_reg_remote_port(scsi_qla_host_t *ha, fc_port_t *fcport)
2220{
2221        struct fc_rport_identifiers rport_ids;
2222        struct fc_rport *rport;
2223        unsigned long flags;
2224
2225        if (fcport->drport)
2226                qla2x00_rport_del(fcport);
2227        if (fcport->rport)
2228                return;
2229
2230        rport_ids.node_name = wwn_to_u64(fcport->node_name);
2231        rport_ids.port_name = wwn_to_u64(fcport->port_name);
2232        rport_ids.port_id = fcport->d_id.b.domain << 16 |
2233            fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa;
2234        rport_ids.roles = FC_RPORT_ROLE_UNKNOWN;
2235        rport = fc_remote_port_add(ha->host, 0, &rport_ids);
2236        if (!rport) {
2237                qla_printk(KERN_WARNING, ha,
2238                    "Unable to allocate fc remote port!\n");
2239                return;
2240        }
2241        spin_lock_irqsave(&fcport->rport_lock, flags);
2242        fcport->rport = rport;
2243        *((fc_port_t **)rport->dd_data) = fcport;
2244        spin_unlock_irqrestore(&fcport->rport_lock, flags);
2245
2246        rport->supported_classes = fcport->supported_classes;
2247
2248        rport_ids.roles = FC_RPORT_ROLE_UNKNOWN;
2249        if (fcport->port_type == FCT_INITIATOR)
2250                rport_ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR;
2251        if (fcport->port_type == FCT_TARGET)
2252                rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET;
2253        fc_remote_port_rolechg(rport, rport_ids.roles);
2254
2255        if (rport->scsi_target_id != -1 &&
2256            rport->scsi_target_id < ha->host->max_id)
2257                fcport->os_target_id = rport->scsi_target_id;
2258}
2259
2260/*
2261 * qla2x00_update_fcport
2262 *      Updates device on list.
2263 *
2264 * Input:
2265 *      ha = adapter block pointer.
2266 *      fcport = port structure pointer.
2267 *
2268 * Return:
2269 *      0  - Success
2270 *  BIT_0 - error
2271 *
2272 * Context:
2273 *      Kernel context.
2274 */
2275void
2276qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport)
2277{
2278        scsi_qla_host_t *pha = to_qla_parent(ha);
2279
2280        fcport->ha = ha;
2281        fcport->login_retry = 0;
2282        fcport->port_login_retry_count = pha->port_down_retry_count *
2283            PORT_RETRY_TIME;
2284        atomic_set(&fcport->port_down_timer, pha->port_down_retry_count *
2285            PORT_RETRY_TIME);
2286        fcport->flags &= ~FCF_LOGIN_NEEDED;
2287
2288        qla2x00_iidma_fcport(ha, fcport);
2289
2290        atomic_set(&fcport->state, FCS_ONLINE);
2291
2292        qla2x00_reg_remote_port(ha, fcport);
2293}
2294
2295/*
2296 * qla2x00_configure_fabric
2297 *      Setup SNS devices with loop ID's.
2298 *
2299 * Input:
2300 *      ha = adapter block pointer.
2301 *
2302 * Returns:
2303 *      0 = success.
2304 *      BIT_0 = error
2305 */
2306static int
2307qla2x00_configure_fabric(scsi_qla_host_t *ha)
2308{
2309        int     rval, rval2;
2310        fc_port_t       *fcport, *fcptemp;
2311        uint16_t        next_loopid;
2312        uint16_t        mb[MAILBOX_REGISTER_COUNT];
2313        uint16_t        loop_id;
2314        LIST_HEAD(new_fcports);
2315        scsi_qla_host_t *pha = to_qla_parent(ha);
2316
2317        /* If FL port exists, then SNS is present */
2318        if (IS_FWI2_CAPABLE(ha))
2319                loop_id = NPH_F_PORT;
2320        else
2321                loop_id = SNS_FL_PORT;
2322        rval = qla2x00_get_port_name(ha, loop_id, ha->fabric_node_name, 1);
2323        if (rval != QLA_SUCCESS) {
2324                DEBUG2(printk("scsi(%ld): MBC_GET_PORT_NAME Failed, No FL "
2325                    "Port\n", ha->host_no));
2326
2327                ha->device_flags &= ~SWITCH_FOUND;
2328                return (QLA_SUCCESS);
2329        }
2330        ha->device_flags |= SWITCH_FOUND;
2331
2332        /* Mark devices that need re-synchronization. */
2333        rval2 = qla2x00_device_resync(ha);
2334        if (rval2 == QLA_RSCNS_HANDLED) {
2335                /* No point doing the scan, just continue. */
2336                return (QLA_SUCCESS);
2337        }
2338        do {
2339                /* FDMI support. */
2340                if (ql2xfdmienable &&
2341                    test_and_clear_bit(REGISTER_FDMI_NEEDED, &ha->dpc_flags))
2342                        qla2x00_fdmi_register(ha);
2343
2344                /* Ensure we are logged into the SNS. */
2345                if (IS_FWI2_CAPABLE(ha))
2346                        loop_id = NPH_SNS;
2347                else
2348                        loop_id = SIMPLE_NAME_SERVER;
2349                ha->isp_ops->fabric_login(ha, loop_id, 0xff, 0xff,
2350                    0xfc, mb, BIT_1 | BIT_0);
2351                if (mb[0] != MBS_COMMAND_COMPLETE) {
2352                        DEBUG2(qla_printk(KERN_INFO, ha,
2353                            "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x "
2354                            "mb[2]=%x mb[6]=%x mb[7]=%x\n", loop_id,
2355                            mb[0], mb[1], mb[2], mb[6], mb[7]));
2356                        return (QLA_SUCCESS);
2357                }
2358
2359                if (test_and_clear_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags)) {
2360                        if (qla2x00_rft_id(ha)) {
2361                                /* EMPTY */
2362                                DEBUG2(printk("scsi(%ld): Register FC-4 "
2363                                    "TYPE failed.\n", ha->host_no));
2364                        }
2365                        if (qla2x00_rff_id(ha)) {
2366                                /* EMPTY */
2367                                DEBUG2(printk("scsi(%ld): Register FC-4 "
2368                                    "Features failed.\n", ha->host_no));
2369                        }
2370                        if (qla2x00_rnn_id(ha)) {
2371                                /* EMPTY */
2372                                DEBUG2(printk("scsi(%ld): Register Node Name "
2373                                    "failed.\n", ha->host_no));
2374                        } else if (qla2x00_rsnn_nn(ha)) {
2375                                /* EMPTY */
2376                                DEBUG2(printk("scsi(%ld): Register Symbolic "
2377                                    "Node Name failed.\n", ha->host_no));
2378                        }
2379                }
2380
2381                rval = qla2x00_find_all_fabric_devs(ha, &new_fcports);
2382                if (rval != QLA_SUCCESS)
2383                        break;
2384
2385                /*
2386                 * Logout all previous fabric devices marked lost, except
2387                 * tape devices.
2388                 */
2389                list_for_each_entry(fcport, &pha->fcports, list) {
2390                        if (fcport->vp_idx !=ha->vp_idx)
2391                                continue;
2392
2393                        if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))
2394                                break;
2395
2396                        if ((fcport->flags & FCF_FABRIC_DEVICE) == 0)
2397                                continue;
2398
2399                        if (atomic_read(&fcport->state) == FCS_DEVICE_LOST) {
2400                                qla2x00_mark_device_lost(ha, fcport,
2401                                    ql2xplogiabsentdevice, 0);
2402                                if (fcport->loop_id != FC_NO_LOOP_ID &&
2403                                    (fcport->flags & FCF_TAPE_PRESENT) == 0 &&
2404                                    fcport->port_type != FCT_INITIATOR &&
2405                                    fcport->port_type != FCT_BROADCAST) {
2406                                        ha->isp_ops->fabric_logout(ha,
2407                                            fcport->loop_id,
2408                                            fcport->d_id.b.domain,
2409                                            fcport->d_id.b.area,
2410                                            fcport->d_id.b.al_pa);
2411                                        fcport->loop_id = FC_NO_LOOP_ID;
2412                                }
2413                        }
2414                }
2415
2416                /* Starting free loop ID. */
2417                next_loopid = pha->min_external_loopid;
2418
2419                /*
2420                 * Scan through our port list and login entries that need to be
2421                 * logged in.
2422                 */
2423                list_for_each_entry(fcport, &pha->fcports, list) {
2424                        if (fcport->vp_idx != ha->vp_idx)
2425                                continue;
2426
2427                        if (atomic_read(&ha->loop_down_timer) ||
2428                            test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))
2429                                break;
2430
2431                        if ((fcport->flags & FCF_FABRIC_DEVICE) == 0 ||
2432                            (fcport->flags & FCF_LOGIN_NEEDED) == 0)
2433                                continue;
2434
2435                        if (fcport->loop_id == FC_NO_LOOP_ID) {
2436                                fcport->loop_id = next_loopid;
2437                                rval = qla2x00_find_new_loop_id(ha, fcport);
2438                                if (rval != QLA_SUCCESS) {
2439                                        /* Ran out of IDs to use */
2440                                        break;
2441                                }
2442                        }
2443                        /* Login and update database */
2444                        qla2x00_fabric_dev_login(ha, fcport, &next_loopid);
2445                }
2446
2447                /* Exit if out of loop IDs. */
2448                if (rval != QLA_SUCCESS) {
2449                        break;
2450                }
2451
2452                /*
2453                 * Login and add the new devices to our port list.
2454                 */
2455                list_for_each_entry_safe(fcport, fcptemp, &new_fcports, list) {
2456                        if (atomic_read(&ha->loop_down_timer) ||
2457                            test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))
2458                                break;
2459
2460                        /* Find a new loop ID to use. */
2461                        fcport->loop_id = next_loopid;
2462                        rval = qla2x00_find_new_loop_id(ha, fcport);
2463                        if (rval != QLA_SUCCESS) {
2464                                /* Ran out of IDs to use */
2465                                break;
2466                        }
2467
2468                        /* Login and update database */
2469                        qla2x00_fabric_dev_login(ha, fcport, &next_loopid);
2470
2471                        if (ha->parent) {
2472                                fcport->ha = ha;
2473                                fcport->vp_idx = ha->vp_idx;
2474                                list_add_tail(&fcport->vp_fcport,
2475                                    &ha->vp_fcports);
2476                                list_move_tail(&fcport->list,
2477                                    &ha->parent->fcports);
2478                        } else
2479                                list_move_tail(&fcport->list, &ha->fcports);
2480                }
2481        } while (0);
2482
2483        /* Free all new device structures not processed. */
2484        list_for_each_entry_safe(fcport, fcptemp, &new_fcports, list) {
2485                list_del(&fcport->list);
2486                kfree(fcport);
2487        }
2488
2489        if (rval) {
2490                DEBUG2(printk("scsi(%ld): Configure fabric error exit: "
2491                    "rval=%d\n", ha->host_no, rval));
2492        }
2493
2494        return (rval);
2495}
2496
2497
2498/*
2499 * qla2x00_find_all_fabric_devs
2500 *
2501 * Input:
2502 *      ha = adapter block pointer.
2503 *      dev = database device entry pointer.
2504 *
2505 * Returns:
2506 *      0 = success.
2507 *
2508 * Context:
2509 *      Kernel context.
2510 */
2511static int
2512qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, struct list_head *new_fcports)
2513{
2514        int             rval;
2515        uint16_t        loop_id;
2516        fc_port_t       *fcport, *new_fcport, *fcptemp;
2517        int             found;
2518
2519        sw_info_t       *swl;
2520        int             swl_idx;
2521        int             first_dev, last_dev;
2522        port_id_t       wrap, nxt_d_id;
2523        int             vp_index;
2524        int             empty_vp_index;
2525        int             found_vp;
2526        scsi_qla_host_t *vha;
2527        scsi_qla_host_t *pha = to_qla_parent(ha);
2528
2529        rval = QLA_SUCCESS;
2530
2531        /* Try GID_PT to get device list, else GAN. */
2532        swl = kcalloc(MAX_FIBRE_DEVICES, sizeof(sw_info_t), GFP_ATOMIC);
2533        if (!swl) {
2534                /*EMPTY*/
2535                DEBUG2(printk("scsi(%ld): GID_PT allocations failed, fallback "
2536                    "on GA_NXT\n", ha->host_no));
2537        } else {
2538                if (qla2x00_gid_pt(ha, swl) != QLA_SUCCESS) {
2539                        kfree(swl);
2540                        swl = NULL;
2541                } else if (qla2x00_gpn_id(ha, swl) != QLA_SUCCESS) {
2542                        kfree(swl);
2543                        swl = NULL;
2544                } else if (qla2x00_gnn_id(ha, swl) != QLA_SUCCESS) {
2545                        kfree(swl);
2546                        swl = NULL;
2547                } else if (qla2x00_gfpn_id(ha, swl) == QLA_SUCCESS) {
2548                        qla2x00_gpsc(ha, swl);
2549                }
2550        }
2551        swl_idx = 0;
2552
2553        /* Allocate temporary fcport for any new fcports discovered. */
2554        new_fcport = qla2x00_alloc_fcport(ha, GFP_KERNEL);
2555        if (new_fcport == NULL) {
2556                kfree(swl);
2557                return (QLA_MEMORY_ALLOC_FAILED);
2558        }
2559        new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED);
2560        new_fcport->vp_idx = ha->vp_idx;
2561        /* Set start port ID scan at adapter ID. */
2562        first_dev = 1;
2563        last_dev = 0;
2564
2565        /* Starting free loop ID. */
2566        loop_id = pha->min_external_loopid;
2567        for (; loop_id <= ha->last_loop_id; loop_id++) {
2568                if (qla2x00_is_reserved_id(ha, loop_id))
2569                        continue;
2570
2571                if (atomic_read(&ha->loop_down_timer) || LOOP_TRANSITION(ha))
2572                        break;
2573
2574                if (swl != NULL) {
2575                        if (last_dev) {
2576                                wrap.b24 = new_fcport->d_id.b24;
2577                        } else {
2578                                new_fcport->d_id.b24 = swl[swl_idx].d_id.b24;
2579                                memcpy(new_fcport->node_name,
2580                                    swl[swl_idx].node_name, WWN_SIZE);
2581                                memcpy(new_fcport->port_name,
2582                                    swl[swl_idx].port_name, WWN_SIZE);
2583                                memcpy(new_fcport->fabric_port_name,
2584                                    swl[swl_idx].fabric_port_name, WWN_SIZE);
2585                                new_fcport->fp_speed = swl[swl_idx].fp_speed;
2586
2587                                if (swl[swl_idx].d_id.b.rsvd_1 != 0) {
2588                                        last_dev = 1;
2589                                }
2590                                swl_idx++;
2591                        }
2592                } else {
2593                        /* Send GA_NXT to the switch */
2594                        rval = qla2x00_ga_nxt(ha, new_fcport);
2595                        if (rval != QLA_SUCCESS) {
2596                                qla_printk(KERN_WARNING, ha,
2597                                    "SNS scan failed -- assuming zero-entry "
2598                                    "result...\n");
2599                                list_for_each_entry_safe(fcport, fcptemp,
2600                                    new_fcports, list) {
2601                                        list_del(&fcport->list);
2602                                        kfree(fcport);
2603                                }
2604                                rval = QLA_SUCCESS;
2605                                break;
2606                        }
2607                }
2608
2609                /* If wrap on switch device list, exit. */
2610                if (first_dev) {
2611                        wrap.b24 = new_fcport->d_id.b24;
2612                        first_dev = 0;
2613                } else if (new_fcport->d_id.b24 == wrap.b24) {
2614                        DEBUG2(printk("scsi(%ld): device wrap (%02x%02x%02x)\n",
2615                            ha->host_no, new_fcport->d_id.b.domain,
2616                            new_fcport->d_id.b.area, new_fcport->d_id.b.al_pa));
2617                        break;
2618                }
2619
2620                /* Bypass if same physical adapter. */
2621                if (new_fcport->d_id.b24 == pha->d_id.b24)
2622                        continue;
2623
2624                /* Bypass virtual ports of the same host. */
2625                if (pha->num_vhosts) {
2626                        for_each_mapped_vp_idx(pha, vp_index) {
2627                                empty_vp_index = 1;
2628                                found_vp = 0;
2629                                list_for_each_entry(vha, &pha->vp_list,
2630                                    vp_list) {
2631                                        if (vp_index == vha->vp_idx) {
2632                                                empty_vp_index = 0;
2633                                                found_vp = 1;
2634                                                break;
2635                                        }
2636                                }
2637
2638                                if (empty_vp_index)
2639                                        continue;
2640
2641                                if (found_vp &&
2642                                    new_fcport->d_id.b24 == vha->d_id.b24)
2643                                        break;
2644                        }
2645
2646                        if (vp_index <= pha->max_npiv_vports)
2647                                continue;
2648                }
2649
2650                /* Bypass if same domain and area of adapter. */
2651                if (((new_fcport->d_id.b24 & 0xffff00) ==
2652                    (ha->d_id.b24 & 0xffff00)) && ha->current_topology ==
2653                        ISP_CFG_FL)
2654                            continue;
2655
2656                /* Bypass reserved domain fields. */
2657                if ((new_fcport->d_id.b.domain & 0xf0) == 0xf0)
2658                        continue;
2659
2660                /* Locate matching device in database. */
2661                found = 0;
2662                list_for_each_entry(fcport, &pha->fcports, list) {
2663                        if (new_fcport->vp_idx != fcport->vp_idx)
2664                                continue;
2665                        if (memcmp(new_fcport->port_name, fcport->port_name,
2666                            WWN_SIZE))
2667                                continue;
2668
2669                        found++;
2670
2671                        /* Update port state. */
2672                        memcpy(fcport->fabric_port_name,
2673                            new_fcport->fabric_port_name, WWN_SIZE);
2674                        fcport->fp_speed = new_fcport->fp_speed;
2675
2676                        /*
2677                         * If address the same and state FCS_ONLINE, nothing
2678                         * changed.
2679                         */
2680                        if (fcport->d_id.b24 == new_fcport->d_id.b24 &&
2681                            atomic_read(&fcport->state) == FCS_ONLINE) {
2682                                break;
2683                        }
2684
2685                        /*
2686                         * If device was not a fabric device before.
2687                         */
2688                        if ((fcport->flags & FCF_FABRIC_DEVICE) == 0) {
2689                                fcport->d_id.b24 = new_fcport->d_id.b24;
2690                                fcport->loop_id = FC_NO_LOOP_ID;
2691                                fcport->flags |= (FCF_FABRIC_DEVICE |
2692                                    FCF_LOGIN_NEEDED);
2693                                fcport->flags &= ~FCF_PERSISTENT_BOUND;
2694                                break;
2695                        }
2696
2697                        /*
2698                         * Port ID changed or device was marked to be updated;
2699                         * Log it out if still logged in and mark it for
2700                         * relogin later.
2701                         */
2702                        fcport->d_id.b24 = new_fcport->d_id.b24;
2703                        fcport->flags |= FCF_LOGIN_NEEDED;
2704                        if (fcport->loop_id != FC_NO_LOOP_ID &&
2705                            (fcport->flags & FCF_TAPE_PRESENT) == 0 &&
2706                            fcport->port_type != FCT_INITIATOR &&
2707                            fcport->port_type != FCT_BROADCAST) {
2708                                ha->isp_ops->fabric_logout(ha, fcport->loop_id,
2709                                    fcport->d_id.b.domain, fcport->d_id.b.area,
2710                                    fcport->d_id.b.al_pa);
2711                                fcport->loop_id = FC_NO_LOOP_ID;
2712                        }
2713
2714                        break;
2715                }
2716
2717                if (found)
2718                        continue;
2719
2720                /* If device was not in our fcports list, then add it. */
2721                list_add_tail(&new_fcport->list, new_fcports);
2722
2723                /* Allocate a new replacement fcport. */
2724                nxt_d_id.b24 = new_fcport->d_id.b24;
2725                new_fcport = qla2x00_alloc_fcport(ha, GFP_KERNEL);
2726                if (new_fcport == NULL) {
2727                        kfree(swl);
2728                        return (QLA_MEMORY_ALLOC_FAILED);
2729                }
2730                new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED);
2731                new_fcport->d_id.b24 = nxt_d_id.b24;
2732                new_fcport->vp_idx = ha->vp_idx;
2733        }
2734
2735        kfree(swl);
2736        kfree(new_fcport);
2737
2738        if (!list_empty(new_fcports))
2739                ha->device_flags |= DFLG_FABRIC_DEVICES;
2740
2741        return (rval);
2742}
2743
2744/*
2745 * qla2x00_find_new_loop_id
2746 *      Scan through our port list and find a new usable loop ID.
2747 *
2748 * Input:
2749 *      ha:     adapter state pointer.
2750 *      dev:    port structure pointer.
2751 *
2752 * Returns:
2753 *      qla2x00 local function return status code.
2754 *
2755 * Context:
2756 *      Kernel context.
2757 */
2758static int
2759qla2x00_find_new_loop_id(scsi_qla_host_t *ha, fc_port_t *dev)
2760{
2761        int     rval;
2762        int     found;
2763        fc_port_t *fcport;
2764        uint16_t first_loop_id;
2765        scsi_qla_host_t *pha = to_qla_parent(ha);
2766
2767        rval = QLA_SUCCESS;
2768
2769        /* Save starting loop ID. */
2770        first_loop_id = dev->loop_id;
2771
2772        for (;;) {
2773                /* Skip loop ID if already used by adapter. */
2774                if (dev->loop_id == ha->loop_id) {
2775                        dev->loop_id++;
2776                }
2777
2778                /* Skip reserved loop IDs. */
2779                while (qla2x00_is_reserved_id(ha, dev->loop_id)) {
2780                        dev->loop_id++;
2781                }
2782
2783                /* Reset loop ID if passed the end. */
2784                if (dev->loop_id > ha->last_loop_id) {
2785                        /* first loop ID. */
2786                        dev->loop_id = ha->min_external_loopid;
2787                }
2788
2789                /* Check for loop ID being already in use. */
2790                found = 0;
2791                fcport = NULL;
2792                list_for_each_entry(fcport, &pha->fcports, list) {
2793                        if (fcport->loop_id == dev->loop_id && fcport != dev) {
2794                                /* ID possibly in use */
2795                                found++;
2796                                break;
2797                        }
2798                }
2799
2800                /* If not in use then it is free to use. */
2801                if (!found) {
2802                        break;
2803                }
2804
2805                /* ID in use. Try next value. */
2806                dev->loop_id++;
2807
2808                /* If wrap around. No free ID to use. */
2809                if (dev->loop_id == first_loop_id) {
2810                        dev->loop_id = FC_NO_LOOP_ID;
2811                        rval = QLA_FUNCTION_FAILED;
2812                        break;
2813                }
2814        }
2815
2816        return (rval);
2817}
2818
2819/*
2820 * qla2x00_device_resync
2821 *      Marks devices in the database that needs resynchronization.
2822 *
2823 * Input:
2824 *      ha = adapter block pointer.
2825 *
2826 * Context:
2827 *      Kernel context.
2828 */
2829static int
2830qla2x00_device_resync(scsi_qla_host_t *ha)
2831{
2832        int     rval;
2833        uint32_t mask;
2834        fc_port_t *fcport;
2835        uint32_t rscn_entry;
2836        uint8_t rscn_out_iter;
2837        uint8_t format;
2838        port_id_t d_id;
2839        scsi_qla_host_t *pha = to_qla_parent(ha);
2840
2841        rval = QLA_RSCNS_HANDLED;
2842
2843        while (ha->rscn_out_ptr != ha->rscn_in_ptr ||
2844            ha->flags.rscn_queue_overflow) {
2845
2846                rscn_entry = ha->rscn_queue[ha->rscn_out_ptr];
2847                format = MSB(MSW(rscn_entry));
2848                d_id.b.domain = LSB(MSW(rscn_entry));
2849                d_id.b.area = MSB(LSW(rscn_entry));
2850                d_id.b.al_pa = LSB(LSW(rscn_entry));
2851
2852                DEBUG(printk("scsi(%ld): RSCN queue entry[%d] = "
2853                    "[%02x/%02x%02x%02x].\n",
2854                    ha->host_no, ha->rscn_out_ptr, format, d_id.b.domain,
2855                    d_id.b.area, d_id.b.al_pa));
2856
2857                ha->rscn_out_ptr++;
2858                if (ha->rscn_out_ptr == MAX_RSCN_COUNT)
2859                        ha->rscn_out_ptr = 0;
2860
2861                /* Skip duplicate entries. */
2862                for (rscn_out_iter = ha->rscn_out_ptr;
2863                    !ha->flags.rscn_queue_overflow &&
2864                    rscn_out_iter != ha->rscn_in_ptr;
2865                    rscn_out_iter = (rscn_out_iter ==
2866                        (MAX_RSCN_COUNT - 1)) ? 0: rscn_out_iter + 1) {
2867
2868                        if (rscn_entry != ha->rscn_queue[rscn_out_iter])
2869                                break;
2870
2871                        DEBUG(printk("scsi(%ld): Skipping duplicate RSCN queue "
2872                            "entry found at [%d].\n", ha->host_no,
2873                            rscn_out_iter));
2874
2875                        ha->rscn_out_ptr = rscn_out_iter;
2876                }
2877
2878                /* Queue overflow, set switch default case. */
2879                if (ha->flags.rscn_queue_overflow) {
2880                        DEBUG(printk("scsi(%ld): device_resync: rscn "
2881                            "overflow.\n", ha->host_no));
2882
2883                        format = 3;
2884                        ha->flags.rscn_queue_overflow = 0;
2885                }
2886
2887                switch (format) {
2888                case 0:
2889                        mask = 0xffffff;
2890                        break;
2891                case 1:
2892                        mask = 0xffff00;
2893                        break;
2894                case 2:
2895                        mask = 0xff0000;
2896                        break;
2897                default:
2898                        mask = 0x0;
2899                        d_id.b24 = 0;
2900                        ha->rscn_out_ptr = ha->rscn_in_ptr;
2901                        break;
2902                }
2903
2904                rval = QLA_SUCCESS;
2905
2906                list_for_each_entry(fcport, &pha->fcports, list) {
2907                        if (fcport->vp_idx != ha->vp_idx)
2908                                continue;
2909
2910                        if ((fcport->flags & FCF_FABRIC_DEVICE) == 0 ||
2911                            (fcport->d_id.b24 & mask) != d_id.b24 ||
2912                            fcport->port_type == FCT_BROADCAST)
2913                                continue;
2914
2915                        if (atomic_read(&fcport->state) == FCS_ONLINE) {
2916                                if (format != 3 ||
2917                                    fcport->port_type != FCT_INITIATOR) {
2918                                        qla2x00_mark_device_lost(ha, fcport,
2919                                            0, 0);
2920                                }
2921                        }
2922                        fcport->flags &= ~FCF_FARP_DONE;
2923                }
2924        }
2925        return (rval);
2926}
2927
2928/*
2929 * qla2x00_fabric_dev_login
2930 *      Login fabric target device and update FC port database.
2931 *
2932 * Input:
2933 *      ha:             adapter state pointer.
2934 *      fcport:         port structure list pointer.
2935 *      next_loopid:    contains value of a new loop ID that can be used
2936 *                      by the next login attempt.
2937 *
2938 * Returns:
2939 *      qla2x00 local function return status code.
2940 *
2941 * Context:
2942 *      Kernel context.
2943 */
2944static int
2945qla2x00_fabric_dev_login(scsi_qla_host_t *ha, fc_port_t *fcport,
2946    uint16_t *next_loopid)
2947{
2948        int     rval;
2949        int     retry;
2950        uint8_t opts;
2951
2952        rval = QLA_SUCCESS;
2953        retry = 0;
2954
2955        rval = qla2x00_fabric_login(ha, fcport, next_loopid);
2956        if (rval == QLA_SUCCESS) {
2957                /* Send an ADISC to tape devices.*/
2958                opts = 0;
2959                if (fcport->flags & FCF_TAPE_PRESENT)
2960                        opts |= BIT_1;
2961                rval = qla2x00_get_port_database(ha, fcport, opts);
2962                if (rval != QLA_SUCCESS) {
2963                        ha->isp_ops->fabric_logout(ha, fcport->loop_id,
2964                            fcport->d_id.b.domain, fcport->d_id.b.area,
2965                            fcport->d_id.b.al_pa);
2966                        qla2x00_mark_device_lost(ha, fcport, 1, 0);
2967                } else {
2968                        qla2x00_update_fcport(ha, fcport);
2969                }
2970        }
2971
2972        return (rval);
2973}
2974
2975/*
2976 * qla2x00_fabric_login
2977 *      Issue fabric login command.
2978 *
2979 * Input:
2980 *      ha = adapter block pointer.
2981 *      device = pointer to FC device type structure.
2982 *
2983 * Returns:
2984 *      0 - Login successfully
2985 *      1 - Login failed
2986 *      2 - Initiator device
2987 *      3 - Fatal error
2988 */
2989int
2990qla2x00_fabric_login(scsi_qla_host_t *ha, fc_port_t *fcport,
2991    uint16_t *next_loopid)
2992{
2993        int     rval;
2994        int     retry;
2995        uint16_t tmp_loopid;
2996        uint16_t mb[MAILBOX_REGISTER_COUNT];
2997
2998        retry = 0;
2999        tmp_loopid = 0;
3000
3001        for (;;) {
3002                DEBUG(printk("scsi(%ld): Trying Fabric Login w/loop id 0x%04x "
3003                    "for port %02x%02x%02x.\n",
3004                    ha->host_no, fcport->loop_id, fcport->d_id.b.domain,
3005                    fcport->d_id.b.area, fcport->d_id.b.al_pa));
3006
3007                /* Login fcport on switch. */
3008                ha->isp_ops->fabric_login(ha, fcport->loop_id,
3009                    fcport->d_id.b.domain, fcport->d_id.b.area,
3010                    fcport->d_id.b.al_pa, mb, BIT_0);
3011                if (mb[0] == MBS_PORT_ID_USED) {
3012                        /*
3013                         * Device has another loop ID.  The firmware team
3014                         * recommends the driver perform an implicit login with
3015                         * the specified ID again. The ID we just used is save
3016                         * here so we return with an ID that can be tried by
3017                         * the next login.
3018                         */
3019                        retry++;
3020                        tmp_loopid = fcport->loop_id;
3021                        fcport->loop_id = mb[1];
3022
3023                        DEBUG(printk("Fabric Login: port in use - next "
3024                            "loop id=0x%04x, port Id=%02x%02x%02x.\n",
3025                            fcport->loop_id, fcport->d_id.b.domain,
3026                            fcport->d_id.b.area, fcport->d_id.b.al_pa));
3027
3028                } else if (mb[0] == MBS_COMMAND_COMPLETE) {
3029                        /*
3030                         * Login succeeded.
3031                         */
3032                        if (retry) {
3033                                /* A retry occurred before. */
3034                                *next_loopid = tmp_loopid;
3035                        } else {
3036                                /*
3037                                 * No retry occurred before. Just increment the
3038                                 * ID value for next login.
3039                                 */
3040                                *next_loopid = (fcport->loop_id + 1);
3041                        }
3042
3043                        if (mb[1] & BIT_0) {
3044                                fcport->port_type = FCT_INITIATOR;
3045                        } else {
3046                                fcport->port_type = FCT_TARGET;
3047                                if (mb[1] & BIT_1) {
3048                                        fcport->flags |= FCF_TAPE_PRESENT;
3049                                }
3050                        }
3051
3052                        if (mb[10] & BIT_0)
3053                                fcport->supported_classes |= FC_COS_CLASS2;
3054                        if (mb[10] & BIT_1)
3055                                fcport->supported_classes |= FC_COS_CLASS3;
3056
3057                        rval = QLA_SUCCESS;
3058                        break;
3059                } else if (mb[0] == MBS_LOOP_ID_USED) {
3060                        /*
3061                         * Loop ID already used, try next loop ID.
3062                         */
3063                        fcport->loop_id++;
3064                        rval = qla2x00_find_new_loop_id(ha, fcport);
3065                        if (rval != QLA_SUCCESS) {
3066                                /* Ran out of loop IDs to use */
3067                                break;
3068                        }
3069                } else if (mb[0] == MBS_COMMAND_ERROR) {
3070                        /*
3071                         * Firmware possibly timed out during login. If NO
3072                         * retries are left to do then the device is declared
3073                         * dead.
3074                         */
3075                        *next_loopid = fcport->loop_id;
3076                        ha->isp_ops->fabric_logout(ha, fcport->loop_id,
3077                            fcport->d_id.b.domain, fcport->d_id.b.area,
3078                            fcport->d_id.b.al_pa);
3079                        qla2x00_mark_device_lost(ha, fcport, 1, 0);
3080
3081                        rval = 1;
3082                        break;
3083                } else {
3084                        /*
3085                         * unrecoverable / not handled error
3086                         */
3087                        DEBUG2(printk("%s(%ld): failed=%x port_id=%02x%02x%02x "
3088                            "loop_id=%x jiffies=%lx.\n",
3089                            __func__, ha->host_no, mb[0],
3090                            fcport->d_id.b.domain, fcport->d_id.b.area,
3091                            fcport->d_id.b.al_pa, fcport->loop_id, jiffies));
3092
3093                        *next_loopid = fcport->loop_id;
3094                        ha->isp_ops->fabric_logout(ha, fcport->loop_id,
3095                            fcport->d_id.b.domain, fcport->d_id.b.area,
3096                            fcport->d_id.b.al_pa);
3097                        fcport->loop_id = FC_NO_LOOP_ID;
3098                        fcport->login_retry = 0;
3099
3100                        rval = 3;
3101                        break;
3102                }
3103        }
3104
3105        return (rval);
3106}
3107
3108/*
3109 * qla2x00_local_device_login
3110 *      Issue local device login command.
3111 *
3112 * Input:
3113 *      ha = adapter block pointer.
3114 *      loop_id = loop id of device to login to.
3115 *
3116 * Returns (Where's the #define!!!!):
3117 *      0 - Login successfully
3118 *      1 - Login failed
3119 *      3 - Fatal error
3120 */
3121int
3122qla2x00_local_device_login(scsi_qla_host_t *ha, fc_port_t *fcport)
3123{
3124        int             rval;
3125        uint16_t        mb[MAILBOX_REGISTER_COUNT];
3126
3127        memset(mb, 0, sizeof(mb));
3128        rval = qla2x00_login_local_device(ha, fcport, mb, BIT_0);
3129        if (rval == QLA_SUCCESS) {
3130                /* Interrogate mailbox registers for any errors */
3131                if (mb[0] == MBS_COMMAND_ERROR)
3132                        rval = 1;
3133                else if (mb[0] == MBS_COMMAND_PARAMETER_ERROR)
3134                        /* device not in PCB table */
3135                        rval = 3;
3136        }
3137
3138        return (rval);
3139}
3140
3141/*
3142 *  qla2x00_loop_resync
3143 *      Resync with fibre channel devices.
3144 *
3145 * Input:
3146 *      ha = adapter block pointer.
3147 *
3148 * Returns:
3149 *      0 = success
3150 */
3151int
3152qla2x00_loop_resync(scsi_qla_host_t *ha)
3153{
3154        int   rval;
3155        uint32_t wait_time;
3156
3157        rval = QLA_SUCCESS;
3158
3159        atomic_set(&ha->loop_state, LOOP_UPDATE);
3160        clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags);
3161        if (ha->flags.online) {
3162                if (!(rval = qla2x00_fw_ready(ha))) {
3163                        /* Wait at most MAX_TARGET RSCNs for a stable link. */
3164                        wait_time = 256;
3165                        do {
3166                                atomic_set(&ha->loop_state, LOOP_UPDATE);
3167
3168                                /* Issue a marker after FW becomes ready. */
3169                                qla2x00_marker(ha, 0, 0, MK_SYNC_ALL);
3170                                ha->marker_needed = 0;
3171
3172                                /* Remap devices on Loop. */
3173                                clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
3174
3175                                qla2x00_configure_loop(ha);
3176                                wait_time--;
3177                        } while (!atomic_read(&ha->loop_down_timer) &&
3178                                !(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) &&
3179                                wait_time &&
3180                                (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)));
3181                }
3182        }
3183
3184        if (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) {
3185                return (QLA_FUNCTION_FAILED);
3186        }
3187
3188        if (rval) {
3189                DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__));
3190        }
3191
3192        return (rval);
3193}
3194
3195void
3196qla2x00_rescan_fcports(scsi_qla_host_t *ha)
3197{
3198        int rescan_done;
3199        fc_port_t *fcport;
3200
3201        rescan_done = 0;
3202        list_for_each_entry(fcport, &ha->fcports, list) {
3203                if ((fcport->flags & FCF_RESCAN_NEEDED) == 0)
3204                        continue;
3205
3206                qla2x00_update_fcport(ha, fcport);
3207                fcport->flags &= ~FCF_RESCAN_NEEDED;
3208
3209                rescan_done = 1;
3210        }
3211        qla2x00_probe_for_all_luns(ha);
3212}
3213
3214void
3215qla2x00_update_fcports(scsi_qla_host_t *ha)
3216{
3217        fc_port_t *fcport;
3218
3219        /* Go with deferred removal of rport references. */
3220        list_for_each_entry(fcport, &ha->fcports, list)
3221                if (fcport->drport)
3222                        qla2x00_rport_del(fcport);
3223}
3224
3225/*
3226*  qla2x00_abort_isp
3227*      Resets ISP and aborts all outstanding commands.
3228*
3229* Input:
3230*      ha           = adapter block pointer.
3231*
3232* Returns:
3233*      0 = success
3234*/
3235int
3236qla2x00_abort_isp(scsi_qla_host_t *ha)
3237{
3238        int rval;
3239        uint8_t        status = 0;
3240
3241        if (ha->flags.online) {
3242                ha->flags.online = 0;
3243                clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
3244
3245                qla_printk(KERN_INFO, ha,
3246                    "Performing ISP error recovery - ha= %p.\n", ha);
3247                ha->isp_ops->reset_chip(ha);
3248
3249                atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
3250                if (atomic_read(&ha->loop_state) != LOOP_DOWN) {
3251                        atomic_set(&ha->loop_state, LOOP_DOWN);
3252                        qla2x00_mark_all_devices_lost(ha, 0);
3253                } else {
3254                        if (!atomic_read(&ha->loop_down_timer))
3255                                atomic_set(&ha->loop_down_timer,
3256                                    LOOP_DOWN_TIME);
3257                }
3258
3259                /* Requeue all commands in outstanding command list. */
3260                qla2x00_abort_all_cmds(ha, DID_RESET << 16);
3261
3262                ha->isp_ops->get_flash_version(ha, ha->request_ring);
3263
3264                ha->isp_ops->nvram_config(ha);
3265
3266                if (!qla2x00_restart_isp(ha)) {
3267                        clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
3268
3269                        if (!atomic_read(&ha->loop_down_timer)) {
3270                                /*
3271                                 * Issue marker command only when we are going
3272                                 * to start the I/O .
3273                                 */
3274                                ha->marker_needed = 1;
3275                        }
3276
3277                        ha->flags.online = 1;
3278
3279                        ha->isp_ops->enable_intrs(ha);
3280
3281                        ha->isp_abort_cnt = 0;
3282                        clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags);
3283
3284                        if (ha->eft) {
3285                                memset(ha->eft, 0, EFT_SIZE);
3286                                rval = qla2x00_enable_eft_trace(ha,
3287                                    ha->eft_dma, EFT_NUM_BUFFERS);
3288                                if (rval) {
3289                                        qla_printk(KERN_WARNING, ha,
3290                                            "Unable to reinitialize EFT "
3291                                            "(%d).\n", rval);
3292                                }
3293                        }
3294
3295                        if (ha->fce) {
3296                                ha->flags.fce_enabled = 1;
3297                                memset(ha->fce, 0,
3298                                    fce_calc_size(ha->fce_bufs));
3299                                rval = qla2x00_enable_fce_trace(ha,
3300                                    ha->fce_dma, ha->fce_bufs, ha->fce_mb,
3301                                    &ha->fce_bufs);
3302                                if (rval) {
3303                                        qla_printk(KERN_WARNING, ha,
3304                                            "Unable to reinitialize FCE "
3305                                            "(%d).\n", rval);
3306                                        ha->flags.fce_enabled = 0;
3307                                }
3308                        }
3309                } else {        /* failed the ISP abort */
3310                        ha->flags.online = 1;
3311                        if (test_bit(ISP_ABORT_RETRY, &ha->dpc_flags)) {
3312                                if (ha->isp_abort_cnt == 0) {
3313                                        qla_printk(KERN_WARNING, ha,
3314                                            "ISP error recovery failed - "
3315                                            "board disabled\n");
3316                                        /*
3317                                         * The next call disables the board
3318                                         * completely.
3319                                         */
3320                                        ha->isp_ops->reset_adapter(ha);
3321                                        ha->flags.online = 0;
3322                                        clear_bit(ISP_ABORT_RETRY,
3323                                            &ha->dpc_flags);
3324                                        status = 0;
3325                                } else { /* schedule another ISP abort */
3326                                        ha->isp_abort_cnt--;
3327                                        DEBUG(printk("qla%ld: ISP abort - "
3328                                            "retry remaining %d\n",
3329                                            ha->host_no, ha->isp_abort_cnt));
3330                                        status = 1;
3331                                }
3332                        } else {
3333                                ha->isp_abort_cnt = MAX_RETRIES_OF_ISP_ABORT;
3334                                DEBUG(printk("qla2x00(%ld): ISP error recovery "
3335                                    "- retrying (%d) more times\n",
3336                                    ha->host_no, ha->isp_abort_cnt));
3337                                set_bit(ISP_ABORT_RETRY, &ha->dpc_flags);
3338                                status = 1;
3339                        }
3340                }
3341
3342        }
3343
3344        if (status) {
3345                qla_printk(KERN_INFO, ha,
3346                        "qla2x00_abort_isp: **** FAILED ****\n");
3347        } else {
3348                DEBUG(printk(KERN_INFO
3349                                "qla2x00_abort_isp(%ld): exiting.\n",
3350                                ha->host_no));
3351        }
3352
3353        return(status);
3354}
3355
3356/*
3357*  qla2x00_restart_isp
3358*      restarts the ISP after a reset
3359*
3360* Input:
3361*      ha = adapter block pointer.
3362*
3363* Returns:
3364*      0 = success
3365*/
3366static int
3367qla2x00_restart_isp(scsi_qla_host_t *ha)
3368{
3369        uint8_t         status = 0;
3370        uint32_t wait_time;
3371
3372        /* If firmware needs to be loaded */
3373        if (qla2x00_isp_firmware(ha)) {
3374                ha->flags.online = 0;
3375                if (!(status = ha->isp_ops->chip_diag(ha)))
3376                        status = qla2x00_setup_chip(ha);
3377        }
3378
3379        if (!status && !(status = qla2x00_init_rings(ha))) {
3380                clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
3381                if (!(status = qla2x00_fw_ready(ha))) {
3382                        DEBUG(printk("%s(): Start configure loop, "
3383                            "status = %d\n", __func__, status));
3384
3385                        /* Issue a marker after FW becomes ready. */
3386                        qla2x00_marker(ha, 0, 0, MK_SYNC_ALL);
3387
3388                        ha->flags.online = 1;
3389                        /* Wait at most MAX_TARGET RSCNs for a stable link. */
3390                        wait_time = 256;
3391                        do {
3392                                clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
3393                                qla2x00_configure_loop(ha);
3394                                wait_time--;
3395                        } while (!atomic_read(&ha->loop_down_timer) &&
3396                                !(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) &&
3397                                wait_time &&
3398                                (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)));
3399                }
3400
3401                /* if no cable then assume it's good */
3402                if ((ha->device_flags & DFLG_NO_CABLE))
3403                        status = 0;
3404
3405                DEBUG(printk("%s(): Configure loop done, status = 0x%x\n",
3406                                __func__,
3407                                status));
3408        }
3409        return (status);
3410}
3411
3412/*
3413* qla2x00_reset_adapter
3414*      Reset adapter.
3415*
3416* Input:
3417*      ha = adapter block pointer.
3418*/
3419void
3420qla2x00_reset_adapter(scsi_qla_host_t *ha)
3421{
3422        unsigned long flags = 0;
3423        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
3424
3425        ha->flags.online = 0;
3426        ha->isp_ops->disable_intrs(ha);
3427
3428        spin_lock_irqsave(&ha->hardware_lock, flags);
3429        WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
3430        RD_REG_WORD(&reg->hccr);                        /* PCI Posting. */
3431        WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
3432        RD_REG_WORD(&reg->hccr);                        /* PCI Posting. */
3433        spin_unlock_irqrestore(&ha->hardware_lock, flags);
3434}
3435
3436void
3437qla24xx_reset_adapter(scsi_qla_host_t *ha)
3438{
3439        unsigned long flags = 0;
3440        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
3441
3442        ha->flags.online = 0;
3443        ha->isp_ops->disable_intrs(ha);
3444
3445        spin_lock_irqsave(&ha->hardware_lock, flags);
3446        WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET);
3447        RD_REG_DWORD(&reg->hccr);
3448        WRT_REG_DWORD(&reg->hccr, HCCRX_REL_RISC_PAUSE);
3449        RD_REG_DWORD(&reg->hccr);
3450        spin_unlock_irqrestore(&ha->hardware_lock, flags);
3451}
3452
3453/* On sparc systems, obtain port and node WWN from firmware
3454 * properties.
3455 */
3456static void qla24xx_nvram_wwn_from_ofw(scsi_qla_host_t *ha, struct nvram_24xx *nv)
3457{
3458#ifdef CONFIG_SPARC
3459        struct pci_dev *pdev = ha->pdev;
3460        struct device_node *dp = pci_device_to_OF_node(pdev);
3461        const u8 *val;
3462        int len;
3463
3464        val = of_get_property(dp, "port-wwn", &len);
3465        if (val && len >= WWN_SIZE)
3466                memcpy(nv->port_name, val, WWN_SIZE);
3467
3468        val = of_get_property(dp, "node-wwn", &len);
3469        if (val && len >= WWN_SIZE)
3470                memcpy(nv->node_name, val, WWN_SIZE);
3471#endif
3472}
3473
3474int
3475qla24xx_nvram_config(scsi_qla_host_t *ha)
3476{
3477        int   rval;
3478        struct init_cb_24xx *icb;
3479        struct nvram_24xx *nv;
3480        uint32_t *dptr;
3481        uint8_t  *dptr1, *dptr2;
3482        uint32_t chksum;
3483        uint16_t cnt;
3484
3485        rval = QLA_SUCCESS;
3486        icb = (struct init_cb_24xx *)ha->init_cb;
3487        nv = ha->nvram;
3488
3489        /* Determine NVRAM starting address. */
3490        ha->nvram_size = sizeof(struct nvram_24xx);
3491        ha->nvram_base = FA_NVRAM_FUNC0_ADDR;
3492        ha->vpd_size = FA_NVRAM_VPD_SIZE;
3493        ha->vpd_base = FA_NVRAM_VPD0_ADDR;
3494        if (PCI_FUNC(ha->pdev->devfn)) {
3495                ha->nvram_base = FA_NVRAM_FUNC1_ADDR;
3496                ha->vpd_base = FA_NVRAM_VPD1_ADDR;
3497        }
3498
3499        /* Get VPD data into cache */
3500        ha->vpd = ha->nvram + VPD_OFFSET;
3501        ha->isp_ops->read_nvram(ha, (uint8_t *)ha->vpd,
3502            ha->nvram_base - FA_NVRAM_FUNC0_ADDR, FA_NVRAM_VPD_SIZE * 4);
3503
3504        /* Get NVRAM data into cache and calculate checksum. */
3505        dptr = (uint32_t *)nv;
3506        ha->isp_ops->read_nvram(ha, (uint8_t *)dptr, ha->nvram_base,
3507            ha->nvram_size);
3508        for (cnt = 0, chksum = 0; cnt < ha->nvram_size >> 2; cnt++)
3509                chksum += le32_to_cpu(*dptr++);
3510
3511        DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no));
3512        DEBUG5(qla2x00_dump_buffer((uint8_t *)nv, ha->nvram_size));
3513
3514        /* Bad NVRAM data, set defaults parameters. */
3515        if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P'
3516            || nv->id[3] != ' ' ||
3517            nv->nvram_version < __constant_cpu_to_le16(ICB_VERSION)) {
3518                /* Reset NVRAM data. */
3519                qla_printk(KERN_WARNING, ha, "Inconsistent NVRAM detected: "
3520                    "checksum=0x%x id=%c version=0x%x.\n", chksum, nv->id[0],
3521                    le16_to_cpu(nv->nvram_version));
3522                qla_printk(KERN_WARNING, ha, "Falling back to functioning (yet "
3523                    "invalid -- WWPN) defaults.\n");
3524
3525                /*
3526                 * Set default initialization control block.
3527                 */
3528                memset(nv, 0, ha->nvram_size);
3529                nv->nvram_version = __constant_cpu_to_le16(ICB_VERSION);
3530                nv->version = __constant_cpu_to_le16(ICB_VERSION);
3531                nv->frame_payload_size = __constant_cpu_to_le16(2048);
3532                nv->execution_throttle = __constant_cpu_to_le16(0xFFFF);
3533                nv->exchange_count = __constant_cpu_to_le16(0);
3534                nv->hard_address = __constant_cpu_to_le16(124);
3535                nv->port_name[0] = 0x21;
3536                nv->port_name[1] = 0x00 + PCI_FUNC(ha->pdev->devfn);
3537                nv->port_name[2] = 0x00;
3538                nv->port_name[3] = 0xe0;
3539                nv->port_name[4] = 0x8b;
3540                nv->port_name[5] = 0x1c;
3541                nv->port_name[6] = 0x55;
3542                nv->port_name[7] = 0x86;
3543                nv->node_name[0] = 0x20;
3544                nv->node_name[1] = 0x00;
3545                nv->node_name[2] = 0x00;
3546                nv->node_name[3] = 0xe0;
3547                nv->node_name[4] = 0x8b;
3548                nv->node_name[5] = 0x1c;
3549                nv->node_name[6] = 0x55;
3550                nv->node_name[7] = 0x86;
3551                qla24xx_nvram_wwn_from_ofw(ha, nv);
3552                nv->login_retry_count = __constant_cpu_to_le16(8);
3553                nv->interrupt_delay_timer = __constant_cpu_to_le16(0);
3554                nv->login_timeout = __constant_cpu_to_le16(0);
3555                nv->firmware_options_1 =
3556                    __constant_cpu_to_le32(BIT_14|BIT_13|BIT_2|BIT_1);
3557                nv->firmware_options_2 = __constant_cpu_to_le32(2 << 4);
3558                nv->firmware_options_2 |= __constant_cpu_to_le32(BIT_12);
3559                nv->firmware_options_3 = __constant_cpu_to_le32(2 << 13);
3560                nv->host_p = __constant_cpu_to_le32(BIT_11|BIT_10);
3561                nv->efi_parameters = __constant_cpu_to_le32(0);
3562                nv->reset_delay = 5;
3563                nv->max_luns_per_target = __constant_cpu_to_le16(128);
3564                nv->port_down_retry_count = __constant_cpu_to_le16(30);
3565                nv->link_down_timeout = __constant_cpu_to_le16(30);
3566
3567                rval = 1;
3568        }
3569
3570        /* Reset Initialization control block */
3571        memset(icb, 0, sizeof(struct init_cb_24xx));
3572
3573        /* Copy 1st segment. */
3574        dptr1 = (uint8_t *)icb;
3575        dptr2 = (uint8_t *)&nv->version;
3576        cnt = (uint8_t *)&icb->response_q_inpointer - (uint8_t *)&icb->version;
3577        while (cnt--)
3578                *dptr1++ = *dptr2++;
3579
3580        icb->login_retry_count = nv->login_retry_count;
3581        icb->link_down_on_nos = nv->link_down_on_nos;
3582
3583        /* Copy 2nd segment. */
3584        dptr1 = (uint8_t *)&icb->interrupt_delay_timer;
3585        dptr2 = (uint8_t *)&nv->interrupt_delay_timer;
3586        cnt = (uint8_t *)&icb->reserved_3 -
3587            (uint8_t *)&icb->interrupt_delay_timer;
3588        while (cnt--)
3589                *dptr1++ = *dptr2++;
3590
3591        /*
3592         * Setup driver NVRAM options.
3593         */
3594        qla2x00_set_model_info(ha, nv->model_name, sizeof(nv->model_name),
3595            "QLA2462");
3596
3597        /* Use alternate WWN? */
3598        if (nv->host_p & __constant_cpu_to_le32(BIT_15)) {
3599                memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE);
3600                memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE);
3601        }
3602
3603        /* Prepare nodename */
3604        if ((icb->firmware_options_1 & __constant_cpu_to_le32(BIT_14)) == 0) {
3605                /*
3606                 * Firmware will apply the following mask if the nodename was
3607                 * not provided.
3608                 */
3609                memcpy(icb->node_name, icb->port_name, WWN_SIZE);
3610                icb->node_name[0] &= 0xF0;
3611        }
3612
3613        /* Set host adapter parameters. */
3614        ha->flags.disable_risc_code_load = 0;
3615        ha->flags.enable_lip_reset = 0;
3616        ha->flags.enable_lip_full_login =
3617            le32_to_cpu(nv->host_p) & BIT_10 ? 1: 0;
3618        ha->flags.enable_target_reset =
3619            le32_to_cpu(nv->host_p) & BIT_11 ? 1: 0;
3620        ha->flags.enable_led_scheme = 0;
3621        ha->flags.disable_serdes = le32_to_cpu(nv->host_p) & BIT_5 ? 1: 0;
3622
3623        ha->operating_mode = (le32_to_cpu(icb->firmware_options_2) &
3624            (BIT_6 | BIT_5 | BIT_4)) >> 4;
3625
3626        memcpy(ha->fw_seriallink_options24, nv->seriallink_options,
3627            sizeof(ha->fw_seriallink_options24));
3628
3629        /* save HBA serial number */
3630        ha->serial0 = icb->port_name[5];
3631        ha->serial1 = icb->port_name[6];
3632        ha->serial2 = icb->port_name[7];
3633        ha->node_name = icb->node_name;
3634        ha->port_name = icb->port_name;
3635
3636        icb->execution_throttle = __constant_cpu_to_le16(0xFFFF);
3637
3638        ha->retry_count = le16_to_cpu(nv->login_retry_count);
3639
3640        /* Set minimum login_timeout to 4 seconds. */
3641        if (le16_to_cpu(nv->login_timeout) < ql2xlogintimeout)
3642                nv->login_timeout = cpu_to_le16(ql2xlogintimeout);
3643        if (le16_to_cpu(nv->login_timeout) < 4)
3644                nv->login_timeout = __constant_cpu_to_le16(4);
3645        ha->login_timeout = le16_to_cpu(nv->login_timeout);
3646        icb->login_timeout = cpu_to_le16(nv->login_timeout);
3647
3648        /* Set minimum RATOV to 100 tenths of a second. */
3649        ha->r_a_tov = 100;
3650
3651        ha->loop_reset_delay = nv->reset_delay;
3652
3653        /* Link Down Timeout = 0:
3654         *
3655         *      When Port Down timer expires we will start returning
3656         *      I/O's to OS with "DID_NO_CONNECT".
3657         *
3658         * Link Down Timeout != 0:
3659         *
3660         *       The driver waits for the link to come up after link down
3661         *       before returning I/Os to OS with "DID_NO_CONNECT".
3662         */
3663        if (le16_to_cpu(nv->link_down_timeout) == 0) {
3664                ha->loop_down_abort_time =
3665                    (LOOP_DOWN_TIME - LOOP_DOWN_TIMEOUT);
3666        } else {
3667                ha->link_down_timeout = le16_to_cpu(nv->link_down_timeout);
3668                ha->loop_down_abort_time =
3669                    (LOOP_DOWN_TIME - ha->link_down_timeout);
3670        }
3671
3672        /* Need enough time to try and get the port back. */
3673        ha->port_down_retry_count = le16_to_cpu(nv->port_down_retry_count);
3674        if (qlport_down_retry)
3675                ha->port_down_retry_count = qlport_down_retry;
3676
3677        /* Set login_retry_count */
3678        ha->login_retry_count  = le16_to_cpu(nv->login_retry_count);
3679        if (ha->port_down_retry_count ==
3680            le16_to_cpu(nv->port_down_retry_count) &&
3681            ha->port_down_retry_count > 3)
3682                ha->login_retry_count = ha->port_down_retry_count;
3683        else if (ha->port_down_retry_count > (int)ha->login_retry_count)
3684                ha->login_retry_count = ha->port_down_retry_count;
3685        if (ql2xloginretrycount)
3686                ha->login_retry_count = ql2xloginretrycount;
3687
3688        /* Enable ZIO. */
3689        if (!ha->flags.init_done) {
3690                ha->zio_mode = le32_to_cpu(icb->firmware_options_2) &
3691                    (BIT_3 | BIT_2 | BIT_1 | BIT_0);
3692                ha->zio_timer = le16_to_cpu(icb->interrupt_delay_timer) ?
3693                    le16_to_cpu(icb->interrupt_delay_timer): 2;
3694        }
3695        icb->firmware_options_2 &= __constant_cpu_to_le32(
3696            ~(BIT_3 | BIT_2 | BIT_1 | BIT_0));
3697        ha->flags.process_response_queue = 0;
3698        if (ha->zio_mode != QLA_ZIO_DISABLED) {
3699                ha->zio_mode = QLA_ZIO_MODE_6;
3700
3701                DEBUG2(printk("scsi(%ld): ZIO mode %d enabled; timer delay "
3702                    "(%d us).\n", ha->host_no, ha->zio_mode,
3703                    ha->zio_timer * 100));
3704                qla_printk(KERN_INFO, ha,
3705                    "ZIO mode %d enabled; timer delay (%d us).\n",
3706                    ha->zio_mode, ha->zio_timer * 100);
3707
3708                icb->firmware_options_2 |= cpu_to_le32(
3709                    (uint32_t)ha->zio_mode);
3710                icb->interrupt_delay_timer = cpu_to_le16(ha->zio_timer);
3711                ha->flags.process_response_queue = 1;
3712        }
3713
3714        if (rval) {
3715                DEBUG2_3(printk(KERN_WARNING
3716                    "scsi(%ld): NVRAM configuration failed!\n", ha->host_no));
3717        }
3718        return (rval);
3719}
3720
3721static int
3722qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr)
3723{
3724        int     rval;
3725        int     segments, fragment;
3726        uint32_t faddr;
3727        uint32_t *dcode, dlen;
3728        uint32_t risc_addr;
3729        uint32_t risc_size;
3730        uint32_t i;
3731
3732        rval = QLA_SUCCESS;
3733
3734        segments = FA_RISC_CODE_SEGMENTS;
3735        faddr = FA_RISC_CODE_ADDR;
3736        dcode = (uint32_t *)ha->request_ring;
3737        *srisc_addr = 0;
3738
3739        /* Validate firmware image by checking version. */
3740        qla24xx_read_flash_data(ha, dcode, faddr + 4, 4);
3741        for (i = 0; i < 4; i++)
3742                dcode[i] = be32_to_cpu(dcode[i]);
3743        if ((dcode[0] == 0xffffffff && dcode[1] == 0xffffffff &&
3744            dcode[2] == 0xffffffff && dcode[3] == 0xffffffff) ||
3745            (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 &&
3746                dcode[3] == 0)) {
3747                qla_printk(KERN_WARNING, ha,
3748                    "Unable to verify integrity of flash firmware image!\n");
3749                qla_printk(KERN_WARNING, ha,
3750                    "Firmware data: %08x %08x %08x %08x!\n", dcode[0],
3751                    dcode[1], dcode[2], dcode[3]);
3752
3753                return QLA_FUNCTION_FAILED;
3754        }
3755
3756        while (segments && rval == QLA_SUCCESS) {
3757                /* Read segment's load information. */
3758                qla24xx_read_flash_data(ha, dcode, faddr, 4);
3759
3760                risc_addr = be32_to_cpu(dcode[2]);
3761                *srisc_addr = *srisc_addr == 0 ? risc_addr : *srisc_addr;
3762                risc_size = be32_to_cpu(dcode[3]);
3763
3764                fragment = 0;
3765                while (risc_size > 0 && rval == QLA_SUCCESS) {
3766                        dlen = (uint32_t)(ha->fw_transfer_size >> 2);
3767                        if (dlen > risc_size)
3768                                dlen = risc_size;
3769
3770                        DEBUG7(printk("scsi(%ld): Loading risc segment@ risc "
3771                            "addr %x, number of dwords 0x%x, offset 0x%x.\n",
3772                            ha->host_no, risc_addr, dlen, faddr));
3773
3774                        qla24xx_read_flash_data(ha, dcode, faddr, dlen);
3775                        for (i = 0; i < dlen; i++)
3776                                dcode[i] = swab32(dcode[i]);
3777
3778                        rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr,
3779                            dlen);
3780                        if (rval) {
3781                                DEBUG(printk("scsi(%ld):[ERROR] Failed to load "
3782                                    "segment %d of firmware\n", ha->host_no,
3783                                    fragment));
3784                                qla_printk(KERN_WARNING, ha,
3785                                    "[ERROR] Failed to load segment %d of "
3786                                    "firmware\n", fragment);
3787                                break;
3788                        }
3789
3790                        faddr += dlen;
3791                        risc_addr += dlen;
3792                        risc_size -= dlen;
3793                        fragment++;
3794                }
3795
3796                /* Next segment. */
3797                segments--;
3798        }
3799
3800        return rval;
3801}
3802
3803#define QLA_FW_URL "ftp://ftp.qlogic.com/outgoing/linux/firmware/"
3804
3805int
3806qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
3807{
3808        int     rval;
3809        int     i, fragment;
3810        uint16_t *wcode, *fwcode;
3811        uint32_t risc_addr, risc_size, fwclen, wlen, *seg;
3812        struct fw_blob *blob;
3813
3814        /* Load firmware blob. */
3815        blob = qla2x00_request_firmware(ha);
3816        if (!blob) {
3817                qla_printk(KERN_ERR, ha, "Firmware image unavailable.\n");
3818                qla_printk(KERN_ERR, ha, "Firmware images can be retrieved "
3819                    "from: " QLA_FW_URL ".\n");
3820                return QLA_FUNCTION_FAILED;
3821        }
3822
3823        rval = QLA_SUCCESS;
3824
3825        wcode = (uint16_t *)ha->request_ring;
3826        *srisc_addr = 0;
3827        fwcode = (uint16_t *)blob->fw->data;
3828        fwclen = 0;
3829
3830        /* Validate firmware image by checking version. */
3831        if (blob->fw->size < 8 * sizeof(uint16_t)) {
3832                qla_printk(KERN_WARNING, ha,
3833                    "Unable to verify integrity of firmware image (%Zd)!\n",
3834                    blob->fw->size);
3835                goto fail_fw_integrity;
3836        }
3837        for (i = 0; i < 4; i++)
3838                wcode[i] = be16_to_cpu(fwcode[i + 4]);
3839        if ((wcode[0] == 0xffff && wcode[1] == 0xffff && wcode[2] == 0xffff &&
3840            wcode[3] == 0xffff) || (wcode[0] == 0 && wcode[1] == 0 &&
3841                wcode[2] == 0 && wcode[3] == 0)) {
3842                qla_printk(KERN_WARNING, ha,
3843                    "Unable to verify integrity of firmware image!\n");
3844                qla_printk(KERN_WARNING, ha,
3845                    "Firmware data: %04x %04x %04x %04x!\n", wcode[0],
3846                    wcode[1], wcode[2], wcode[3]);
3847                goto fail_fw_integrity;
3848        }
3849
3850        seg = blob->segs;
3851        while (*seg && rval == QLA_SUCCESS) {
3852                risc_addr = *seg;
3853                *srisc_addr = *srisc_addr == 0 ? *seg : *srisc_addr;
3854                risc_size = be16_to_cpu(fwcode[3]);
3855
3856                /* Validate firmware image size. */
3857                fwclen += risc_size * sizeof(uint16_t);
3858                if (blob->fw->size < fwclen) {
3859                        qla_printk(KERN_WARNING, ha,
3860                            "Unable to verify integrity of firmware image "
3861                            "(%Zd)!\n", blob->fw->size);
3862                        goto fail_fw_integrity;
3863                }
3864
3865                fragment = 0;
3866                while (risc_size > 0 && rval == QLA_SUCCESS) {
3867                        wlen = (uint16_t)(ha->fw_transfer_size >> 1);
3868                        if (wlen > risc_size)
3869                                wlen = risc_size;
3870
3871                        DEBUG7(printk("scsi(%ld): Loading risc segment@ risc "
3872                            "addr %x, number of words 0x%x.\n", ha->host_no,
3873                            risc_addr, wlen));
3874
3875                        for (i = 0; i < wlen; i++)
3876                                wcode[i] = swab16(fwcode[i]);
3877
3878                        rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr,
3879                            wlen);
3880                        if (rval) {
3881                                DEBUG(printk("scsi(%ld):[ERROR] Failed to load "
3882                                    "segment %d of firmware\n", ha->host_no,
3883                                    fragment));
3884                                qla_printk(KERN_WARNING, ha,
3885                                    "[ERROR] Failed to load segment %d of "
3886                                    "firmware\n", fragment);
3887                                break;
3888                        }
3889
3890                        fwcode += wlen;
3891                        risc_addr += wlen;
3892                        risc_size -= wlen;
3893                        fragment++;
3894                }
3895
3896                /* Next segment. */
3897                seg++;
3898        }
3899        return rval;
3900
3901fail_fw_integrity:
3902        return QLA_FUNCTION_FAILED;
3903}
3904
3905int
3906qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
3907{
3908        int     rval;
3909        int     segments, fragment;
3910        uint32_t *dcode, dlen;
3911        uint32_t risc_addr;
3912        uint32_t risc_size;
3913        uint32_t i;
3914        struct fw_blob *blob;
3915        uint32_t *fwcode, fwclen;
3916
3917        /* Load firmware blob. */
3918        blob = qla2x00_request_firmware(ha);
3919        if (!blob) {
3920                qla_printk(KERN_ERR, ha, "Firmware image unavailable.\n");
3921                qla_printk(KERN_ERR, ha, "Firmware images can be retrieved "
3922                    "from: " QLA_FW_URL ".\n");
3923
3924                /* Try to load RISC code from flash. */
3925                qla_printk(KERN_ERR, ha, "Attempting to load (potentially "
3926                    "outdated) firmware from flash.\n");
3927                return qla24xx_load_risc_flash(ha, srisc_addr);
3928        }
3929
3930        rval = QLA_SUCCESS;
3931
3932        segments = FA_RISC_CODE_SEGMENTS;
3933        dcode = (uint32_t *)ha->request_ring;
3934        *srisc_addr = 0;
3935        fwcode = (uint32_t *)blob->fw->data;
3936        fwclen = 0;
3937
3938        /* Validate firmware image by checking version. */
3939        if (blob->fw->size < 8 * sizeof(uint32_t)) {
3940                qla_printk(KERN_WARNING, ha,
3941                    "Unable to verify integrity of firmware image (%Zd)!\n",
3942                    blob->fw->size);
3943                goto fail_fw_integrity;
3944        }
3945        for (i = 0; i < 4; i++)
3946                dcode[i] = be32_to_cpu(fwcode[i + 4]);
3947        if ((dcode[0] == 0xffffffff && dcode[1] == 0xffffffff &&
3948            dcode[2] == 0xffffffff && dcode[3] == 0xffffffff) ||
3949            (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 &&
3950                dcode[3] == 0)) {
3951                qla_printk(KERN_WARNING, ha,
3952                    "Unable to verify integrity of firmware image!\n");
3953                qla_printk(KERN_WARNING, ha,
3954                    "Firmware data: %08x %08x %08x %08x!\n", dcode[0],
3955                    dcode[1], dcode[2], dcode[3]);
3956                goto fail_fw_integrity;
3957        }
3958
3959        while (segments && rval == QLA_SUCCESS) {
3960                risc_addr = be32_to_cpu(fwcode[2]);
3961                *srisc_addr = *srisc_addr == 0 ? risc_addr : *srisc_addr;
3962                risc_size = be32_to_cpu(fwcode[3]);
3963
3964                /* Validate firmware image size. */
3965                fwclen += risc_size * sizeof(uint32_t);
3966                if (blob->fw->size < fwclen) {
3967                        qla_printk(KERN_WARNING, ha,
3968                            "Unable to verify integrity of firmware image "
3969                            "(%Zd)!\n", blob->fw->size);
3970
3971                        goto fail_fw_integrity;
3972                }
3973
3974                fragment = 0;
3975                while (risc_size > 0 && rval == QLA_SUCCESS) {
3976                        dlen = (uint32_t)(ha->fw_transfer_size >> 2);
3977                        if (dlen > risc_size)
3978                                dlen = risc_size;
3979
3980                        DEBUG7(printk("scsi(%ld): Loading risc segment@ risc "
3981                            "addr %x, number of dwords 0x%x.\n", ha->host_no,
3982                            risc_addr, dlen));
3983
3984                        for (i = 0; i < dlen; i++)
3985                                dcode[i] = swab32(fwcode[i]);
3986
3987                        rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr,
3988                            dlen);
3989                        if (rval) {
3990                                DEBUG(printk("scsi(%ld):[ERROR] Failed to load "
3991                                    "segment %d of firmware\n", ha->host_no,
3992                                    fragment));
3993                                qla_printk(KERN_WARNING, ha,
3994                                    "[ERROR] Failed to load segment %d of "
3995                                    "firmware\n", fragment);
3996                                break;
3997                        }
3998
3999                        fwcode += dlen;
4000                        risc_addr += dlen;
4001                        risc_size -= dlen;
4002                        fragment++;
4003                }
4004
4005                /* Next segment. */
4006                segments--;
4007        }
4008        return rval;
4009
4010fail_fw_integrity:
4011        return QLA_FUNCTION_FAILED;
4012}
4013
4014void
4015qla2x00_try_to_stop_firmware(scsi_qla_host_t *ha)
4016{
4017        int ret, retries;
4018
4019        if (!IS_FWI2_CAPABLE(ha))
4020                return;
4021        if (!ha->fw_major_version)
4022                return;
4023
4024        ret = qla2x00_stop_firmware(ha);
4025        for (retries = 5; ret != QLA_SUCCESS && ret != QLA_FUNCTION_TIMEOUT &&
4026            retries ; retries--) {
4027                qla2x00_reset_chip(ha);
4028                if (qla2x00_chip_diag(ha) != QLA_SUCCESS)
4029                        continue;
4030                if (qla2x00_setup_chip(ha) != QLA_SUCCESS)
4031                        continue;
4032                qla_printk(KERN_INFO, ha,
4033                    "Attempting retry of stop-firmware command...\n");
4034                ret = qla2x00_stop_firmware(ha);
4035        }
4036}
4037
4038int
4039qla24xx_configure_vhba(scsi_qla_host_t *ha)
4040{
4041        int rval = QLA_SUCCESS;
4042        uint16_t mb[MAILBOX_REGISTER_COUNT];
4043
4044        if (!ha->parent)
4045                return -EINVAL;
4046
4047        rval = qla2x00_fw_ready(ha);
4048        if (rval == QLA_SUCCESS) {
4049                clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
4050                qla2x00_marker(ha, 0, 0, MK_SYNC_ALL);
4051        }
4052
4053        ha->flags.management_server_logged_in = 0;
4054
4055        /* Login to SNS first */
4056        qla24xx_login_fabric(ha, NPH_SNS, 0xff, 0xff, 0xfc,
4057            mb, BIT_1);
4058        if (mb[0] != MBS_COMMAND_COMPLETE) {
4059                DEBUG15(qla_printk(KERN_INFO, ha,
4060                    "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x "
4061                    "mb[2]=%x mb[6]=%x mb[7]=%x\n", NPH_SNS,
4062                    mb[0], mb[1], mb[2], mb[6], mb[7]));
4063                return (QLA_FUNCTION_FAILED);
4064        }
4065
4066        atomic_set(&ha->loop_down_timer, 0);
4067        atomic_set(&ha->loop_state, LOOP_UP);
4068        set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
4069        set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
4070        rval = qla2x00_loop_resync(ha);
4071
4072        return rval;
4073}
4074
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.