aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@us.ibm.com>2007-01-11 17:15:38 -0500
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2007-01-13 17:20:23 -0500
commite7571c152dea576f8c80ca240befc93d4f16551d (patch)
treed3d7010b1daf107f93fa8dc23ff8783cab91a544
parentfe3b5bfe73ace420709f0cfb198b0ffc704bd38b (diff)
[SCSI] aic94xx: Scan SAS devices asynchronously
Add the necessary hooks to the aic94xx driver to support the asynchronous SCSI device scan infrastructure. Signed-off-by: Darrick J. Wong <djwong@us.ibm.com> Signed-off-by: Matthew Wilcox <matthew@wil.cx> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r--drivers/scsi/aic94xx/aic94xx_init.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c
index 7344f4d59a7d..a6fb33f1412d 100644
--- a/drivers/scsi/aic94xx/aic94xx_init.c
+++ b/drivers/scsi/aic94xx/aic94xx_init.c
@@ -57,6 +57,8 @@ MODULE_PARM_DESC(collector, "\n"
57char sas_addr_str[2*SAS_ADDR_SIZE + 1] = ""; 57char sas_addr_str[2*SAS_ADDR_SIZE + 1] = "";
58 58
59static struct scsi_transport_template *aic94xx_transport_template; 59static struct scsi_transport_template *aic94xx_transport_template;
60static int asd_scan_finished(struct Scsi_Host *, unsigned long);
61static void asd_scan_start(struct Scsi_Host *);
60 62
61static struct scsi_host_template aic94xx_sht = { 63static struct scsi_host_template aic94xx_sht = {
62 .module = THIS_MODULE, 64 .module = THIS_MODULE,
@@ -66,6 +68,8 @@ static struct scsi_host_template aic94xx_sht = {
66 .target_alloc = sas_target_alloc, 68 .target_alloc = sas_target_alloc,
67 .slave_configure = sas_slave_configure, 69 .slave_configure = sas_slave_configure,
68 .slave_destroy = sas_slave_destroy, 70 .slave_destroy = sas_slave_destroy,
71 .scan_finished = asd_scan_finished,
72 .scan_start = asd_scan_start,
69 .change_queue_depth = sas_change_queue_depth, 73 .change_queue_depth = sas_change_queue_depth,
70 .change_queue_type = sas_change_queue_type, 74 .change_queue_type = sas_change_queue_type,
71 .bios_param = sas_bios_param, 75 .bios_param = sas_bios_param,
@@ -672,21 +676,10 @@ static int __devinit asd_pci_probe(struct pci_dev *dev,
672 if (err) 676 if (err)
673 goto Err_reg_sas; 677 goto Err_reg_sas;
674 678
675 err = asd_enable_phys(asd_ha, asd_ha->hw_prof.enabled_phys); 679 scsi_scan_host(shost);
676 if (err) {
677 asd_printk("coudln't enable phys, err:%d\n", err);
678 goto Err_en_phys;
679 }
680 ASD_DPRINTK("enabled phys\n");
681 /* give the phy enabling interrupt event time to come in (1s
682 * is empirically about all it takes) */
683 ssleep(1);
684 /* Wait for discovery to finish */
685 scsi_flush_work(asd_ha->sas_ha.core.shost);
686 680
687 return 0; 681 return 0;
688Err_en_phys: 682
689 asd_unregister_sas_ha(asd_ha);
690Err_reg_sas: 683Err_reg_sas:
691 asd_remove_dev_attrs(asd_ha); 684 asd_remove_dev_attrs(asd_ha);
692Err_dev_attrs: 685Err_dev_attrs:
@@ -779,6 +772,28 @@ static void __devexit asd_pci_remove(struct pci_dev *dev)
779 return; 772 return;
780} 773}
781 774
775static void asd_scan_start(struct Scsi_Host *shost)
776{
777 struct asd_ha_struct *asd_ha;
778 int err;
779
780 asd_ha = SHOST_TO_SAS_HA(shost)->lldd_ha;
781 err = asd_enable_phys(asd_ha, asd_ha->hw_prof.enabled_phys);
782 if (err)
783 asd_printk("Couldn't enable phys, err:%d\n", err);
784}
785
786static int asd_scan_finished(struct Scsi_Host *shost, unsigned long time)
787{
788 /* give the phy enabling interrupt event time to come in (1s
789 * is empirically about all it takes) */
790 if (time < HZ)
791 return 0;
792 /* Wait for discovery to finish */
793 scsi_flush_work(shost);
794 return 1;
795}
796
782static ssize_t asd_version_show(struct device_driver *driver, char *buf) 797static ssize_t asd_version_show(struct device_driver *driver, char *buf)
783{ 798{
784 return snprintf(buf, PAGE_SIZE, "%s\n", ASD_DRIVER_VERSION); 799 return snprintf(buf, PAGE_SIZE, "%s\n", ASD_DRIVER_VERSION);