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 | |
| 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>
| -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 |
