drivers: net: cpsw: remove child devices while driver detach
[cascardo/linux.git] / drivers / scsi / lpfc / lpfc_scsi.c
index 7862c55..b99399f 100644 (file)
@@ -306,7 +306,7 @@ lpfc_send_sdev_queuedepth_change_event(struct lpfc_hba *phba,
  * depth for a scsi device. This function sets the queue depth to the new
  * value and sends an event out to log the queue depth change.
  **/
-int
+static int
 lpfc_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)
 {
        struct lpfc_vport *vport = (struct lpfc_vport *) sdev->host->hostdata;
@@ -380,12 +380,14 @@ lpfc_rampdown_queue_depth(struct lpfc_hba *phba)
 {
        unsigned long flags;
        uint32_t evt_posted;
+       unsigned long expires;
 
        spin_lock_irqsave(&phba->hbalock, flags);
        atomic_inc(&phba->num_rsrc_err);
        phba->last_rsrc_error_time = jiffies;
 
-       if ((phba->last_ramp_down_time + QUEUE_RAMP_DOWN_INTERVAL) > jiffies) {
+       expires = phba->last_ramp_down_time + QUEUE_RAMP_DOWN_INTERVAL;
+       if (time_after(expires, jiffies)) {
                spin_unlock_irqrestore(&phba->hbalock, flags);
                return;
        }
@@ -741,7 +743,7 @@ lpfc_sli4_fcp_xri_aborted(struct lpfc_hba *phba,
  *
  * Returns: 0 = failure, non-zero number of successfully posted buffers.
  **/
-int
+static int
 lpfc_sli4_post_scsi_sgl_list(struct lpfc_hba *phba,
                             struct list_head *post_sblist, int sb_count)
 {
@@ -2965,7 +2967,7 @@ err:
  * on the specified data using a CRC algorithmn
  * using crc_t10dif.
  */
-uint16_t
+static uint16_t
 lpfc_bg_crc(uint8_t *data, int count)
 {
        uint16_t crc = 0;
@@ -2981,7 +2983,7 @@ lpfc_bg_crc(uint8_t *data, int count)
  * on the specified data using a CSUM algorithmn
  * using ip_compute_csum.
  */
-uint16_t
+static uint16_t
 lpfc_bg_csum(uint8_t *data, int count)
 {
        uint16_t ret;
@@ -2994,7 +2996,7 @@ lpfc_bg_csum(uint8_t *data, int count)
  * This function examines the protection data to try to determine
  * what type of T10-DIF error occurred.
  */
-void
+static void
 lpfc_calc_bg_err(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
 {
        struct scatterlist *sgpe; /* s/g prot entry */
@@ -3464,7 +3466,7 @@ lpfc_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
         */
        if ((phba->cfg_fof) && ((struct lpfc_device_data *)
                scsi_cmnd->device->hostdata)->oas_enabled)
-               lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_OAS;
+               lpfc_cmd->cur_iocbq.iocb_flag |= (LPFC_IO_OAS | LPFC_IO_FOF);
        return 0;
 }
 
@@ -3604,6 +3606,14 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba,
         */
        iocb_cmd->un.fcpi.fcpi_parm = fcpdl;
 
+       /*
+        * If the OAS driver feature is enabled and the lun is enabled for
+        * OAS, set the oas iocb related flags.
+        */
+       if ((phba->cfg_fof) && ((struct lpfc_device_data *)
+               scsi_cmnd->device->hostdata)->oas_enabled)
+               lpfc_cmd->cur_iocbq.iocb_flag |= (LPFC_IO_OAS | LPFC_IO_FOF);
+
        return 0;
 err:
        if (lpfc_cmd->seg_cnt)
@@ -4874,6 +4884,8 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)
        /* ABTS WQE must go to the same WQ as the WQE to be aborted */
        abtsiocb->fcp_wqidx = iocb->fcp_wqidx;
        abtsiocb->iocb_flag |= LPFC_USE_FCPWQIDX;
+       if (iocb->iocb_flag & LPFC_IO_FOF)
+               abtsiocb->iocb_flag |= LPFC_IO_FOF;
 
        if (lpfc_is_link_up(phba))
                icmd->ulpCommand = CMD_ABORT_XRI_CN;
@@ -5327,7 +5339,13 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd)
        if (status == FAILED) {
                lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
                        "0722 Target Reset rport failure: rdata x%p\n", rdata);
-               return FAILED;
+               spin_lock_irq(shost->host_lock);
+               pnode->nlp_flag &= ~NLP_NPR_ADISC;
+               pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
+               spin_unlock_irq(shost->host_lock);
+               lpfc_reset_flush_io_context(vport, tgt_id, lun_id,
+                                         LPFC_CTX_TGT);
+               return FAST_IO_FAIL;
        }
 
        scsi_event.event_type = FC_REG_SCSI_EVENT;