diff options
-rw-r--r-- | drivers/scsi/aacraid/aachba.c | 7 | ||||
-rw-r--r-- | drivers/scsi/aacraid/aacraid.h | 1 | ||||
-rw-r--r-- | drivers/scsi/aacraid/linit.c | 25 |
3 files changed, 32 insertions, 1 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 43d6aff460d2..eee65c145cb8 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
@@ -690,7 +690,12 @@ static char *container_types[] = { | |||
690 | "Unknown" | 690 | "Unknown" |
691 | }; | 691 | }; |
692 | 692 | ||
693 | 693 | char * get_container_type(unsigned tindex) | |
694 | { | ||
695 | if (tindex >= ARRAY_SIZE(container_types)) | ||
696 | tindex = ARRAY_SIZE(container_types) - 1; | ||
697 | return container_types[tindex]; | ||
698 | } | ||
694 | 699 | ||
695 | /* Function: setinqstr | 700 | /* Function: setinqstr |
696 | * | 701 | * |
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 7bb3d9fde713..6d4e24cea3dc 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h | |||
@@ -1869,6 +1869,7 @@ int aac_probe_container(struct aac_dev *dev, int cid); | |||
1869 | int _aac_rx_init(struct aac_dev *dev); | 1869 | int _aac_rx_init(struct aac_dev *dev); |
1870 | int aac_rx_select_comm(struct aac_dev *dev, int comm); | 1870 | int aac_rx_select_comm(struct aac_dev *dev, int comm); |
1871 | int aac_rx_deliver_producer(struct fib * fib); | 1871 | int aac_rx_deliver_producer(struct fib * fib); |
1872 | char * get_container_type(unsigned type); | ||
1872 | extern int numacb; | 1873 | extern int numacb; |
1873 | extern int acbsize; | 1874 | extern int acbsize; |
1874 | extern char aac_driver_version[]; | 1875 | extern char aac_driver_version[]; |
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index b4ad9effcf50..e6bdc930d528 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c | |||
@@ -487,6 +487,30 @@ static int aac_change_queue_depth(struct scsi_device *sdev, int depth) | |||
487 | return sdev->queue_depth; | 487 | return sdev->queue_depth; |
488 | } | 488 | } |
489 | 489 | ||
490 | static ssize_t aac_show_raid_level(struct device *dev, struct device_attribute *attr, char *buf) | ||
491 | { | ||
492 | struct scsi_device * sdev = to_scsi_device(dev); | ||
493 | if (sdev_channel(sdev) != CONTAINER_CHANNEL) | ||
494 | return snprintf(buf, PAGE_SIZE, sdev->no_uld_attach | ||
495 | ? "Hidden\n" : "JBOD"); | ||
496 | return snprintf(buf, PAGE_SIZE, "%s\n", | ||
497 | get_container_type(((struct aac_dev *)(sdev->host->hostdata)) | ||
498 | ->fsa_dev[sdev_id(sdev)].type)); | ||
499 | } | ||
500 | |||
501 | static struct device_attribute aac_raid_level_attr = { | ||
502 | .attr = { | ||
503 | .name = "level", | ||
504 | .mode = S_IRUGO, | ||
505 | }, | ||
506 | .show = aac_show_raid_level | ||
507 | }; | ||
508 | |||
509 | static struct device_attribute *aac_dev_attrs[] = { | ||
510 | &aac_raid_level_attr, | ||
511 | NULL, | ||
512 | }; | ||
513 | |||
490 | static int aac_ioctl(struct scsi_device *sdev, int cmd, void __user * arg) | 514 | static int aac_ioctl(struct scsi_device *sdev, int cmd, void __user * arg) |
491 | { | 515 | { |
492 | struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata; | 516 | struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata; |
@@ -941,6 +965,7 @@ static struct scsi_host_template aac_driver_template = { | |||
941 | .shost_attrs = aac_attrs, | 965 | .shost_attrs = aac_attrs, |
942 | .slave_configure = aac_slave_configure, | 966 | .slave_configure = aac_slave_configure, |
943 | .change_queue_depth = aac_change_queue_depth, | 967 | .change_queue_depth = aac_change_queue_depth, |
968 | .sdev_attrs = aac_dev_attrs, | ||
944 | .eh_abort_handler = aac_eh_abort, | 969 | .eh_abort_handler = aac_eh_abort, |
945 | .eh_host_reset_handler = aac_eh_reset, | 970 | .eh_host_reset_handler = aac_eh_reset, |
946 | .can_queue = AAC_NUM_IO_FIB, | 971 | .can_queue = AAC_NUM_IO_FIB, |