aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aacraid
diff options
context:
space:
mode:
authorSalyzyn, Mark <Mark_Salyzyn@adaptec.com>2008-01-17 12:25:07 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-23 12:29:34 -0500
commitcb1042f285c2168bd8cf10aca0e24802e682252b (patch)
tree80b682f3fc0622de08278e37e51c59f94ad530e0 /drivers/scsi/aacraid
parent2ca39c48ea0d2fd265479d0b62f2ac8878900360 (diff)
[SCSI] aacraid: add Voodoo Lite class of cards.
The cards being added are supported in a limited sense already through family matching, but we needed to add some functionality to the driver to expose selectively the physical drives. These Physical drives are specifically marked to not be part of any array and thus are declared JBODs (Just a Bunch Of Drives) for generic SCSI access. We report that this is the second patch in a set of two, but merely depends on the stand-alone functionality of the first patch which adds in that case the ability to report a driver feature flag via sysfs. We leverage that functionality by reporting that this driver now supports this new JBOD feature for the controller so that the array management applications may react accordingly and guide the user as they manage the controller. 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/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;