Merge tag 'wireless-drivers-next-for-davem-2015-01-02' of git://git.kernel.org/pub...
[cascardo/linux.git] / drivers / scsi / qla2xxx / qla_init.c
index 46990f4..e59f25b 100644 (file)
@@ -1848,7 +1848,9 @@ enable_82xx_npiv:
                spin_unlock_irqrestore(&ha->hardware_lock, flags);
        }
 
-       if (rval == QLA_SUCCESS && IS_FAC_REQUIRED(ha)) {
+       if (IS_QLA27XX(ha))
+               ha->flags.fac_supported = 1;
+       else if (rval == QLA_SUCCESS && IS_FAC_REQUIRED(ha)) {
                uint32_t size;
 
                rval = qla81xx_fac_get_sector_size(vha, &size);
@@ -2196,6 +2198,15 @@ qla2x00_init_rings(scsi_qla_host_t *vha)
                mid_init_cb->options = __constant_cpu_to_le16(BIT_1);
                mid_init_cb->init_cb.execution_throttle =
                    cpu_to_le16(ha->fw_xcb_count);
+               /* D-Port Status */
+               if (IS_DPORT_CAPABLE(ha))
+                       mid_init_cb->init_cb.firmware_options_1 |=
+                           cpu_to_le16(BIT_7);
+               /* Enable FA-WWPN */
+               ha->flags.fawwpn_enabled =
+                   (mid_init_cb->init_cb.firmware_options_1 & BIT_6) ? 1 : 0;
+               ql_dbg(ql_dbg_init, vha, 0x0141, "FA-WWPN Support: %s.\n",
+                   (ha->flags.fawwpn_enabled) ? "enabled" : "disabled");
        }
 
        rval = qla2x00_init_firmware(vha, ha->init_cb_size);
@@ -2224,7 +2235,7 @@ qla2x00_fw_ready(scsi_qla_host_t *vha)
        unsigned long   wtime, mtime, cs84xx_time;
        uint16_t        min_wait;       /* Minimum wait time if loop is down */
        uint16_t        wait_time;      /* Wait time if loop is coming ready */
-       uint16_t        state[5];
+       uint16_t        state[6];
        struct qla_hw_data *ha = vha->hw;
 
        if (IS_QLAFX00(vha->hw))
@@ -2329,8 +2340,8 @@ qla2x00_fw_ready(scsi_qla_host_t *vha)
        } while (1);
 
        ql_dbg(ql_dbg_taskm, vha, 0x803a,
-           "fw_state=%x (%x, %x, %x, %x) " "curr time=%lx.\n", state[0],
-           state[1], state[2], state[3], state[4], jiffies);
+           "fw_state=%x (%x, %x, %x, %x %x) curr time=%lx.\n", state[0],
+           state[1], state[2], state[3], state[4], state[5], jiffies);
 
        if (rval && !(vha->device_flags & DFLG_NO_CABLE)) {
                ql_log(ql_log_warn, vha, 0x803b,
@@ -2596,18 +2607,18 @@ qla2x00_nvram_config(scsi_qla_host_t *vha)
                        nv->firmware_options[1] = BIT_7 | BIT_5;
                        nv->add_firmware_options[0] = BIT_5;
                        nv->add_firmware_options[1] = BIT_5 | BIT_4;
-                       nv->frame_payload_size = __constant_cpu_to_le16(2048);
+                       nv->frame_payload_size = 2048;
                        nv->special_options[1] = BIT_7;
                } else if (IS_QLA2200(ha)) {
                        nv->firmware_options[0] = BIT_2 | BIT_1;
                        nv->firmware_options[1] = BIT_7 | BIT_5;
                        nv->add_firmware_options[0] = BIT_5;
                        nv->add_firmware_options[1] = BIT_5 | BIT_4;
-                       nv->frame_payload_size = __constant_cpu_to_le16(1024);
+                       nv->frame_payload_size = 1024;
                } else if (IS_QLA2100(ha)) {
                        nv->firmware_options[0] = BIT_3 | BIT_1;
                        nv->firmware_options[1] = BIT_5;
-                       nv->frame_payload_size = __constant_cpu_to_le16(1024);
+                       nv->frame_payload_size = 1024;
                }
 
                nv->max_iocb_allocation = __constant_cpu_to_le16(256);
@@ -2643,7 +2654,7 @@ qla2x00_nvram_config(scsi_qla_host_t *vha)
         * are valid.
         */
        if (ia64_platform_is("sn2")) {
-               nv->frame_payload_size = __constant_cpu_to_le16(2048);
+               nv->frame_payload_size = 2048;
                if (IS_QLA23XX(ha))
                        nv->special_options[1] = BIT_7;
        }
@@ -3192,7 +3203,7 @@ static void
 qla2x00_iidma_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
 {
        int rval;
-       uint16_t mb[4];
+       uint16_t mb[MAILBOX_REGISTER_COUNT];
        struct qla_hw_data *ha = vha->hw;
 
        if (!IS_IIDMA_CAPABLE(ha))
@@ -3226,8 +3237,6 @@ qla2x00_reg_remote_port(scsi_qla_host_t *vha, fc_port_t *fcport)
        struct fc_rport *rport;
        unsigned long flags;
 
-       qla2x00_rport_del(fcport);
-
        rport_ids.node_name = wwn_to_u64(fcport->node_name);
        rport_ids.port_name = wwn_to_u64(fcport->port_name);
        rport_ids.port_id = fcport->d_id.b.domain << 16 |
@@ -4564,6 +4573,10 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
                /* Requeue all commands in outstanding command list. */
                qla2x00_abort_all_cmds(vha, DID_RESET << 16);
        }
+
+       ha->chip_reset++;
+       /* memory barrier */
+       wmb();
 }
 
 /*
@@ -4958,7 +4971,7 @@ qla24xx_nvram_config(scsi_qla_host_t *vha)
                memset(nv, 0, ha->nvram_size);
                nv->nvram_version = __constant_cpu_to_le16(ICB_VERSION);
                nv->version = __constant_cpu_to_le16(ICB_VERSION);
-               nv->frame_payload_size = __constant_cpu_to_le16(2048);
+               nv->frame_payload_size = 2048;
                nv->execution_throttle = __constant_cpu_to_le16(0xFFFF);
                nv->exchange_count = __constant_cpu_to_le16(0);
                nv->hard_address = __constant_cpu_to_le16(124);
@@ -5225,7 +5238,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr,
                                ql_log(ql_log_fatal, vha, 0x008f,
                                    "Failed to load segment %d of firmware.\n",
                                    fragment);
-                               break;
+                               return QLA_FUNCTION_FAILED;
                        }
 
                        faddr += dlen;
@@ -5528,7 +5541,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr)
                                ql_log(ql_log_fatal, vha, 0x0098,
                                    "Failed to load segment %d of firmware.\n",
                                    fragment);
-                               break;
+                               return QLA_FUNCTION_FAILED;
                        }
 
                        fwcode += dlen;
@@ -5905,7 +5918,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
                memset(nv, 0, ha->nvram_size);
                nv->nvram_version = __constant_cpu_to_le16(ICB_VERSION);
                nv->version = __constant_cpu_to_le16(ICB_VERSION);
-               nv->frame_payload_size = __constant_cpu_to_le16(2048);
+               nv->frame_payload_size = 2048;
                nv->execution_throttle = __constant_cpu_to_le16(0xFFFF);
                nv->exchange_count = __constant_cpu_to_le16(0);
                nv->port_name[0] = 0x21;