]> 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 3bc3e1749f32781714015a6bfbb983f7c5636997..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);
@@ -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);
                }
@@ -1545,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) {
                /*
@@ -1659,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));
@@ -1679,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)
 {
@@ -1729,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);
 }
@@ -2053,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)
@@ -2886,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)
@@ -3263,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;
@@ -3377,8 +3359,14 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
        } 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.
@@ -3394,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));
@@ -3470,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));
@@ -3490,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
@@ -3617,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)
 {
@@ -3714,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;
        }
 
@@ -3815,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;