diff options
Diffstat (limited to 'drivers/scsi/aacraid/commsup.c')
| -rw-r--r-- | drivers/scsi/aacraid/commsup.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index ef67816a6fe5..289304aab690 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c | |||
| @@ -515,7 +515,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, | |||
| 515 | } | 515 | } |
| 516 | udelay(5); | 516 | udelay(5); |
| 517 | } | 517 | } |
| 518 | } else if (down_interruptible(&fibptr->event_wait) == 0) { | 518 | } else if (down_interruptible(&fibptr->event_wait)) { |
| 519 | fibptr->done = 2; | 519 | fibptr->done = 2; |
| 520 | up(&fibptr->event_wait); | 520 | up(&fibptr->event_wait); |
| 521 | } | 521 | } |
| @@ -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) |
