diff options
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/bnx2i/bnx2i_hwi.c | 3 | ||||
| -rw-r--r-- | drivers/scsi/hpsa.c | 3 | ||||
| -rw-r--r-- | drivers/scsi/megaraid/megaraid_sas_base.c | 3 | ||||
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.c | 20 | ||||
| -rw-r--r-- | drivers/scsi/scsi_error.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 5 | ||||
| -rw-r--r-- | drivers/scsi/scsi_scan.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/virtio_scsi.c | 2 | 
8 files changed, 47 insertions, 9 deletions
diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c index 33d6630529d..91eec60252e 100644 --- a/drivers/scsi/bnx2i/bnx2i_hwi.c +++ b/drivers/scsi/bnx2i/bnx2i_hwi.c @@ -1264,6 +1264,9 @@ int bnx2i_send_fw_iscsi_init_msg(struct bnx2i_hba *hba)  	int rc = 0;  	u64 mask64; +	memset(&iscsi_init, 0x00, sizeof(struct iscsi_kwqe_init1)); +	memset(&iscsi_init2, 0x00, sizeof(struct iscsi_kwqe_init2)); +  	bnx2i_adjust_qp_size(hba);  	iscsi_init.flags = diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index 796482badf1..2b4261cb774 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c @@ -1315,8 +1315,9 @@ static void complete_scsi_command(struct CommandList *cp)  	}  		break;  	case CMD_PROTOCOL_ERR: +		cmd->result = DID_ERROR << 16;  		dev_warn(&h->pdev->dev, "cp %p has " -			"protocol error \n", cp); +			"protocol error\n", cp);  		break;  	case CMD_HARDWARE_ERR:  		cmd->result = DID_ERROR << 16; diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index dc27598785e..ed38454228c 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c @@ -4066,7 +4066,6 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)  	spin_lock_init(&instance->cmd_pool_lock);  	spin_lock_init(&instance->hba_lock);  	spin_lock_init(&instance->completion_lock); -	spin_lock_init(&poll_aen_lock);  	mutex_init(&instance->aen_mutex);  	mutex_init(&instance->reset_mutex); @@ -5392,6 +5391,8 @@ static int __init megasas_init(void)  	printk(KERN_INFO "megasas: %s %s\n", MEGASAS_VERSION,  	       MEGASAS_EXT_VERSION); +	spin_lock_init(&poll_aen_lock); +  	support_poll_for_event = 2;  	support_device_change = 1; diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index 9d46fcbe775..9d5a56c4b33 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c @@ -1209,6 +1209,13 @@ _base_check_enable_msix(struct MPT2SAS_ADAPTER *ioc)  	u16 message_control; +	/* Check whether controller SAS2008 B0 controller, +	   if it is SAS2008 B0 controller use IO-APIC instead of MSIX */ +	if (ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2008 && +	    ioc->pdev->revision == 0x01) { +		return -EINVAL; +	} +  	base = pci_find_capability(ioc->pdev, PCI_CAP_ID_MSIX);  	if (!base) {  		dfailprintk(ioc, printk(MPT2SAS_INFO_FMT "msix not " @@ -2424,10 +2431,13 @@ _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc,  int sleep_flag)  	}  	/* command line tunables  for max controller queue depth */ -	if (max_queue_depth != -1) -		max_request_credit = (max_queue_depth < facts->RequestCredit) -		    ? max_queue_depth : facts->RequestCredit; -	else +	if (max_queue_depth != -1 && max_queue_depth != 0) { +		max_request_credit = min_t(u16, max_queue_depth + +			ioc->hi_priority_depth + ioc->internal_depth, +			facts->RequestCredit); +		if (max_request_credit > MAX_HBA_QUEUE_DEPTH) +			max_request_credit =  MAX_HBA_QUEUE_DEPTH; +	} else  		max_request_credit = min_t(u16, facts->RequestCredit,  		    MAX_HBA_QUEUE_DEPTH); @@ -2502,7 +2512,7 @@ _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc,  int sleep_flag)  	/* set the scsi host can_queue depth  	 * with some internal commands that could be outstanding  	 */ -	ioc->shost->can_queue = ioc->scsiio_depth - (2); +	ioc->shost->can_queue = ioc->scsiio_depth;  	dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "scsi host: "  	    "can_queue depth (%d)\n", ioc->name, ioc->shost->can_queue)); diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 4a6381c8725..de2337f255a 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -42,6 +42,8 @@  #include <trace/events/scsi.h> +static void scsi_eh_done(struct scsi_cmnd *scmd); +  #define SENSE_TIMEOUT		(10*HZ)  /* @@ -241,6 +243,14 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)  	if (! scsi_command_normalize_sense(scmd, &sshdr))  		return FAILED;	/* no valid sense data */ +	if (scmd->cmnd[0] == TEST_UNIT_READY && scmd->scsi_done != scsi_eh_done) +		/* +		 * nasty: for mid-layer issued TURs, we need to return the +		 * actual sense data without any recovery attempt.  For eh +		 * issued ones, we need to try to recover and interpret +		 */ +		return SUCCESS; +  	if (scsi_sense_is_deferred(&sshdr))  		return NEEDS_RETRY; diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index ffd77739ae3..faa790fba13 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -776,7 +776,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)  	}  	if (req->cmd_type == REQ_TYPE_BLOCK_PC) { /* SG_IO ioctl from block level */ -		req->errors = result;  		if (result) {  			if (sense_valid && req->sense) {  				/* @@ -792,6 +791,10 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)  			if (!sense_deferred)  				error = __scsi_error_from_host_byte(cmd, result);  		} +		/* +		 * __scsi_error_from_host_byte may have reset the host_byte +		 */ +		req->errors = cmd->result;  		req->resid_len = scsi_get_resid(cmd); diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 56a93794c47..d947ffc20ce 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -764,6 +764,16 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,  	sdev->model = (char *) (sdev->inquiry + 16);  	sdev->rev = (char *) (sdev->inquiry + 32); +	if (strncmp(sdev->vendor, "ATA     ", 8) == 0) { +		/* +		 * sata emulation layer device.  This is a hack to work around +		 * the SATL power management specifications which state that +		 * when the SATL detects the device has gone into standby +		 * mode, it shall respond with NOT READY. +		 */ +		sdev->allow_restart = 1; +	} +  	if (*bflags & BLIST_ISROM) {  		sdev->type = TYPE_ROM;  		sdev->removable = 1; diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c index c7030fbee79..3e79a2f0004 100644 --- a/drivers/scsi/virtio_scsi.c +++ b/drivers/scsi/virtio_scsi.c @@ -331,7 +331,7 @@ static void virtscsi_map_sgl(struct scatterlist *sg, unsigned int *p_idx,  	int i;  	for_each_sg(table->sgl, sg_elem, table->nents, i) -		sg_set_buf(&sg[idx++], sg_virt(sg_elem), sg_elem->length); +		sg[idx++] = *sg_elem;  	*p_idx = idx;  }  |