|
@@ -752,20 +752,19 @@ static u8
|
|
_base_get_cb_idx(struct MPT2SAS_ADAPTER *ioc, u16 smid)
|
|
_base_get_cb_idx(struct MPT2SAS_ADAPTER *ioc, u16 smid)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
- u8 cb_idx = 0xFF;
|
|
|
|
-
|
|
|
|
- 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 {
|
|
|
|
|
|
+ u8 cb_idx;
|
|
|
|
+
|
|
|
|
+ if (smid < ioc->hi_priority_smid) {
|
|
i = smid - 1;
|
|
i = smid - 1;
|
|
cb_idx = ioc->scsi_lookup[i].cb_idx;
|
|
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;
|
|
return cb_idx;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1430,7 +1429,7 @@ mpt2sas_base_get_smid_scsiio(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx,
|
|
struct scsi_cmnd *scmd)
|
|
struct scsi_cmnd *scmd)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
- struct request_tracker *request;
|
|
|
|
|
|
+ struct scsiio_tracker *request;
|
|
u16 smid;
|
|
u16 smid;
|
|
|
|
|
|
spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
|
|
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,
|
|
request = list_entry(ioc->free_list.next,
|
|
- struct request_tracker, tracker_list);
|
|
|
|
|
|
+ struct scsiio_tracker, tracker_list);
|
|
request->scmd = scmd;
|
|
request->scmd = scmd;
|
|
request->cb_idx = cb_idx;
|
|
request->cb_idx = cb_idx;
|
|
smid = request->smid;
|
|
smid = request->smid;
|
|
@@ -1496,48 +1495,47 @@ mpt2sas_base_free_smid(struct MPT2SAS_ADAPTER *ioc, u16 smid)
|
|
struct chain_tracker *chain_req, *next;
|
|
struct chain_tracker *chain_req, *next;
|
|
|
|
|
|
spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
|
|
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);
|
|
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);
|
|
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--;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -2278,9 +2276,9 @@ _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
|
|
ioc->name, (unsigned long long) ioc->request_dma));
|
|
ioc->name, (unsigned long long) ioc->request_dma));
|
|
total_sz += sz;
|
|
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_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);
|
|
GFP_KERNEL, ioc->scsi_lookup_pages);
|
|
if (!ioc->scsi_lookup) {
|
|
if (!ioc->scsi_lookup) {
|
|
printk(MPT2SAS_ERR_FMT "scsi_lookup: get_free_pages failed, "
|
|
printk(MPT2SAS_ERR_FMT "scsi_lookup: get_free_pages failed, "
|