]> err.no Git - linux-2.6/blobdiff - drivers/scsi/qla2xxx/qla_init.c
[SCSI] qla2xxx: Drop unused driver cruft.
[linux-2.6] / drivers / scsi / qla2xxx / qla_init.c
index 634ee174bff2a315e95fc29dd6fc41a72145480f..7e18b9c126542d66250e31a2b6492ab8d018eb1b 100644 (file)
@@ -194,7 +194,6 @@ qla2100_pci_config(scsi_qla_host_t *ha)
        mwi = 0;
        if (pci_set_mwi(ha->pdev))
                mwi = PCI_COMMAND_INVALIDATE;
-       pci_read_config_word(ha->pdev, PCI_REVISION_ID, &ha->revision);
 
        pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
        w |= mwi | (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
@@ -232,7 +231,6 @@ qla2300_pci_config(scsi_qla_host_t *ha)
        mwi = 0;
        if (pci_set_mwi(ha->pdev))
                mwi = PCI_COMMAND_INVALIDATE;
-       pci_read_config_word(ha->pdev, PCI_REVISION_ID, &ha->revision);
 
        pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
        w |= mwi | (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
@@ -320,7 +318,6 @@ qla24xx_pci_config(scsi_qla_host_t *ha)
        mwi = 0;
        if (pci_set_mwi(ha->pdev))
                mwi = PCI_COMMAND_INVALIDATE;
-       pci_read_config_word(ha->pdev, PCI_REVISION_ID, &ha->revision);
 
        pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
        w |= mwi | (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
@@ -387,7 +384,7 @@ qla2x00_isp_firmware(scsi_qla_host_t *ha)
 
                /* Verify checksum of loaded RISC code. */
                rval = qla2x00_verify_checksum(ha,
-                   IS_QLA24XX(ha) || IS_QLA25XX(ha) ? RISC_SADDRESS :
+                   IS_QLA24XX(ha) || IS_QLA54XX(ha) ? RISC_SADDRESS :
                    *ha->brd_info->fw_info[0].fwstart);
        }
 
@@ -411,7 +408,6 @@ qla2x00_reset_chip(scsi_qla_host_t *ha)
        unsigned long   flags = 0;
        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
        uint32_t        cnt;
-       unsigned long   mbx_flags = 0;
        uint16_t        cmd;
 
        ha->isp_ops.disable_intrs(ha);
@@ -519,20 +515,8 @@ qla2x00_reset_chip(scsi_qla_host_t *ha)
 
        if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) {
                for (cnt = 0; cnt < 30000; cnt++) {
-                       if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)))
-                               spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags);
-
-                       if (RD_MAILBOX_REG(ha, reg, 0) != MBS_BUSY) {
-                               if (!(test_bit(ABORT_ISP_ACTIVE,
-                                   &ha->dpc_flags)))
-                                       spin_unlock_irqrestore(
-                                           &ha->mbx_reg_lock, mbx_flags);
+                       if (RD_MAILBOX_REG(ha, reg, 0) != MBS_BUSY)
                                break;
-                       }
-
-                       if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)))
-                               spin_unlock_irqrestore(&ha->mbx_reg_lock,
-                                   mbx_flags);
 
                        udelay(100);
                }
@@ -727,6 +711,7 @@ qla2x00_chip_diag(scsi_qla_host_t *ha)
                DEBUG3(printk("scsi(%ld): Found QLA2200A chip.\n",
                    ha->host_no));
 
+               ha->device_type |= DT_ISP2200A;
                ha->fw_transfer_size = 128;
        }
 
@@ -821,7 +806,7 @@ qla2x00_resize_request_q(scsi_qla_host_t *ha)
        if (IS_QLA2100(ha) || IS_QLA2200(ha))
                return;
 
-       if (IS_QLA24XX(ha) || IS_QLA25XX(ha))
+       if (IS_QLA24XX(ha) || IS_QLA54XX(ha))
                qla2x00_alloc_fw_dump(ha);
 
        /* Retrieve IOCB counts available to the firmware. */
@@ -1002,6 +987,10 @@ qla2x00_update_fw_options(scsi_qla_host_t *ha)
        if (ha->flags.enable_led_scheme)
                ha->fw_options[2] |= BIT_12;
 
