diff options
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_base.c')
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.c | 126 | 
1 files changed, 75 insertions, 51 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index 9ead0399808..e8a6f1cf1e4 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c @@ -752,20 +752,19 @@ static u8  _base_get_cb_idx(struct MPT2SAS_ADAPTER *ioc, u16 smid)  {  	int i; -	u8 cb_idx = 0xFF; +	u8 cb_idx; -	if (smid >= ioc->hi_priority_smid) { -		if (smid < ioc->internal_smid) { -			i = smid - ioc->hi_priority_smid; -			cb_idx = ioc->hpr_lookup[i].cb_idx; -		} else if (smid <= ioc->hba_queue_depth)  { -			i = smid - ioc->internal_smid; -			cb_idx = ioc->internal_lookup[i].cb_idx; -		} -	} else { +	if (smid < ioc->hi_priority_smid) {  		i = smid - 1;  		cb_idx = ioc->scsi_lookup[i].cb_idx; -	} +	} else if (smid < ioc->internal_smid) { +		i = smid - ioc->hi_priority_smid; +		cb_idx = ioc->hpr_lookup[i].cb_idx; +	} else if (smid <= ioc->hba_queue_depth) { +		i = smid - ioc->internal_smid; +		cb_idx = ioc->internal_lookup[i].cb_idx; +	} else +		cb_idx = 0xFF;  	return cb_idx;  } @@ -1430,7 +1429,7 @@ mpt2sas_base_get_smid_scsiio(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx,      struct scsi_cmnd *scmd)  {  	unsigned long flags; -	struct request_tracker *request; +	struct scsiio_tracker *request;  	u16 smid;  	spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); @@ -1442,7 +1441,7 @@ mpt2sas_base_get_smid_scsiio(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx,  	}  	request = list_entry(ioc->free_list.next, -	    struct request_tracker, tracker_list); +	    struct scsiio_tracker, tracker_list);  	request->scmd = scmd;  	request->cb_idx = cb_idx;  	smid = request->smid; @@ -1496,48 +1495,47 @@ mpt2sas_base_free_smid(struct MPT2SAS_ADAPTER *ioc, u16 smid)  	struct chain_tracker *chain_req, *next;  	spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); -	if (smid >= ioc->hi_priority_smid) { -		if (smid < ioc->internal_smid) { -			/* hi-priority */ -			i = smid - ioc->hi_priority_smid; -			ioc->hpr_lookup[i].cb_idx = 0xFF; -			list_add_tail(&ioc->hpr_lookup[i].tracker_list, -			    &ioc->hpr_free_list); -		} else { -			/* internal queue */ -			i = smid - ioc->internal_smid; -			ioc->internal_lookup[i].cb_idx = 0xFF; -			list_add_tail(&ioc->internal_lookup[i].tracker_list, -			    &ioc->internal_free_list); +	if (smid < ioc->hi_priority_smid) { +		/* scsiio queue */ +		i = smid - 1; +		if (!list_empty(&ioc->scsi_lookup[i].chain_list)) { +			list_for_each_entry_safe(chain_req, next, +			    &ioc->scsi_lookup[i].chain_list, tracker_list) { +				list_del_init(&chain_req->tracker_list); +				list_add_tail(&chain_req->tracker_list, +				    &ioc->free_chain_list); +			}  		} +		ioc->scsi_lookup[i].cb_idx = 0xFF; +		ioc->scsi_lookup[i].scmd = NULL; +		list_add_tail(&ioc->scsi_lookup[i].tracker_list, +		    &ioc->free_list);  		spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); -		return; -	} -	/* scsiio queue */ -	i = smid - 1; -	if (!list_empty(&ioc->scsi_lookup[i].chain_list)) { -		list_for_each_entry_safe(chain_req, next, -		    &ioc->scsi_lookup[i].chain_list, tracker_list) { -			list_del_init(&chain_req->tracker_list); -			list_add_tail(&chain_req->tracker_list, -			    &ioc->free_chain_list); +		/* +		 * See _wait_for_commands_to_complete() call with regards +		 * to this code. +		 */ +		if (ioc->shost_recovery && ioc->pending_io_count) { +			if (ioc->pending_io_count == 1) +				wake_up(&ioc->reset_wq); +			ioc->pending_io_count--;  		} +		return; +	} else if (smid < ioc->internal_smid) { +		/* hi-priority */ +		i = smid - ioc->hi_priority_smid; +		ioc->hpr_lookup[i].cb_idx = 0xFF; +		list_add_tail(&ioc->hpr_lookup[i].tracker_list, +		    &ioc->hpr_free_list); +	} else if (smid <= ioc->hba_queue_depth) { +		/* internal queue */ +		i = smid - ioc->internal_smid; +		ioc->internal_lookup[i].cb_idx = 0xFF; +		list_add_tail(&ioc->internal_lookup[i].tracker_list, +		    &ioc->internal_free_list);  	} -	ioc->scsi_lookup[i].cb_idx = 0xFF; -	ioc->scsi_lookup[i].scmd = NULL; -	list_add_tail(&ioc->scsi_lookup[i].tracker_list, -	    &ioc->free_list);  	spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); - -	/* -	 * See _wait_for_commands_to_complete() call with regards to this code. -	 */ -	if (ioc->shost_recovery && ioc->pending_io_count) { -		if (ioc->pending_io_count == 1) -			wake_up(&ioc->reset_wq); -		ioc->pending_io_count--; -	}  }  /** @@ -1725,6 +1723,31 @@ _base_display_dell_branding(struct MPT2SAS_ADAPTER *ioc)  }  /** + * _base_display_intel_branding - Display branding string + * @ioc: per adapter object + * + * Return nothing. + */ +static void +_base_display_intel_branding(struct MPT2SAS_ADAPTER *ioc) +{ +	if (ioc->pdev->subsystem_vendor == PCI_VENDOR_ID_INTEL && +	    ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2008) { + +		switch (ioc->pdev->subsystem_device) { +		case MPT2SAS_INTEL_RMS2LL080_SSDID: +			printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, +			    MPT2SAS_INTEL_RMS2LL080_BRANDING); +			break; +		case MPT2SAS_INTEL_RMS2LL040_SSDID: +			printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, +			    MPT2SAS_INTEL_RMS2LL040_BRANDING); +			break; +		} +	} +} + +/**   * _base_display_ioc_capabilities - Disply IOC's capabilities.   * @ioc: per adapter object   * @@ -1754,6 +1777,7 @@ _base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc)  	    ioc->bios_pg3.BiosVersion & 0x000000FF);  	_base_display_dell_branding(ioc); +	_base_display_intel_branding(ioc);  	printk(MPT2SAS_INFO_FMT "Protocol=(", ioc->name); @@ -2252,9 +2276,9 @@ _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc,  int sleep_flag)  	    ioc->name, (unsigned long long) ioc->request_dma));  	total_sz += sz; -	sz = ioc->scsiio_depth * sizeof(struct request_tracker); +	sz = ioc->scsiio_depth * sizeof(struct scsiio_tracker);  	ioc->scsi_lookup_pages = get_order(sz); -	ioc->scsi_lookup = (struct request_tracker *)__get_free_pages( +	ioc->scsi_lookup = (struct scsiio_tracker *)__get_free_pages(  	    GFP_KERNEL, ioc->scsi_lookup_pages);  	if (!ioc->scsi_lookup) {  		printk(MPT2SAS_ERR_FMT "scsi_lookup: get_free_pages failed, "  |