Loading drivers/scsi/bfa/bfad_bsg.c +1 −1 Original line number Diff line number Diff line Loading @@ -3363,7 +3363,7 @@ bfad_im_bsg_els_ct_request(struct bsg_job *job) struct bfad_fcxp *drv_fcxp; struct bfa_fcs_lport_s *fcs_port; struct bfa_fcs_rport_s *fcs_rport; struct fc_bsg_request *bsg_request = bsg_request; struct fc_bsg_request *bsg_request = job->request; struct fc_bsg_reply *bsg_reply = job->reply; uint32_t command_type = bsg_request->msgcode; unsigned long flags; Loading drivers/scsi/lpfc/lpfc_els.c +2 −0 Original line number Diff line number Diff line Loading @@ -3590,12 +3590,14 @@ lpfc_els_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *elsiocb) } else { buf_ptr1 = (struct lpfc_dmabuf *) elsiocb->context2; lpfc_els_free_data(phba, buf_ptr1); elsiocb->context2 = NULL; } } if (elsiocb->context3) { buf_ptr = (struct lpfc_dmabuf *) elsiocb->context3; lpfc_els_free_bpl(phba, buf_ptr); elsiocb->context3 = NULL; } lpfc_sli_release_iocbq(phba, elsiocb); return 0; Loading drivers/scsi/mpt3sas/mpt3sas_base.h +12 −0 Original line number Diff line number Diff line Loading @@ -393,6 +393,7 @@ struct MPT3SAS_TARGET { * @eedp_enable: eedp support enable bit * @eedp_type: 0(type_1), 1(type_2), 2(type_3) * @eedp_block_length: block size * @ata_command_pending: SATL passthrough outstanding for device */ struct MPT3SAS_DEVICE { struct MPT3SAS_TARGET *sas_target; Loading @@ -404,6 +405,17 @@ struct MPT3SAS_DEVICE { u8 ignore_delay_remove; /* Iopriority Command Handling */ u8 ncq_prio_enable; /* * Bug workaround for SATL handling: the mpt2/3sas firmware * doesn't return BUSY or TASK_SET_FULL for subsequent * commands while a SATL pass through is in operation as the * spec requires, it simply does nothing with them until the * pass through completes, causing them possibly to timeout if * the passthrough is a long executing command (like format or * secure erase). This variable allows us to do the right * thing while a SATL command is pending. */ unsigned long ata_command_pending; }; Loading drivers/scsi/mpt3sas/mpt3sas_scsih.c +26 −14 Original line number Diff line number Diff line Loading @@ -3899,9 +3899,18 @@ _scsih_temp_threshold_events(struct MPT3SAS_ADAPTER *ioc, } } static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd) static int _scsih_set_satl_pending(struct scsi_cmnd *scmd, bool pending) { return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16); struct MPT3SAS_DEVICE *priv = scmd->device->hostdata; if (scmd->cmnd[0] != ATA_12 && scmd->cmnd[0] != ATA_16) return 0; if (pending) return test_and_set_bit(0, &priv->ata_command_pending); clear_bit(0, &priv->ata_command_pending); return 0; } /** Loading @@ -3925,9 +3934,7 @@ _scsih_flush_running_cmds(struct MPT3SAS_ADAPTER *ioc) if (!scmd) continue; count++; if (ata_12_16_cmd(scmd)) scsi_internal_device_unblock(scmd->device, SDEV_RUNNING); _scsih_set_satl_pending(scmd, false); mpt3sas_base_free_smid(ioc, smid); scsi_dma_unmap(scmd); if (ioc->pci_error_recovery) Loading Loading @@ -4063,13 +4070,6 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) if (ioc->logging_level & MPT_DEBUG_SCSI) scsi_print_command(scmd); /* * Lock the device for any subsequent command until command is * done. */ if (ata_12_16_cmd(scmd)) scsi_internal_device_block(scmd->device); sas_device_priv_data = scmd->device->hostdata; if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { scmd->result = DID_NO_CONNECT << 16; Loading @@ -4083,6 +4083,19 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) return 0; } /* * Bug work around for firmware SATL handling. The loop * is based on atomic operations and ensures consistency * since we're lockless at this point */ do { if (test_bit(0, &sas_device_priv_data->ata_command_pending)) { scmd->result = SAM_STAT_BUSY; scmd->scsi_done(scmd); return 0; } } while (_scsih_set_satl_pending(scmd, true)); sas_target_priv_data = sas_device_priv_data->sas_target; /* invalid device handle */ Loading Loading @@ -4650,8 +4663,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) if (scmd == NULL) return 1; if (ata_12_16_cmd(scmd)) scsi_internal_device_unblock(scmd->device, SDEV_RUNNING); _scsih_set_satl_pending(scmd, false); mpi_request = mpt3sas_base_get_msg_frame(ioc, smid); Loading drivers/scsi/sd.c +16 −7 Original line number Diff line number Diff line Loading @@ -2600,7 +2600,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) if (sdp->broken_fua) { sd_first_printk(KERN_NOTICE, sdkp, "Disabling FUA\n"); sdkp->DPOFUA = 0; } else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) { } else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw && !sdkp->device->use_16_for_rw) { sd_first_printk(KERN_NOTICE, sdkp, "Uses READ/WRITE(6), disabling FUA\n"); sdkp->DPOFUA = 0; Loading Loading @@ -2783,13 +2784,21 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp) queue_flag_clear_unlocked(QUEUE_FLAG_ADD_RANDOM, q); } if (sdkp->device->type == TYPE_ZBC) { /* Host-managed */ q->limits.zoned = BLK_ZONED_HM; } else { sdkp->zoned = (buffer[8] >> 4) & 3; if (sdkp->zoned == 1) /* Host-aware */ q->limits.zoned = BLK_ZONED_HA; else if (sdkp->device->type == TYPE_ZBC) q->limits.zoned = BLK_ZONED_HM; else /* * Treat drive-managed devices as * regular block devices. */ q->limits.zoned = BLK_ZONED_NONE; } if (blk_queue_is_zoned(q) && sdkp->first_scan) sd_printk(KERN_NOTICE, sdkp, "Host-%s zoned block device\n", q->limits.zoned == BLK_ZONED_HM ? "managed" : "aware"); Loading Loading
drivers/scsi/bfa/bfad_bsg.c +1 −1 Original line number Diff line number Diff line Loading @@ -3363,7 +3363,7 @@ bfad_im_bsg_els_ct_request(struct bsg_job *job) struct bfad_fcxp *drv_fcxp; struct bfa_fcs_lport_s *fcs_port; struct bfa_fcs_rport_s *fcs_rport; struct fc_bsg_request *bsg_request = bsg_request; struct fc_bsg_request *bsg_request = job->request; struct fc_bsg_reply *bsg_reply = job->reply; uint32_t command_type = bsg_request->msgcode; unsigned long flags; Loading
drivers/scsi/lpfc/lpfc_els.c +2 −0 Original line number Diff line number Diff line Loading @@ -3590,12 +3590,14 @@ lpfc_els_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *elsiocb) } else { buf_ptr1 = (struct lpfc_dmabuf *) elsiocb->context2; lpfc_els_free_data(phba, buf_ptr1); elsiocb->context2 = NULL; } } if (elsiocb->context3) { buf_ptr = (struct lpfc_dmabuf *) elsiocb->context3; lpfc_els_free_bpl(phba, buf_ptr); elsiocb->context3 = NULL; } lpfc_sli_release_iocbq(phba, elsiocb); return 0; Loading
drivers/scsi/mpt3sas/mpt3sas_base.h +12 −0 Original line number Diff line number Diff line Loading @@ -393,6 +393,7 @@ struct MPT3SAS_TARGET { * @eedp_enable: eedp support enable bit * @eedp_type: 0(type_1), 1(type_2), 2(type_3) * @eedp_block_length: block size * @ata_command_pending: SATL passthrough outstanding for device */ struct MPT3SAS_DEVICE { struct MPT3SAS_TARGET *sas_target; Loading @@ -404,6 +405,17 @@ struct MPT3SAS_DEVICE { u8 ignore_delay_remove; /* Iopriority Command Handling */ u8 ncq_prio_enable; /* * Bug workaround for SATL handling: the mpt2/3sas firmware * doesn't return BUSY or TASK_SET_FULL for subsequent * commands while a SATL pass through is in operation as the * spec requires, it simply does nothing with them until the * pass through completes, causing them possibly to timeout if * the passthrough is a long executing command (like format or * secure erase). This variable allows us to do the right * thing while a SATL command is pending. */ unsigned long ata_command_pending; }; Loading
drivers/scsi/mpt3sas/mpt3sas_scsih.c +26 −14 Original line number Diff line number Diff line Loading @@ -3899,9 +3899,18 @@ _scsih_temp_threshold_events(struct MPT3SAS_ADAPTER *ioc, } } static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd) static int _scsih_set_satl_pending(struct scsi_cmnd *scmd, bool pending) { return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16); struct MPT3SAS_DEVICE *priv = scmd->device->hostdata; if (scmd->cmnd[0] != ATA_12 && scmd->cmnd[0] != ATA_16) return 0; if (pending) return test_and_set_bit(0, &priv->ata_command_pending); clear_bit(0, &priv->ata_command_pending); return 0; } /** Loading @@ -3925,9 +3934,7 @@ _scsih_flush_running_cmds(struct MPT3SAS_ADAPTER *ioc) if (!scmd) continue; count++; if (ata_12_16_cmd(scmd)) scsi_internal_device_unblock(scmd->device, SDEV_RUNNING); _scsih_set_satl_pending(scmd, false); mpt3sas_base_free_smid(ioc, smid); scsi_dma_unmap(scmd); if (ioc->pci_error_recovery) Loading Loading @@ -4063,13 +4070,6 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) if (ioc->logging_level & MPT_DEBUG_SCSI) scsi_print_command(scmd); /* * Lock the device for any subsequent command until command is * done. */ if (ata_12_16_cmd(scmd)) scsi_internal_device_block(scmd->device); sas_device_priv_data = scmd->device->hostdata; if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { scmd->result = DID_NO_CONNECT << 16; Loading @@ -4083,6 +4083,19 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) return 0; } /* * Bug work around for firmware SATL handling. The loop * is based on atomic operations and ensures consistency * since we're lockless at this point */ do { if (test_bit(0, &sas_device_priv_data->ata_command_pending)) { scmd->result = SAM_STAT_BUSY; scmd->scsi_done(scmd); return 0; } } while (_scsih_set_satl_pending(scmd, true)); sas_target_priv_data = sas_device_priv_data->sas_target; /* invalid device handle */ Loading Loading @@ -4650,8 +4663,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) if (scmd == NULL) return 1; if (ata_12_16_cmd(scmd)) scsi_internal_device_unblock(scmd->device, SDEV_RUNNING); _scsih_set_satl_pending(scmd, false); mpi_request = mpt3sas_base_get_msg_frame(ioc, smid); Loading
drivers/scsi/sd.c +16 −7 Original line number Diff line number Diff line Loading @@ -2600,7 +2600,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) if (sdp->broken_fua) { sd_first_printk(KERN_NOTICE, sdkp, "Disabling FUA\n"); sdkp->DPOFUA = 0; } else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) { } else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw && !sdkp->device->use_16_for_rw) { sd_first_printk(KERN_NOTICE, sdkp, "Uses READ/WRITE(6), disabling FUA\n"); sdkp->DPOFUA = 0; Loading Loading @@ -2783,13 +2784,21 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp) queue_flag_clear_unlocked(QUEUE_FLAG_ADD_RANDOM, q); } if (sdkp->device->type == TYPE_ZBC) { /* Host-managed */ q->limits.zoned = BLK_ZONED_HM; } else { sdkp->zoned = (buffer[8] >> 4) & 3; if (sdkp->zoned == 1) /* Host-aware */ q->limits.zoned = BLK_ZONED_HA; else if (sdkp->device->type == TYPE_ZBC) q->limits.zoned = BLK_ZONED_HM; else /* * Treat drive-managed devices as * regular block devices. */ q->limits.zoned = BLK_ZONED_NONE; } if (blk_queue_is_zoned(q) && sdkp->first_scan) sd_printk(KERN_NOTICE, sdkp, "Host-%s zoned block device\n", q->limits.zoned == BLK_ZONED_HM ? "managed" : "aware"); Loading