+       /* Detect ISP6312. */
+       if (IS_QLA6312(ha))
+               ha->fw_options[2] |= BIT_13;
+
        /* Update firmware options. */
        qla2x00_set_fw_options(ha, ha->fw_options);
 }
@@ -1500,9 +1489,9 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
                                index = (ha->pdev->subsystem_device & 0xff);
                                if (index < QLA_MODEL_NAMES) {
                                        strcpy(ha->model_number,
-                                           qla2x00_model_name[index]);
+                                           qla2x00_model_name[index * 2]);
                                        ha->model_desc =
-                                           qla2x00_model_desc[index];
+                                           qla2x00_model_name[index * 2 + 1];
                                } else {
                                        strcpy(ha->model_number, "QLA23xx");
                                }
@@ -1540,6 +1529,12 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
        while (cnt--)
                *dptr1++ = *dptr2++;
 
+       /* Use alternate WWN? */
+       if (nv->host_p[1] & BIT_7) {
+               memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE);
+               memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE);
+       }
+
        /* Prepare nodename */
        if ((icb->firmware_options[1] & BIT_6) == 0) {
                /*
@@ -1654,6 +1649,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
                    ~(BIT_3 | BIT_2 | BIT_1 | BIT_0);
                ha->flags.process_response_queue = 0;
                if (ha->zio_mode != QLA_ZIO_DISABLED) {
+                       ha->zio_mode = QLA_ZIO_MODE_6;
+
                        DEBUG2(printk("scsi(%ld): ZIO mode %d enabled; timer "
                            "delay (%d us).\n", ha->host_no, ha->zio_mode,
                            ha->zio_timer * 100));
@@ -1674,14 +1671,6 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
        return (rval);
 }
 
-static void
-qla2x00_rport_add(void *data)
-{
-       fc_port_t *fcport = data;
-
-       qla2x00_reg_remote_port(fcport->ha, fcport);
-}
-
 static void
 qla2x00_rport_del(void *data)
 {
@@ -1724,8 +1713,6 @@ qla2x00_alloc_fcport(scsi_qla_host_t *ha, gfp_t flags)
        fcport->flags = FCF_RLC_SUPPORT;
        fcport->supported_classes = FC_COS_UNSPECIFIED;
        spin_lock_init(&fcport->rport_lock);
-       INIT_WORK(&fcport->rport_add_work, qla2x00_rport_add, fcport);
-       INIT_WORK(&fcport->rport_del_work, qla2x00_rport_del, fcport);
 
        return (fcport);
 }
@@ -2048,10 +2035,6 @@ qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport)
            PORT_RETRY_TIME);
        fcport->flags &= ~FCF_LOGIN_NEEDED;
 
-       if (fcport->port_type == FCT_INITIATOR ||
-           fcport->port_type == FCT_BROADCAST)
-               fcport->device_type = TYPE_PROCESSOR;
-
        atomic_set(&fcport->state, FCS_ONLINE);
 
        if (ha->flags.init_done)
@@ -2122,7 +2105,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *ha)
        LIST_HEAD(new_fcports);
 
        /* If FL port exists, then SNS is present */
-       if (IS_QLA24XX(ha) || IS_QLA25XX(ha))
+       if (IS_QLA24XX(ha) || IS_QLA54XX(ha))
                loop_id = NPH_F_PORT;
        else
                loop_id = SNS_FL_PORT;
@@ -2148,7 +2131,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *ha)
                        qla2x00_fdmi_register(ha);
 
                /* Ensure we are logged into the SNS. */
-               if (IS_QLA24XX(ha) || IS_QLA25XX(ha))
+               if (IS_QLA24XX(ha) || IS_QLA54XX(ha))
                        loop_id = NPH_SNS;
                else
                        loop_id = SIMPLE_NAME_SERVER;
