diff options
Diffstat (limited to 'drivers/scsi/aacraid')
-rw-r--r-- | drivers/scsi/aacraid/aachba.c | 5 | ||||
-rw-r--r-- | drivers/scsi/aacraid/aacraid.h | 6 | ||||
-rw-r--r-- | drivers/scsi/aacraid/commsup.c | 24 | ||||
-rw-r--r-- | drivers/scsi/aacraid/linit.c | 15 |
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; |