diff options
author | Mark Salyzyn <Mark_Salyzyn@adaptec.com> | 2008-04-30 15:47:35 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-05-02 14:06:09 -0400 |
commit | a4576b5da671563187ac388e36e1d077bd20e43a (patch) | |
tree | 0bfc4ebe89f11445126c2815701afd4ffca7cd4f /drivers/scsi/aacraid | |
parent | e2efe7aa24dc7b430d2ea109fa117bd3c60ae8e6 (diff) |
[SCSI] aacraid: Fix jbod operations scan issues
As JBOD devices (really just Simple Single Drive Volumes exported to
the SCSI channel) are managed, they fail to update correctly when the
driver triggers a SCSI scan. In addition, the ability to change
multiple arrays or JBODs at the same time was resulting in dropped
scans, set up a mechanism to issue a list of single target scans on a
single configuration change notification from the Firmware.
Performed some additional sundry cosmetic code style cleanups.
Signed-off-by: Mark Salyzyn <aacraid@adaptec.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/aacraid')
-rw-r--r-- | drivers/scsi/aacraid/commsup.c | 32 | ||||
-rw-r--r-- | drivers/scsi/aacraid/linit.c | 16 |
2 files changed, 34 insertions, 14 deletions
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index e7a4c6f202d1..289304aab690 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c | |||
@@ -906,15 +906,22 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
906 | case AifEnAddJBOD: | 906 | case AifEnAddJBOD: |
907 | case AifEnDeleteJBOD: | 907 | case AifEnDeleteJBOD: |
908 | container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); | 908 | container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); |
909 | if ((container >> 28)) | 909 | if ((container >> 28)) { |
910 | container = (u32)-1; | ||
910 | break; | 911 | break; |
912 | } | ||
911 | channel = (container >> 24) & 0xF; | 913 | channel = (container >> 24) & 0xF; |
912 | if (channel >= dev->maximum_num_channels) | 914 | if (channel >= dev->maximum_num_channels) { |
915 | container = (u32)-1; | ||
913 | break; | 916 | break; |
917 | } | ||
914 | id = container & 0xFFFF; | 918 | id = container & 0xFFFF; |
915 | if (id >= dev->maximum_num_physicals) | 919 | if (id >= dev->maximum_num_physicals) { |
920 | container = (u32)-1; | ||
916 | break; | 921 | break; |
922 | } | ||
917 | lun = (container >> 16) & 0xFF; | 923 | lun = (container >> 16) & 0xFF; |
924 | container = (u32)-1; | ||
918 | channel = aac_phys_to_logical(channel); | 925 | channel = aac_phys_to_logical(channel); |
919 | device_config_needed = | 926 | device_config_needed = |
920 | (((__le32 *)aifcmd->data)[0] == | 927 | (((__le32 *)aifcmd->data)[0] == |
@@ -933,13 +940,18 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
933 | case EM_DRIVE_REMOVAL: | 940 | case EM_DRIVE_REMOVAL: |
934 | container = le32_to_cpu( | 941 | container = le32_to_cpu( |
935 | ((__le32 *)aifcmd->data)[2]); | 942 | ((__le32 *)aifcmd->data)[2]); |
936 | if ((container >> 28)) | 943 | if ((container >> 28)) { |
944 | container = (u32)-1; | ||
937 | break; | 945 | break; |
946 | } | ||
938 | channel = (container >> 24) & 0xF; | 947 | channel = (container >> 24) & 0xF; |
939 | if (channel >= dev->maximum_num_channels) | 948 | if (channel >= dev->maximum_num_channels) { |
949 | container = (u32)-1; | ||
940 | break; | 950 | break; |
951 | } | ||
941 | id = container & 0xFFFF; | 952 | id = container & 0xFFFF; |
942 | lun = (container >> 16) & 0xFF; | 953 | lun = (container >> 16) & 0xFF; |
954 | container = (u32)-1; | ||
943 | if (id >= dev->maximum_num_physicals) { | 955 | if (id >= dev->maximum_num_physicals) { |
944 | /* legacy dev_t ? */ | 956 | /* legacy dev_t ? */ |
945 | if ((0x2000 <= id) || lun || channel || | 957 | if ((0x2000 <= id) || lun || channel || |
@@ -1025,9 +1037,10 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
1025 | break; | 1037 | break; |
1026 | } | 1038 | } |
1027 | 1039 | ||
1040 | container = 0; | ||
1041 | retry_next: | ||
1028 | if (device_config_needed == NOTHING) | 1042 | if (device_config_needed == NOTHING) |
1029 | for (container = 0; container < dev->maximum_num_containers; | 1043 | for (; container < dev->maximum_num_containers; ++container) { |
1030 | ++container) { | ||
1031 | if ((dev->fsa_dev[container].config_waiting_on == 0) && | 1044 | if ((dev->fsa_dev[container].config_waiting_on == 0) && |
1032 | (dev->fsa_dev[container].config_needed != NOTHING) && | 1045 | (dev->fsa_dev[container].config_needed != NOTHING) && |
1033 | time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) { | 1046 | time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) { |
@@ -1110,6 +1123,11 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
1110 | } | 1123 | } |
1111 | if (device_config_needed == ADD) | 1124 | if (device_config_needed == ADD) |
1112 | scsi_add_device(dev->scsi_host_ptr, channel, id, lun); | 1125 | scsi_add_device(dev->scsi_host_ptr, channel, id, lun); |
1126 | if (channel == CONTAINER_CHANNEL) { | ||
1127 | container++; | ||
1128 | device_config_needed = NOTHING; | ||
1129 | goto retry_next; | ||
1130 | } | ||
1113 | } | 1131 | } |
1114 | 1132 | ||
1115 | static int _aac_reset_adapter(struct aac_dev *aac, int forced) | 1133 | static int _aac_reset_adapter(struct aac_dev *aac, int forced) |
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index c109f63f8279..c444527ae2fa 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c | |||
@@ -401,6 +401,8 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev, | |||
401 | static int aac_slave_configure(struct scsi_device *sdev) | 401 | static int aac_slave_configure(struct scsi_device *sdev) |
402 | { | 402 | { |
403 | struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata; | 403 | struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata; |
404 | if (aac->jbod && (sdev->type == TYPE_DISK)) | ||
405 | sdev->removable = 1; | ||
404 | if ((sdev->type == TYPE_DISK) && | 406 | if ((sdev->type == TYPE_DISK) && |
405 | (sdev_channel(sdev) != CONTAINER_CHANNEL) && | 407 | (sdev_channel(sdev) != CONTAINER_CHANNEL) && |
406 | (!aac->jbod || sdev->inq_periph_qual) && | 408 | (!aac->jbod || sdev->inq_periph_qual) && |
@@ -1106,7 +1108,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
1106 | aac->pdev = pdev; | 1108 | aac->pdev = pdev; |
1107 | aac->name = aac_driver_template.name; | 1109 | aac->name = aac_driver_template.name; |
1108 | aac->id = shost->unique_id; | 1110 | aac->id = shost->unique_id; |
1109 | aac->cardtype = index; | 1111 | aac->cardtype = index; |
1110 | INIT_LIST_HEAD(&aac->entry); | 1112 | INIT_LIST_HEAD(&aac->entry); |
1111 | 1113 | ||
1112 | aac->fibs = kmalloc(sizeof(struct fib) * (shost->can_queue + AAC_NUM_MGT_FIB), GFP_KERNEL); | 1114 | aac->fibs = kmalloc(sizeof(struct fib) * (shost->can_queue + AAC_NUM_MGT_FIB), GFP_KERNEL); |
@@ -1146,19 +1148,19 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
1146 | goto out_deinit; | 1148 | goto out_deinit; |
1147 | 1149 | ||
1148 | /* | 1150 | /* |
1149 | * Lets override negotiations and drop the maximum SG limit to 34 | 1151 | * Lets override negotiations and drop the maximum SG limit to 34 |
1150 | */ | 1152 | */ |
1151 | if ((aac_drivers[index].quirks & AAC_QUIRK_34SG) && | 1153 | if ((aac_drivers[index].quirks & AAC_QUIRK_34SG) && |
1152 | (shost->sg_tablesize > 34)) { | 1154 | (shost->sg_tablesize > 34)) { |
1153 | shost->sg_tablesize = 34; | 1155 | shost->sg_tablesize = 34; |
1154 | shost->max_sectors = (shost->sg_tablesize * 8) + 112; | 1156 | shost->max_sectors = (shost->sg_tablesize * 8) + 112; |
1155 | } | 1157 | } |
1156 | 1158 | ||
1157 | if ((aac_drivers[index].quirks & AAC_QUIRK_17SG) && | 1159 | if ((aac_drivers[index].quirks & AAC_QUIRK_17SG) && |
1158 | (shost->sg_tablesize > 17)) { | 1160 | (shost->sg_tablesize > 17)) { |
1159 | shost->sg_tablesize = 17; | 1161 | shost->sg_tablesize = 17; |
1160 | shost->max_sectors = (shost->sg_tablesize * 8) + 112; | 1162 | shost->max_sectors = (shost->sg_tablesize * 8) + 112; |
1161 | } | 1163 | } |
1162 | 1164 | ||
1163 | error = pci_set_dma_max_seg_size(pdev, | 1165 | error = pci_set_dma_max_seg_size(pdev, |
1164 | (aac->adapter_info.options & AAC_OPT_NEW_COMM) ? | 1166 | (aac->adapter_info.options & AAC_OPT_NEW_COMM) ? |
@@ -1174,7 +1176,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
1174 | else | 1176 | else |
1175 | aac->printf_enabled = 0; | 1177 | aac->printf_enabled = 0; |
1176 | 1178 | ||
1177 | /* | 1179 | /* |
1178 | * max channel will be the physical channels plus 1 virtual channel | 1180 | * max channel will be the physical channels plus 1 virtual channel |
1179 | * all containers are on the virtual channel 0 (CONTAINER_CHANNEL) | 1181 | * all containers are on the virtual channel 0 (CONTAINER_CHANNEL) |
1180 | * physical channels are address by their actual physical number+1 | 1182 | * physical channels are address by their actual physical number+1 |