@@ -2639,7 +2622,7 @@ qla2x00_device_resync(scsi_qla_host_t *ha)
                        if (ql2xprocessrscn &&
                            !IS_QLA2100(ha) && !IS_QLA2200(ha) &&
                            !IS_QLA6312(ha) && !IS_QLA6322(ha) &&
-                           !IS_QLA24XX(ha) && !IS_QLA25XX(ha) &&
+                           !IS_QLA24XX(ha) && !IS_QLA54XX(ha) &&
                            ha->flags.init_done) {
                                /* Handle port RSCN via asyncronous IOCBs */
                                rval2 = qla2x00_handle_port_rscn(ha, rscn_entry,
@@ -2881,13 +2864,13 @@ qla2x00_fabric_login(scsi_qla_host_t *ha, fc_port_t *fcport,
  *      3 - Fatal error
  */
 int
-qla2x00_local_device_login(scsi_qla_host_t *ha, uint16_t loop_id)
+qla2x00_local_device_login(scsi_qla_host_t *ha, fc_port_t *fcport)
 {
        int             rval;
        uint16_t        mb[MAILBOX_REGISTER_COUNT];
 
        memset(mb, 0, sizeof(mb));
-       rval = qla2x00_login_local_device(ha, loop_id, mb, BIT_0);
+       rval = qla2x00_login_local_device(ha, fcport, mb, BIT_0);
        if (rval == QLA_SUCCESS) {
                /* Interrogate mailbox registers for any errors */
                if (mb[0] == MBS_COMMAND_ERROR)
@@ -3129,7 +3112,7 @@ qla2x00_restart_isp(scsi_qla_host_t *ha)
 
                        spin_lock_irqsave(&ha->hardware_lock, flags);
 
-                       if (!IS_QLA24XX(ha) && !IS_QLA25XX(ha)) {
+                       if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) {
                                /*
                                 * Disable SRAM, Instruction RAM and GP RAM
                                 * parity.
@@ -3145,7 +3128,7 @@ qla2x00_restart_isp(scsi_qla_host_t *ha)
 
                        spin_lock_irqsave(&ha->hardware_lock, flags);
 
-                       if (!IS_QLA24XX(ha) && !IS_QLA25XX(ha)) {
+                       if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) {
                                /* Enable proper parity */
                                if (IS_QLA2300(ha))
                                        /* SRAM parity */
@@ -3258,8 +3241,12 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
        /* Determine NVRAM starting address. */
        ha->nvram_size = sizeof(struct nvram_24xx);
        ha->nvram_base = FA_NVRAM_FUNC0_ADDR;
-       if (PCI_FUNC(ha->pdev->devfn))
+       ha->vpd_size = FA_NVRAM_VPD_SIZE;
+       ha->vpd_base = FA_NVRAM_VPD0_ADDR;
+       if (PCI_FUNC(ha->pdev->devfn)) {
                ha->nvram_base = FA_NVRAM_FUNC1_ADDR;
+               ha->vpd_base = FA_NVRAM_VPD1_ADDR;
+       }
 
        /* Get NVRAM data and calculate checksum. */
        dptr = (uint32_t *)nv;
@@ -3368,12 +3355,18 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
 
                index = (ha->pdev->subsystem_device & 0xff);
                if (index < QLA_MODEL_NAMES)
-                       ha->model_desc = qla2x00_model_desc[index];
+                       ha->model_desc = qla2x00_model_name[index * 2 + 1];
        } else
                strcpy(ha->model_number, "QLA2462");
 
+       /* Use alternate WWN? */
+       if (nv->host_p & __constant_cpu_to_le32(BIT_15)) {
+               memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE);
+               memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE);
+       }
+
        /* Prepare nodename */
-       if ((icb->firmware_options_1 & BIT_14) == 0) {
+       if ((icb->firmware_options_1 & __constant_cpu_to_le32(BIT_14)) == 0) {
                /*
                 * Firmware will apply the following mask if the nodename was
                 * not provided.
@@ -3389,8 +3382,8 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
        ha->flags.enable_target_reset = 1;
        ha->flags.enable_led_scheme = 0;
 
-       ha->operating_mode =
-           (icb->firmware_options_2 & (BIT_6 | BIT_5 | BIT_4)) >> 4;
+       ha->operating_mode = (le32_to_cpu(icb->firmware_options_2) &
+           (BIT_6 | BIT_5 | BIT_4)) >> 4;
 
        memcpy(ha->fw_seriallink_options24, nv->seriallink_options,
            sizeof(ha->fw_seriallink_options24));
@@ -3465,6 +3458,8 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
            ~(BIT_3 | BIT_2 | BIT_1 | BIT_0));
        ha->flags.process_response_queue = 0;
        if (ha->zio_mode != QLA_ZIO_DISABLED) {
+               ha->zio_mode = QLA_ZIO_MODE_6;
+
                DEBUG2(printk("scsi(%ld): ZIO mode %d enabled; timer delay "
                    "(%d us).\n", ha->host_no, ha->zio_mode,
                    ha->zio_timer * 100));
@@ -3485,6 +3480,88 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
        return (rval);
 }
 
+int
+qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr)
+{
+       int     rval;
+       int     segments, fragment;
+       uint32_t faddr;
+       uint32_t *dcode, dlen;
+       uint32_t risc_addr;
+       uint32_t risc_size;
+       uint32_t i;
+
+       rval = QLA_SUCCESS;
+
+       segments = FA_RISC_CODE_SEGMENTS;
+       faddr = FA_RISC_CODE_ADDR;
+       dcode = (uint32_t *)ha->request_ring;
+       *srisc_addr = 0;
+
+       /* Validate firmware image by checking version. */
+       qla24xx_read_flash_data(ha, dcode, faddr + 4, 4);
+       for (i = 0; i < 4; i++)
+               dcode[i] = be32_to_cpu(dcode[i]);
+       if ((dcode[0] == 0xffffffff && dcode[1] == 0xffffffff &&
+           dcode[2] == 0xffffffff && dcode[3] == 0xffffffff) ||
+           (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 &&
+               dcode[3] == 0)) {
+               qla_printk(KERN_WARNING, ha,
+                   "Unable to verify integrity of flash firmware image!\n");
+               qla_printk(KERN_WARNING, ha,
+                   "Firmware data: %08x %08x %08x %08x!\n", dcode[0],
+                   dcode[1], dcode[2], dcode[3]);
+
+               return QLA_FUNCTION_FAILED;
+       }
+
+       while (segments && rval == QLA_SUCCESS) {
+               /* Read segment's load information. */
+               qla24xx_read_flash_data(ha, dcode, faddr, 4);
+
+               risc_addr = be32_to_cpu(dcode[2]);
+               *srisc_addr = *srisc_addr == 0 ? risc_addr : *srisc_addr;
+               risc_size = be32_to_cpu(dcode[3]);
+
+               fragment = 0;
+               while (risc_size > 0 && rval == QLA_SUCCESS) {
+                       dlen = (uint32_t)(ha->fw_transfer_size >> 2);
+                       if (dlen > risc_size)
+                               dlen = risc_size;
+
+                       DEBUG7(printk("scsi(%ld): Loading risc segment@ risc "
+                           "addr %x, number of dwords 0x%x, offset 0x%x.\n",
+                           ha->host_no, risc_addr, dlen, faddr));
+
+                       qla24xx_read_flash_data(ha, dcode, faddr, dlen);
+                       for (i = 0; i < dlen; i++)
+                               dcode[i] = swab32(dcode[i]);
+
+                       rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr,
+                           dlen);
+                       if (rval) {
+                               DEBUG(printk("scsi(%ld):[ERROR] Failed to load "
+                                   "segment %d of firmware\n", ha->host_no,
+                                   fragment));
+                               qla_printk(KERN_WARNING, ha,
+                                   "[ERROR] Failed to load segment %d of "
+                                   "firmware\n", fragment);
+                               break;
+                       }
+
+                       faddr += dlen;
+                       risc_addr += dlen;
+                       risc_size -= dlen;
+                       fragment++;
+               }
+
+               /* Next segment. */
+               segments--;
+       }
+
+       return rval;
+}
+
 #if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE)
 
 int
@@ -3612,90 +3689,10 @@ qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
        return rval;
 }
 
-int
-qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr)
-{
-       int     rval;
-       int     segments, fragment;
-       uint32_t faddr;
-       uint32_t *dcode, dlen;
-       uint32_t risc_addr;
-       uint32_t risc_size;
-       uint32_t i;
-
-       rval = QLA_SUCCESS;
-
-       segments = FA_RISC_CODE_SEGMENTS;
-       faddr = FA_RISC_CODE_ADDR;
-       dcode = (uint32_t *)ha->request_ring;
-       *srisc_addr = 0;
-
-       /* Validate firmware image by checking version. */
-       qla24xx_read_flash_data(ha, dcode, faddr + 4, 4);
-       for (i = 0; i < 4; i++)
-               dcode[i] = be32_to_cpu(dcode[i]);
-       if ((dcode[0] == 0xffffffff && dcode[1] == 0xffffffff &&
-           dcode[2] == 0xffffffff && dcode[3] == 0xffffffff) ||
-           (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 &&
-               dcode[3] == 0)) {
-               qla_printk(KERN_WARNING, ha,
-                   "Unable to verify integrity of flash firmware image!\n");
-               qla_printk(KERN_WARNING, ha,
-                   "Firmware data: %08x %08x %08x %08x!\n", dcode[0],
-                   dcode[1], dcode[2], dcode[3]);
-
-               return QLA_FUNCTION_FAILED;
-       }
-
-       while (segments && rval == QLA_SUCCESS) {
-               /* Read segment's load information. */
-               qla24xx_read_flash_data(ha, dcode, faddr, 4);
-
-               risc_addr = be32_to_cpu(dcode[2]);
-               *srisc_addr = *srisc_addr == 0 ? risc_addr : *srisc_addr;
-               risc_size = be32_to_cpu(dcode[3]);
-
-               fragment = 0;
-               while (risc_size > 0 && rval == QLA_SUCCESS) {
-                       dlen = (uint32_t)(ha->fw_transfer_size >> 2);
-                       if (dlen > risc_size)
-                               dlen = risc_size;
-
-                       DEBUG7(printk("scsi(%ld): Loading risc segment@ risc "
-                           "addr %x, number of dwords 0x%x, offset 0x%x.\n",
-                           ha->host_no, risc_addr, dlen, faddr));
-
-                       qla24xx_read_flash_data(ha, dcode, faddr, dlen);
-                       for (i = 0; i < dlen; i++)
-                               dcode[i] = swab32(dcode[i]);
-
-                       rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr,
-                           dlen);
-                       if (rval) {
-                               DEBUG(printk("scsi(%ld):[ERROR] Failed to load "
-                                   "segment %d of firmware\n", ha->host_no,
-                                   fragment));
-                               qla_printk(KERN_WARNING, ha,
-                                   "[ERROR] Failed to load segment %d of "
-                                   "firmware\n", fragment);
-                               break;
-                       }
-
-                       faddr += dlen;
-                       risc_addr += dlen;
-                       risc_size -= dlen;
-                       fragment++;
-               }
-
-               /* Next segment. */
-               segments--;
-       }
-
-       return rval;
-}
-
 #else  /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */
 
+#define QLA_FW_URL "ftp://ftp.qlogic.com/outgoing/linux/firmware/"
+
 int
 qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
 {
@@ -3709,6 +3706,8 @@ qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
        blob = qla2x00_request_firmware(ha);
        if (!blob) {
                qla_printk(KERN_ERR, ha, "Firmware image unavailable.\n");
+               qla_printk(KERN_ERR, ha, "Firmware images can be retrieved "
+                   "from: " QLA_FW_URL ".\n");
                return QLA_FUNCTION_FAILED;
        }
 
@@ -3810,7 +3809,13 @@ qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr)
        blob = qla2x00_request_firmware(ha);
        if (!blob) {
                qla_printk(KERN_ERR, ha, "Firmware image unavailable.\n");
-               return QLA_FUNCTION_FAILED;
+               qla_printk(KERN_ERR, ha, "Firmware images can be retrieved "
+                   "from: " QLA_FW_URL ".\n");
+
+               /* Try to load RISC code from flash. */
+               qla_printk(KERN_ERR, ha, "Attempting to load (potentially "
+                   "outdated) firmware from flash.\n");
+               return qla24xx_load_risc_flash(ha, srisc_addr);
        }
 
        rval = QLA_SUCCESS;