aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aacraid
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/aacraid')
-rw-r--r--drivers/scsi/aacraid/aachba.c5
-rw-r--r--drivers/scsi/aacraid/aacraid.h6
-rw-r--r--drivers/scsi/aacraid/commsup.c24
-rw-r--r--drivers/scsi/aacraid/linit.c15
4 files changed, 44 insertions, 6 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index 8d7b7703ee2a..d7235f42cf5f 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -1339,6 +1339,8 @@ int aac_get_adapter_info(struct aac_dev* dev)
1339 } 1339 }
1340 1340
1341 dev->cache_protected = 0; 1341 dev->cache_protected = 0;
1342 dev->jbod = ((dev->supplement_adapter_info.FeatureBits &
1343 AAC_FEATURE_JBOD) != 0);
1342 dev->nondasd_support = 0; 1344 dev->nondasd_support = 0;
1343 dev->raid_scsi_mode = 0; 1345 dev->raid_scsi_mode = 0;
1344 if(dev->adapter_info.options & AAC_OPT_NONDASD) 1346 if(dev->adapter_info.options & AAC_OPT_NONDASD)
@@ -1923,7 +1925,8 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
1923 } 1925 }
1924 } 1926 }
1925 } else { /* check for physical non-dasd devices */ 1927 } else { /* check for physical non-dasd devices */
1926 if ((dev->nondasd_support == 1) || expose_physicals) { 1928 if (dev->nondasd_support || expose_physicals ||
1929 dev->jbod) {
1927 if (dev->in_reset) 1930 if (dev->in_reset)
1928 return -1; 1931 return -1;
1929 return aac_send_srb_fib(scsicmd); 1932 return aac_send_srb_fib(scsicmd);
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 8a5b9c898e5b..3195d29f2177 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -12,7 +12,7 @@
12 *----------------------------------------------------------------------------*/ 12 *----------------------------------------------------------------------------*/
13 13
14#ifndef AAC_DRIVER_BUILD 14#ifndef AAC_DRIVER_BUILD
15# define AAC_DRIVER_BUILD 2454 15# define AAC_DRIVER_BUILD 2455
16# define AAC_DRIVER_BRANCH "-ms" 16# define AAC_DRIVER_BRANCH "-ms"
17#endif 17#endif
18#define MAXIMUM_NUM_CONTAINERS 32 18#define MAXIMUM_NUM_CONTAINERS 32
@@ -866,6 +866,7 @@ struct aac_supplement_adapter_info
866 __le32 ReservedGrowth[1]; 866 __le32 ReservedGrowth[1];
867}; 867};
868#define AAC_FEATURE_FALCON cpu_to_le32(0x00000010) 868#define AAC_FEATURE_FALCON cpu_to_le32(0x00000010)
869#define AAC_FEATURE_JBOD cpu_to_le32(0x08000000)
869#define AAC_OPTION_MU_RESET cpu_to_le32(0x00000001) 870#define AAC_OPTION_MU_RESET cpu_to_le32(0x00000001)
870#define AAC_OPTION_IGNORE_RESET cpu_to_le32(0x00000002) 871#define AAC_OPTION_IGNORE_RESET cpu_to_le32(0x00000002)
871#define AAC_SIS_VERSION_V3 3 872#define AAC_SIS_VERSION_V3 3
@@ -1012,6 +1013,7 @@ struct aac_dev
1012 * lets break them out so we don't have to do an AND to check them 1013 * lets break them out so we don't have to do an AND to check them
1013 */ 1014 */
1014 u8 nondasd_support; 1015 u8 nondasd_support;
1016 u8 jbod;
1015 u8 cache_protected; 1017 u8 cache_protected;
1016 u8 dac_support; 1018 u8 dac_support;
1017 u8 raid_scsi_mode; 1019 u8 raid_scsi_mode;
@@ -1777,6 +1779,8 @@ extern struct aac_common aac_config;
1777#define AifEnExpEvent 23 /* Firmware Event Log */ 1779#define AifEnExpEvent 23 /* Firmware Event Log */
1778#define AifExeFirmwarePanic 3 /* Firmware Event Panic */ 1780#define AifExeFirmwarePanic 3 /* Firmware Event Panic */
1779#define AifHighPriority 3 /* Highest Priority Event */ 1781#define AifHighPriority 3 /* Highest Priority Event */
1782#define AifEnAddJBOD 30 /* JBOD created */
1783#define AifEnDeleteJBOD 31 /* JBOD deleted */
1780 1784
1781#define AifCmdJobProgress 2 /* Progress report */ 1785#define AifCmdJobProgress 2 /* Progress report */
1782#define AifJobCtrZero 101 /* Array Zero progress */ 1786#define AifJobCtrZero 101 /* Array Zero progress */
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index 1dd2e57c3345..81b36923e0ef 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -901,7 +901,31 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
901 case AifEnConfigChange: 901 case AifEnConfigChange:
902 break; 902 break;
903 903
904 case AifEnAddJBOD:
905 case AifEnDeleteJBOD:
906 container = le32_to_cpu(((__le32 *)aifcmd->data)[1]);
907 if ((container >> 28))
908 break;
909 channel = (container >> 24) & 0xF;
910 if (channel >= dev->maximum_num_channels)
911 break;
912 id = container & 0xFFFF;
913 if (id >= dev->maximum_num_physicals)
914 break;
915 lun = (container >> 16) & 0xFF;
916 channel = aac_phys_to_logical(channel);
917 device_config_needed =
918 (((__le32 *)aifcmd->data)[0] ==
919 cpu_to_le32(AifEnAddJBOD)) ? ADD : DELETE;
920 break;
921
904 case AifEnEnclosureManagement: 922 case AifEnEnclosureManagement:
923 /*
924 * If in JBOD mode, automatic exposure of new
925 * physical target to be suppressed until configured.
926 */
927 if (dev->jbod)
928 break;
905 switch (le32_to_cpu(((__le32 *)aifcmd->data)[3])) { 929 switch (le32_to_cpu(((__le32 *)aifcmd->data)[3])) {
906 case EM_DRIVE_INSERTION: 930 case EM_DRIVE_INSERTION:
907 case EM_DRIVE_REMOVAL: 931 case EM_DRIVE_REMOVAL:
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 5ab733d4faf4..61be22774e99 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -404,6 +404,7 @@ static int aac_slave_configure(struct scsi_device *sdev)
404 struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata; 404 struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
405 if ((sdev->type == TYPE_DISK) && 405 if ((sdev->type == TYPE_DISK) &&
406 (sdev_channel(sdev) != CONTAINER_CHANNEL) && 406 (sdev_channel(sdev) != CONTAINER_CHANNEL) &&
407 (!aac->jbod || sdev->inq_periph_qual) &&
407 (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2))) { 408 (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2))) {
408 if (expose_physicals == 0) 409 if (expose_physicals == 0)
409 return -ENXIO; 410 return -ENXIO;
@@ -411,7 +412,8 @@ static int aac_slave_configure(struct scsi_device *sdev)
411 sdev->no_uld_attach = 1; 412 sdev->no_uld_attach = 1;
412 } 413 }
413 if (sdev->tagged_supported && (sdev->type == TYPE_DISK) && 414 if (sdev->tagged_supported && (sdev->type == TYPE_DISK) &&
414 (sdev_channel(sdev) == CONTAINER_CHANNEL)) { 415 (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2)) &&
416 !sdev->no_uld_attach) {
415 struct scsi_device * dev; 417 struct scsi_device * dev;
416 struct Scsi_Host *host = sdev->host; 418 struct Scsi_Host *host = sdev->host;
417 unsigned num_lsu = 0; 419 unsigned num_lsu = 0;
@@ -430,8 +432,11 @@ static int aac_slave_configure(struct scsi_device *sdev)
430 ++num_lsu; 432 ++num_lsu;
431 __shost_for_each_device(dev, host) { 433 __shost_for_each_device(dev, host) {
432 if (dev->tagged_supported && (dev->type == TYPE_DISK) && 434 if (dev->tagged_supported && (dev->type == TYPE_DISK) &&
433 (sdev_channel(dev) == CONTAINER_CHANNEL)) { 435 (!aac->raid_scsi_mode ||
434 if (!aac->fsa_dev[sdev_id(dev)].valid) 436 (sdev_channel(sdev) != 2)) &&
437 !dev->no_uld_attach) {
438 if ((sdev_channel(dev) != CONTAINER_CHANNEL)
439 || !aac->fsa_dev[sdev_id(dev)].valid)
435 ++num_lsu; 440 ++num_lsu;
436 } else 441 } else
437 ++num_one; 442 ++num_one;
@@ -804,6 +809,8 @@ static ssize_t aac_show_flags(struct class_device *class_dev, char *buf)
804 if (dev->raw_io_interface && dev->raw_io_64) 809 if (dev->raw_io_interface && dev->raw_io_64)
805 len += snprintf(buf + len, PAGE_SIZE - len, 810 len += snprintf(buf + len, PAGE_SIZE - len,
806 "SAI_READ_CAPACITY_16\n"); 811 "SAI_READ_CAPACITY_16\n");
812 if (dev->jbod)
813 len += snprintf(buf + len, PAGE_SIZE - len, "SUPPORTED_JBOD\n");
807 return len; 814 return len;
808} 815}
809 816
@@ -1157,7 +1164,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
1157 * all containers are on the virtual channel 0 (CONTAINER_CHANNEL) 1164 * all containers are on the virtual channel 0 (CONTAINER_CHANNEL)
1158 * physical channels are address by their actual physical number+1 1165 * physical channels are address by their actual physical number+1
1159 */ 1166 */
1160 if ((aac->nondasd_support == 1) || expose_physicals) 1167 if (aac->nondasd_support || expose_physicals || aac->jbod)
1161 shost->max_channel = aac->maximum_num_channels; 1168 shost->max_channel = aac->maximum_num_channels;
1162 else 1169 else
1163 shost->max_channel = 0; 1170 shost->max_channel = 0;