aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Garry <john.garry@huawei.com>2016-02-25 04:42:14 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2016-02-29 21:00:03 -0500
commit31eec8a6c013f374ecdcae1b0c6c7fb78feccdc1 (patch)
tree9f67390807f696afafe5664125810d5464a1d294
parent9c8ee657cf779ae4224e515ff48863378ac42f58 (diff)
hisi_sas: add hisi_sas_slave_configure()
In high-datarate aging tests, it is found that the SCSI framework can periodically issue lu resets as some commands timeout. Response TASK SET FULL and SAS_QUEUE_FULL may be returned many times for the same command, causing the timeouts. The SAS_QUEUE_FULL errors come from TRANS_TX_CREDIT_TIMEOUT_ERR, TRANS_TX_CLOSE_NORMAL_ERR, and TRANS_TX_ERR_FRAME_TXED errors. They do not mean that the queue is full in the host, but rather it is equivalent to meaning the queue is full for the sdev. To overcome this, the queue depth for the sdev is reduced to 64 (from 256, set in sas_slave_configure()). Normally error code SAS_QUEUE_FULL will result in the sdev queue depth falling, but it falls too slowly during high-datarate tests and commands timeout before it has fallen to an adequete level from original value. Signed-off-by: John Garry <john.garry@huawei.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/hisi_sas/hisi_sas_main.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index e51612f7f933..097ab4f27a6b 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -453,6 +453,19 @@ static int hisi_sas_dev_found(struct domain_device *device)
453 return 0; 453 return 0;
454} 454}
455 455
456static int hisi_sas_slave_configure(struct scsi_device *sdev)
457{
458 struct domain_device *dev = sdev_to_domain_dev(sdev);
459 int ret = sas_slave_configure(sdev);
460
461 if (ret)
462 return ret;
463 if (!dev_is_sata(dev))
464 sas_change_queue_depth(sdev, 64);
465
466 return 0;
467}
468
456static void hisi_sas_scan_start(struct Scsi_Host *shost) 469static void hisi_sas_scan_start(struct Scsi_Host *shost)
457{ 470{
458 struct hisi_hba *hisi_hba = shost_priv(shost); 471 struct hisi_hba *hisi_hba = shost_priv(shost);
@@ -990,7 +1003,7 @@ static struct scsi_host_template hisi_sas_sht = {
990 .name = DRV_NAME, 1003 .name = DRV_NAME,
991 .queuecommand = sas_queuecommand, 1004 .queuecommand = sas_queuecommand,
992 .target_alloc = sas_target_alloc, 1005 .target_alloc = sas_target_alloc,
993 .slave_configure = sas_slave_configure, 1006 .slave_configure = hisi_sas_slave_configure,
994 .scan_finished = hisi_sas_scan_finished, 1007 .scan_finished = hisi_sas_scan_finished,
995 .scan_start = hisi_sas_scan_start, 1008 .scan_start = hisi_sas_scan_start,
996 .change_queue_depth = sas_change_queue_depth, 1009 .change_queue_depth = sas_change_queue_depth,