Merge patch series "Update lpfc to revision 14.4.0.2"
[sfrench/cifs-2.6.git] / drivers / scsi / lpfc / lpfc_init.c
index f7a0aa3625f4e1b63d0254a925b0cc00f7bf40ad..e1dfa96c2a553a51b123c7a53814d1288922106d 100644 (file)
@@ -567,7 +567,7 @@ lpfc_config_port_post(struct lpfc_hba *phba)
 
        spin_lock_irq(&phba->hbalock);
        /* Initialize ERATT handling flag */
-       phba->hba_flag &= ~HBA_ERATT_HANDLED;
+       clear_bit(HBA_ERATT_HANDLED, &phba->hba_flag);
 
        /* Enable appropriate host interrupts */
        if (lpfc_readl(phba->HCregaddr, &status)) {
@@ -599,13 +599,14 @@ lpfc_config_port_post(struct lpfc_hba *phba)
        /* Set up heart beat (HB) timer */
        mod_timer(&phba->hb_tmofunc,
                  jiffies + msecs_to_jiffies(1000 * LPFC_HB_MBOX_INTERVAL));
-       phba->hba_flag &= ~(HBA_HBEAT_INP | HBA_HBEAT_TMO);
+       clear_bit(HBA_HBEAT_INP, &phba->hba_flag);
+       clear_bit(HBA_HBEAT_TMO, &phba->hba_flag);
        phba->last_completion_time = jiffies;
        /* Set up error attention (ERATT) polling timer */
        mod_timer(&phba->eratt_poll,
                  jiffies + msecs_to_jiffies(1000 * phba->eratt_poll_interval));
 
-       if (phba->hba_flag & LINK_DISABLED) {
+       if (test_bit(LINK_DISABLED, &phba->hba_flag)) {
                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
                                "2598 Adapter Link is disabled.\n");
                lpfc_down_link(phba, pmb);
@@ -925,9 +926,7 @@ lpfc_sli4_free_sp_events(struct lpfc_hba *phba)
        struct hbq_dmabuf *dmabuf;
        struct lpfc_cq_event *cq_event;
 
-       spin_lock_irq(&phba->hbalock);
-       phba->hba_flag &= ~HBA_SP_QUEUE_EVT;
-       spin_unlock_irq(&phba->hbalock);
+       clear_bit(HBA_SP_QUEUE_EVT, &phba->hba_flag);
 
        while (!list_empty(&phba->sli4_hba.sp_queue_event)) {
                /* Get the response iocb from the head of work queue */
@@ -1228,18 +1227,15 @@ static void
 lpfc_rrq_timeout(struct timer_list *t)
 {
        struct lpfc_hba *phba;
-       unsigned long iflag;
 
        phba = from_timer(phba, t, rrq_tmr);
-       spin_lock_irqsave(&phba->pport->work_port_lock, iflag);
-       if (!test_bit(FC_UNLOADING, &phba->pport->load_flag))
-               phba->hba_flag |= HBA_RRQ_ACTIVE;
-       else
-               phba->hba_flag &= ~HBA_RRQ_ACTIVE;
-       spin_unlock_irqrestore(&phba->pport->work_port_lock, iflag);
+       if (test_bit(FC_UNLOADING, &phba->pport->load_flag)) {
+               clear_bit(HBA_RRQ_ACTIVE, &phba->hba_flag);
+               return;
+       }
 
-       if (!test_bit(FC_UNLOADING, &phba->pport->load_flag))
-               lpfc_worker_wake_up(phba);
+       set_bit(HBA_RRQ_ACTIVE, &phba->hba_flag);
+       lpfc_worker_wake_up(phba);
 }
 
 /**
@@ -1261,11 +1257,8 @@ lpfc_rrq_timeout(struct timer_list *t)
 static void
 lpfc_hb_mbox_cmpl(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq)
 {
-       unsigned long drvr_flag;
-
-       spin_lock_irqsave(&phba->hbalock, drvr_flag);
-       phba->hba_flag &= ~(HBA_HBEAT_INP | HBA_HBEAT_TMO);
-       spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
+       clear_bit(HBA_HBEAT_INP, &phba->hba_flag);
+       clear_bit(HBA_HBEAT_TMO, &phba->hba_flag);
 
        /* Check and reset heart-beat timer if necessary */
        mempool_free(pmboxq, phba->mbox_mem_pool);
@@ -1457,7 +1450,7 @@ lpfc_issue_hb_mbox(struct lpfc_hba *phba)
        int retval;
 
        /* Is a Heartbeat mbox already in progress */
-       if (phba->hba_flag & HBA_HBEAT_INP)
+       if (test_bit(HBA_HBEAT_INP, &phba->hba_flag))
                return 0;
 
        pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
@@ -1473,7 +1466,7 @@ lpfc_issue_hb_mbox(struct lpfc_hba *phba)
                mempool_free(pmboxq, phba->mbox_mem_pool);
                return -ENXIO;
        }
-       phba->hba_flag |= HBA_HBEAT_INP;
+       set_bit(HBA_HBEAT_INP, &phba->hba_flag);
 
        return 0;
 }
@@ -1493,7 +1486,7 @@ lpfc_issue_hb_tmo(struct lpfc_hba *phba)
 {
        if (phba->cfg_enable_hba_heartbeat)
                return;
-       phba->hba_flag |= HBA_HBEAT_TMO;
+       set_bit(HBA_HBEAT_TMO, &phba->hba_flag);
 }
 
 /**
@@ -1565,7 +1558,7 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba)
                                msecs_to_jiffies(1000 * LPFC_HB_MBOX_INTERVAL),
                                jiffies)) {
                        spin_unlock_irq(&phba->pport->work_port_lock);
-                       if (phba->hba_flag & HBA_HBEAT_INP)
+                       if (test_bit(HBA_HBEAT_INP, &phba->hba_flag))
                                tmo = (1000 * LPFC_HB_MBOX_TIMEOUT);
                        else
                                tmo = (1000 * LPFC_HB_MBOX_INTERVAL);
@@ -1574,7 +1567,7 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba)
                spin_unlock_irq(&phba->pport->work_port_lock);
 
                /* Check if a MBX_HEARTBEAT is already in progress */
-               if (phba->hba_flag & HBA_HBEAT_INP) {
+               if (test_bit(HBA_HBEAT_INP, &phba->hba_flag)) {
                        /*
                         * If heart beat timeout called with HBA_HBEAT_INP set
                         * we need to give the hb mailbox cmd a chance to
@@ -1611,7 +1604,7 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba)
                }
        } else {
                /* Check to see if we want to force a MBX_HEARTBEAT */
-               if (phba->hba_flag & HBA_HBEAT_TMO) {
+               if (test_bit(HBA_HBEAT_TMO, &phba->hba_flag)) {
                        retval = lpfc_issue_hb_mbox(phba);
                        if (retval)
                                tmo = (1000 * LPFC_HB_MBOX_INTERVAL);
@@ -1699,9 +1692,7 @@ lpfc_handle_deferred_eratt(struct lpfc_hba *phba)
         * since we cannot communicate with the pci card anyway.
         */
        if (pci_channel_offline(phba->pcidev)) {
-               spin_lock_irq(&phba->hbalock);
-               phba->hba_flag &= ~DEFER_ERATT;
-               spin_unlock_irq(&phba->hbalock);
+               clear_bit(DEFER_ERATT, &phba->hba_flag);
                return;
        }
 
@@ -1752,9 +1743,7 @@ lpfc_handle_deferred_eratt(struct lpfc_hba *phba)
        if (!phba->work_hs && !test_bit(FC_UNLOADING, &phba->pport->load_flag))
                phba->work_hs = old_host_status & ~HS_FFER1;
 
-       spin_lock_irq(&phba->hbalock);
-       phba->hba_flag &= ~DEFER_ERATT;
-       spin_unlock_irq(&phba->hbalock);
+       clear_bit(DEFER_ERATT, &phba->hba_flag);
        phba->work_status[0] = readl(phba->MBslimaddr + 0xa8);
        phba->work_status[1] = readl(phba->MBslimaddr + 0xac);
 }
@@ -1798,9 +1787,7 @@ lpfc_handle_eratt_s3(struct lpfc_hba *phba)
         * since we cannot communicate with the pci card anyway.
         */
        if (pci_channel_offline(phba->pcidev)) {
-               spin_lock_irq(&phba->hbalock);
-               phba->hba_flag &= ~DEFER_ERATT;
-               spin_unlock_irq(&phba->hbalock);
+               clear_bit(DEFER_ERATT, &phba->hba_flag);
                return;
        }
 
@@ -1811,7 +1798,7 @@ lpfc_handle_eratt_s3(struct lpfc_hba *phba)
        /* Send an internal error event to mgmt application */
        lpfc_board_errevt_to_mgmt(phba);
 
-       if (phba->hba_flag & DEFER_ERATT)
+       if (test_bit(DEFER_ERATT, &phba->hba_flag))
                lpfc_handle_deferred_eratt(phba);
 
        if ((phba->work_hs & HS_FFER6) || (phba->work_hs & HS_FFER8)) {
@@ -2026,7 +2013,7 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba)
                /* consider PCI bus read error as pci_channel_offline */
                if (pci_rd_rc1 == -EIO && pci_rd_rc2 == -EIO)
                        return;
-               if (!(phba->hba_flag & HBA_RECOVERABLE_UE)) {
+               if (!test_bit(HBA_RECOVERABLE_UE, &phba->hba_flag)) {
                        lpfc_sli4_offline_eratt(phba);
                        return;
                }
@@ -3319,9 +3306,10 @@ lpfc_stop_hba_timers(struct lpfc_hba *phba)
        del_timer_sync(&phba->hb_tmofunc);
        if (phba->sli_rev == LPFC_SLI_REV4) {
                del_timer_sync(&phba->rrq_tmr);
-               phba->hba_flag &= ~HBA_RRQ_ACTIVE;
+               clear_bit(HBA_RRQ_ACTIVE, &phba->hba_flag);
        }
-       phba->hba_flag &= ~(HBA_HBEAT_INP | HBA_HBEAT_TMO);
+       clear_bit(HBA_HBEAT_INP, &phba->hba_flag);
+       clear_bit(HBA_HBEAT_TMO, &phba->hba_flag);
 
        switch (phba->pci_dev_grp) {
        case LPFC_PCI_DEV_LP:
@@ -4785,7 +4773,10 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
        shost->max_id = LPFC_MAX_TARGET;
        shost->max_lun = vport->cfg_max_luns;
        shost->this_id = -1;
-       shost->max_cmd_len = 16;
+       if (phba->sli_rev == LPFC_SLI_REV4)
+               shost->max_cmd_len = LPFC_FCP_CDB_LEN_32;
+       else
+               shost->max_cmd_len = LPFC_FCP_CDB_LEN;
 
        if (phba->sli_rev == LPFC_SLI_REV4) {
                if (!phba->cfg_fcp_mq_threshold ||
@@ -4976,7 +4967,7 @@ static void lpfc_host_supported_speeds_set(struct Scsi_Host *shost)
         * Avoid reporting supported link speed for FCoE as it can't be
         * controlled via FCoE.
         */
-       if (phba->hba_flag & HBA_FCOE_MODE)
+       if (test_bit(HBA_FCOE_MODE, &phba->hba_flag))
                return;
 
        if (phba->lmt & LMT_256Gb)
@@ -5490,7 +5481,7 @@ lpfc_sli4_async_link_evt(struct lpfc_hba *phba,
         * For FC Mode: issue the READ_TOPOLOGY mailbox command to fetch
         * topology info. Note: Optional for non FC-AL ports.
         */
-       if (!(phba->hba_flag & HBA_FCOE_MODE)) {
+       if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag)) {
                rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
                if (rc == MBX_NOT_FINISHED)
                        goto out_free_pmb;
@@ -6025,7 +6016,7 @@ lpfc_cmf_timer(struct hrtimer *timer)
         */
        if (phba->cmf_active_mode == LPFC_CFG_MANAGED &&
            phba->link_state != LPFC_LINK_DOWN &&
-           phba->hba_flag & HBA_SETUP) {
+           test_bit(HBA_SETUP, &phba->hba_flag)) {
                mbpi = phba->cmf_last_sync_bw;
                phba->cmf_last_sync_bw = 0;
                extra = 0;
@@ -6778,11 +6769,9 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
                }
 
                /* If the FCF discovery is in progress, do nothing. */
-               spin_lock_irq(&phba->hbalock);
-               if (phba->hba_flag & FCF_TS_INPROG) {
-                       spin_unlock_irq(&phba->hbalock);
+               if (test_bit(FCF_TS_INPROG, &phba->hba_flag))
                        break;
-               }
+               spin_lock_irq(&phba->hbalock);
                /* If fast FCF failover rescan event is pending, do nothing */
                if (phba->fcf.fcf_flag & (FCF_REDISC_EVT | FCF_REDISC_PEND)) {
                        spin_unlock_irq(&phba->hbalock);
@@ -7321,9 +7310,7 @@ void lpfc_sli4_async_event_proc(struct lpfc_hba *phba)
        unsigned long iflags;
 
        /* First, declare the async event has been handled */
-       spin_lock_irqsave(&phba->hbalock, iflags);
-       phba->hba_flag &= ~ASYNC_EVENT;
-       spin_unlock_irqrestore(&phba->hbalock, iflags);
+       clear_bit(ASYNC_EVENT, &phba->hba_flag);
 
        /* Now, handle all the async events */
        spin_lock_irqsave(&phba->sli4_hba.asynce_list_lock, iflags);
@@ -8247,7 +8234,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
                 * our max amount and we need to limit lpfc_sg_seg_cnt
                 * to minimize the risk of running out.
                 */
-               phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) +
+               phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd32) +
                                sizeof(struct fcp_rsp) + max_buf_size;
 
                /* Total SGEs for scsi_sg_list and scsi_sg_prot_list */
@@ -8269,7 +8256,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
                 * the FCP rsp, a SGE for each, and a SGE for up to
                 * cfg_sg_seg_cnt data segments.
                 */
-               phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) +
+               phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd32) +
                                sizeof(struct fcp_rsp) +
                                ((phba->cfg_sg_seg_cnt + extra) *
                                sizeof(struct sli4_sge));
@@ -8332,7 +8319,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
        phba->lpfc_cmd_rsp_buf_pool =
                        dma_pool_create("lpfc_cmd_rsp_buf_pool",
                                        &phba->pcidev->dev,
-                                       sizeof(struct fcp_cmnd) +
+                                       sizeof(struct fcp_cmnd32) +
                                        sizeof(struct fcp_rsp),
                                        i, 0);
        if (!phba->lpfc_cmd_rsp_buf_pool) {
@@ -9869,41 +9856,38 @@ lpfc_map_topology(struct lpfc_hba *phba, struct lpfc_mbx_read_config *rd_config)
                return;
        }
        /* FW supports persistent topology - override module parameter value */
-       phba->hba_flag |= HBA_PERSISTENT_TOPO;
+       set_bit(HBA_PERSISTENT_TOPO, &phba->hba_flag);
 
        /* if ASIC_GEN_NUM >= 0xC) */
        if ((bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) ==
                    LPFC_SLI_INTF_IF_TYPE_6) ||
            (bf_get(lpfc_sli_intf_sli_family, &phba->sli4_hba.sli_intf) ==
                    LPFC_SLI_INTF_FAMILY_G6)) {
-               if (!tf) {
+               if (!tf)
                        phba->cfg_topology = ((pt == LINK_FLAGS_LOOP)
                                        ? FLAGS_TOPOLOGY_MODE_LOOP
                                        : FLAGS_TOPOLOGY_MODE_PT_PT);
-               } else {
-                       phba->hba_flag &= ~HBA_PERSISTENT_TOPO;
-               }
+               else
+                       clear_bit(HBA_PERSISTENT_TOPO, &phba->hba_flag);
        } else { /* G5 */
-               if (tf) {
+               if (tf)
                        /* If topology failover set - pt is '0' or '1' */
                        phba->cfg_topology = (pt ? FLAGS_TOPOLOGY_MODE_PT_LOOP :
                                              FLAGS_TOPOLOGY_MODE_LOOP_PT);
-               } else {
+               else
                        phba->cfg_topology = ((pt == LINK_FLAGS_P2P)
                                        ? FLAGS_TOPOLOGY_MODE_PT_PT
                                        : FLAGS_TOPOLOGY_MODE_LOOP);
-               }
        }
-       if (phba->hba_flag & HBA_PERSISTENT_TOPO) {
+       if (test_bit(HBA_PERSISTENT_TOPO, &phba->hba_flag))
                lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
                                "2020 Using persistent topology value [%s]",
                                lpfc_topo_to_str[phba->cfg_topology]);
-       } else {
+       else
                lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
                                "2021 Invalid topology values from FW "
                                "Using driver parameter defined value [%s]",
                                lpfc_topo_to_str[phba->cfg_topology]);
-       }
 }
 
 /**
@@ -10146,7 +10130,7 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
                forced_link_speed =
                        bf_get(lpfc_mbx_rd_conf_link_speed, rd_config);
                if (forced_link_speed) {
-                       phba->hba_flag |= HBA_FORCED_LINK_SPEED;
+                       set_bit(HBA_FORCED_LINK_SPEED, &phba->hba_flag);
 
                        switch (forced_link_speed) {
                        case LINK_SPEED_1G:
@@ -12241,7 +12225,7 @@ lpfc_sli_enable_intr(struct lpfc_hba *phba, uint32_t cfg_mode)
        retval = lpfc_sli_config_port(phba, LPFC_SLI_REV3);
        if (retval)
                return intr_mode;
-       phba->hba_flag &= ~HBA_NEEDS_CFG_PORT;
+       clear_bit(HBA_NEEDS_CFG_PORT, &phba->hba_flag);
 
        if (cfg_mode == 2) {
                /* Now, try to enable MSI-X interrupt mode */
@@ -14812,6 +14796,7 @@ lpfc_pci_probe_one_s4(struct pci_dev *pdev, const struct pci_device_id *pid)
                goto out_unset_pci_mem_s4;
        }
 
+       spin_lock_init(&phba->rrq_list_lock);
        INIT_LIST_HEAD(&phba->active_rrq_list);
        INIT_LIST_HEAD(&phba->fcf.fcf_pri_list);
 
@@ -15528,7 +15513,7 @@ lpfc_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
        pci_ers_result_t rc = PCI_ERS_RESULT_DISCONNECT;
 
        if (phba->link_state == LPFC_HBA_ERROR &&
-           phba->hba_flag & HBA_IOQ_FLUSH)
+           test_bit(HBA_IOQ_FLUSH, &phba->hba_flag))
                return PCI_ERS_RESULT_NEED_RESET;
 
        switch (phba->pci_dev_grp) {