diff options
| author | Mark Salyzyn <Mark_Salyzyn@adaptec.com> | 2008-04-30 16:03:42 -0400 |
|---|---|---|
| committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-05-02 14:06:44 -0400 |
| commit | 655d722cf7812078306f975a3afe88b96a1306b8 (patch) | |
| tree | bdafc17b2a402f8ea88134a9a83299c79463e320 /drivers | |
| parent | a4576b5da671563187ac388e36e1d077bd20e43a (diff) | |
[SCSI] aacraid: Add Power Management support
For firmware that supports the feature(s), add the ability to start or
stop an array using the associated SCSI commands, to automatically
manage the spin-up of an array on new I/O reporting back the
appropriate check conditions and actions in cooperation with the
normal timeout mechanisms and enable the blackout period management in
the Firmware associated with the background spin-down of the arrays
when the Firmware times out and deems the arrays as idle.
Signed-off-by: Mark Salyzyn <aacraid@adaptec.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/scsi/aacraid/aachba.c | 133 | ||||
| -rw-r--r-- | drivers/scsi/aacraid/aacraid.h | 24 | ||||
| -rw-r--r-- | drivers/scsi/aacraid/comminit.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/aacraid/linit.c | 6 |
4 files changed, 154 insertions, 11 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 460d4024c46c..aa4e77c25273 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
| @@ -498,6 +498,11 @@ static void _aac_probe_container2(void * context, struct fib * fibptr) | |||
| 498 | (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE) && | 498 | (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE) && |
| 499 | (le32_to_cpu(dresp->mnt[0].state) != FSCS_HIDDEN)) { | 499 | (le32_to_cpu(dresp->mnt[0].state) != FSCS_HIDDEN)) { |
| 500 | fsa_dev_ptr->valid = 1; | 500 | fsa_dev_ptr->valid = 1; |
| 501 | /* sense_key holds the current state of the spin-up */ | ||
| 502 | if (dresp->mnt[0].state & cpu_to_le32(FSCS_NOT_READY)) | ||
| 503 | fsa_dev_ptr->sense_data.sense_key = NOT_READY; | ||
| 504 | else if (fsa_dev_ptr->sense_data.sense_key == NOT_READY) | ||
| 505 | fsa_dev_ptr->sense_data.sense_key = NO_SENSE; | ||
| 501 | fsa_dev_ptr->type = le32_to_cpu(dresp->mnt[0].vol); | 506 | fsa_dev_ptr->type = le32_to_cpu(dresp->mnt[0].vol); |
| 502 | fsa_dev_ptr->size | 507 | fsa_dev_ptr->size |
| 503 | = ((u64)le32_to_cpu(dresp->mnt[0].capacity)) + | 508 | = ((u64)le32_to_cpu(dresp->mnt[0].capacity)) + |
| @@ -1509,20 +1514,35 @@ static void io_callback(void *context, struct fib * fibptr) | |||
| 1509 | scsi_dma_unmap(scsicmd); | 1514 | scsi_dma_unmap(scsicmd); |
| 1510 | 1515 | ||
| 1511 | readreply = (struct aac_read_reply *)fib_data(fibptr); | 1516 | readreply = (struct aac_read_reply *)fib_data(fibptr); |
| 1512 | if (le32_to_cpu(readreply->status) == ST_OK) | 1517 | switch (le32_to_cpu(readreply->status)) { |
| 1513 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; | 1518 | case ST_OK: |
| 1514 | else { | 1519 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | |
| 1520 | SAM_STAT_GOOD; | ||
| 1521 | dev->fsa_dev[cid].sense_data.sense_key = NO_SENSE; | ||
| 1522 | break; | ||
| 1523 | case ST_NOT_READY: | ||
| 1524 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | | ||
| 1525 | SAM_STAT_CHECK_CONDITION; | ||
| 1526 | set_sense(&dev->fsa_dev[cid].sense_data, NOT_READY, | ||
| 1527 | SENCODE_BECOMING_READY, ASENCODE_BECOMING_READY, 0, 0); | ||
| 1528 | memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, | ||
| 1529 | min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), | ||
| 1530 | SCSI_SENSE_BUFFERSIZE)); | ||
| 1531 | break; | ||
| 1532 | default: | ||
| 1515 | #ifdef AAC_DETAILED_STATUS_INFO | 1533 | #ifdef AAC_DETAILED_STATUS_INFO |
| 1516 | printk(KERN_WARNING "io_callback: io failed, status = %d\n", | 1534 | printk(KERN_WARNING "io_callback: io failed, status = %d\n", |
| 1517 | le32_to_cpu(readreply->status)); | 1535 | le32_to_cpu(readreply->status)); |
| 1518 | #endif | 1536 | #endif |
| 1519 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION; | 1537 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | |
| 1538 | SAM_STAT_CHECK_CONDITION; | ||
| 1520 | set_sense(&dev->fsa_dev[cid].sense_data, | 1539 | set_sense(&dev->fsa_dev[cid].sense_data, |
| 1521 | HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE, | 1540 | HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE, |
| 1522 | ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0); | 1541 | ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0); |
| 1523 | memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, | 1542 | memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, |
| 1524 | min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), | 1543 | min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), |
| 1525 | SCSI_SENSE_BUFFERSIZE)); | 1544 | SCSI_SENSE_BUFFERSIZE)); |
| 1545 | break; | ||
| 1526 | } | 1546 | } |
| 1527 | aac_fib_complete(fibptr); | 1547 | aac_fib_complete(fibptr); |
| 1528 | aac_fib_free(fibptr); | 1548 | aac_fib_free(fibptr); |
| @@ -1863,6 +1883,84 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd) | |||
| 1863 | return SCSI_MLQUEUE_HOST_BUSY; | 1883 | return SCSI_MLQUEUE_HOST_BUSY; |
| 1864 | } | 1884 | } |
| 1865 | 1885 | ||
| 1886 | static void aac_start_stop_callback(void *context, struct fib *fibptr) | ||
| 1887 | { | ||
| 1888 | struct scsi_cmnd *scsicmd = context; | ||
| 1889 | |||
| 1890 | if (!aac_valid_context(scsicmd, fibptr)) | ||
| 1891 | return; | ||
| 1892 | |||
| 1893 | BUG_ON(fibptr == NULL); | ||
| 1894 | |||
| 1895 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; | ||
| 1896 | |||
| 1897 | aac_fib_complete(fibptr); | ||
| 1898 | aac_fib_free(fibptr); | ||
| 1899 | scsicmd->scsi_done(scsicmd); | ||
| 1900 | } | ||
| 1901 | |||
| 1902 | static int aac_start_stop(struct scsi_cmnd *scsicmd) | ||
| 1903 | { | ||
| 1904 | int status; | ||
| 1905 | struct fib *cmd_fibcontext; | ||
| 1906 | struct aac_power_management *pmcmd; | ||
| 1907 | struct scsi_device *sdev = scsicmd->device; | ||
| 1908 | struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata; | ||
| 1909 | |||
| 1910 | if (!(aac->supplement_adapter_info.SupportedOptions2 & | ||
| 1911 | AAC_OPTION_POWER_MANAGEMENT)) { | ||
| 1912 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | | ||
| 1913 | SAM_STAT_GOOD; | ||
| 1914 | scsicmd->scsi_done(scsicmd); | ||
| 1915 | return 0; | ||
| 1916 | } | ||
| 1917 | |||
| 1918 | if (aac->in_reset) | ||
| 1919 | return SCSI_MLQUEUE_HOST_BUSY; | ||
| 1920 | |||
| 1921 | /* | ||
| 1922 | * Allocate and initialize a Fib | ||
| 1923 | */ | ||
| 1924 | cmd_fibcontext = aac_fib_alloc(aac); | ||
| 1925 | if (!cmd_fibcontext) | ||
| 1926 | return SCSI_MLQUEUE_HOST_BUSY; | ||
| 1927 | |||
| 1928 | aac_fib_init(cmd_fibcontext); | ||
| 1929 | |||
| 1930 | pmcmd = fib_data(cmd_fibcontext); | ||
| 1931 | pmcmd->command = cpu_to_le32(VM_ContainerConfig); | ||
| 1932 | pmcmd->type = cpu_to_le32(CT_POWER_MANAGEMENT); | ||
| 1933 | /* Eject bit ignored, not relevant */ | ||
| 1934 | pmcmd->sub = (scsicmd->cmnd[4] & 1) ? | ||
| 1935 | cpu_to_le32(CT_PM_START_UNIT) : cpu_to_le32(CT_PM_STOP_UNIT); | ||
| 1936 | pmcmd->cid = cpu_to_le32(sdev_id(sdev)); | ||
| 1937 | pmcmd->parm = (scsicmd->cmnd[1] & 1) ? | ||
| 1938 | cpu_to_le32(CT_PM_UNIT_IMMEDIATE) : 0; | ||
| 1939 | |||
| 1940 | /* | ||
| 1941 | * Now send the Fib to the adapter | ||
| 1942 | */ | ||
| 1943 | status = aac_fib_send(ContainerCommand, | ||
| 1944 | cmd_fibcontext, | ||
| 1945 | sizeof(struct aac_power_management), | ||
| 1946 | FsaNormal, | ||
| 1947 | 0, 1, | ||
| 1948 | (fib_callback)aac_start_stop_callback, | ||
| 1949 | (void *)scsicmd); | ||
| 1950 | |||
| 1951 | /* | ||
| 1952 | * Check that the command queued to the controller | ||
| 1953 | */ | ||
| 1954 | if (status == -EINPROGRESS) { | ||
| 1955 | scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; | ||
| 1956 | return 0; | ||
| 1957 | } | ||
| 1958 | |||
| 1959 | aac_fib_complete(cmd_fibcontext); | ||
| 1960 | aac_fib_free(cmd_fibcontext); | ||
| 1961 | return SCSI_MLQUEUE_HOST_BUSY; | ||
| 1962 | } | ||
| 1963 | |||
| 1866 | /** | 1964 | /** |
| 1867 | * aac_scsi_cmd() - Process SCSI command | 1965 | * aac_scsi_cmd() - Process SCSI command |
| 1868 | * @scsicmd: SCSI command block | 1966 | * @scsicmd: SCSI command block |
| @@ -1899,7 +1997,9 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) | |||
| 1899 | * If the target container doesn't exist, it may have | 1997 | * If the target container doesn't exist, it may have |
| 1900 | * been newly created | 1998 | * been newly created |
| 1901 | */ | 1999 | */ |
| 1902 | if ((fsa_dev_ptr[cid].valid & 1) == 0) { | 2000 | if (((fsa_dev_ptr[cid].valid & 1) == 0) || |
| 2001 | (fsa_dev_ptr[cid].sense_data.sense_key == | ||
| 2002 | NOT_READY)) { | ||
| 1903 | switch (scsicmd->cmnd[0]) { | 2003 | switch (scsicmd->cmnd[0]) { |
| 1904 | case SERVICE_ACTION_IN: | 2004 | case SERVICE_ACTION_IN: |
| 1905 | if (!(dev->raw_io_interface) || | 2005 | if (!(dev->raw_io_interface) || |
| @@ -2091,8 +2191,8 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) | |||
| 2091 | scsi_sg_copy_from_buffer(scsicmd, cp, sizeof(cp)); | 2191 | scsi_sg_copy_from_buffer(scsicmd, cp, sizeof(cp)); |
| 2092 | /* Do not cache partition table for arrays */ | 2192 | /* Do not cache partition table for arrays */ |
| 2093 | scsicmd->device->removable = 1; | 2193 | scsicmd->device->removable = 1; |
| 2094 | 2194 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | | |
| 2095 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; | 2195 | SAM_STAT_GOOD; |
| 2096 | scsicmd->scsi_done(scsicmd); | 2196 | scsicmd->scsi_done(scsicmd); |
| 2097 | 2197 | ||
| 2098 | return 0; | 2198 | return 0; |
| @@ -2187,15 +2287,32 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) | |||
| 2187 | * These commands are all No-Ops | 2287 | * These commands are all No-Ops |
| 2188 | */ | 2288 | */ |
| 2189 | case TEST_UNIT_READY: | 2289 | case TEST_UNIT_READY: |
| 2290 | if (fsa_dev_ptr[cid].sense_data.sense_key == NOT_READY) { | ||
| 2291 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | | ||
| 2292 | SAM_STAT_CHECK_CONDITION; | ||
| 2293 | set_sense(&dev->fsa_dev[cid].sense_data, | ||
| 2294 | NOT_READY, SENCODE_BECOMING_READY, | ||
| 2295 | ASENCODE_BECOMING_READY, 0, 0); | ||
| 2296 | memcpy(scsicmd->sense_buffer, | ||
| 2297 | &dev->fsa_dev[cid].sense_data, | ||
| 2298 | min_t(size_t, | ||
| 2299 | sizeof(dev->fsa_dev[cid].sense_data), | ||
| 2300 | SCSI_SENSE_BUFFERSIZE)); | ||
| 2301 | scsicmd->scsi_done(scsicmd); | ||
| 2302 | return 0; | ||
| 2303 | } | ||
| 2304 | /* FALLTHRU */ | ||
| 2190 | case RESERVE: | 2305 | case RESERVE: |
| 2191 | case RELEASE: | 2306 | case RELEASE: |
| 2192 | case REZERO_UNIT: | 2307 | case REZERO_UNIT: |
| 2193 | case REASSIGN_BLOCKS: | 2308 | case REASSIGN_BLOCKS: |
| 2194 | case SEEK_10: | 2309 | case SEEK_10: |
| 2195 | case START_STOP: | ||
| 2196 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; | 2310 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; |
| 2197 | scsicmd->scsi_done(scsicmd); | 2311 | scsicmd->scsi_done(scsicmd); |
| 2198 | return 0; | 2312 | return 0; |
| 2313 | |||
| 2314 | case START_STOP: | ||
| 2315 | return aac_start_stop(scsicmd); | ||
| 2199 | } | 2316 | } |
| 2200 | 2317 | ||
| 2201 | switch (scsicmd->cmnd[0]) | 2318 | switch (scsicmd->cmnd[0]) |
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index a990e5b088cc..73916adb8f80 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 2455 | 15 | # define AAC_DRIVER_BUILD 2456 |
| 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 |
| @@ -424,6 +424,8 @@ struct aac_init | |||
| 424 | */ | 424 | */ |
| 425 | __le32 InitFlags; /* flags for supported features */ | 425 | __le32 InitFlags; /* flags for supported features */ |
| 426 | #define INITFLAGS_NEW_COMM_SUPPORTED 0x00000001 | 426 | #define INITFLAGS_NEW_COMM_SUPPORTED 0x00000001 |
| 427 | #define INITFLAGS_DRIVER_USES_UTC_TIME 0x00000010 | ||
| 428 | #define INITFLAGS_DRIVER_SUPPORTS_PM 0x00000020 | ||
| 427 | __le32 MaxIoCommands; /* max outstanding commands */ | 429 | __le32 MaxIoCommands; /* max outstanding commands */ |
| 428 | __le32 MaxIoSize; /* largest I/O command */ | 430 | __le32 MaxIoSize; /* largest I/O command */ |
| 429 | __le32 MaxFibSize; /* largest FIB to adapter */ | 431 | __le32 MaxFibSize; /* largest FIB to adapter */ |
| @@ -867,8 +869,10 @@ struct aac_supplement_adapter_info | |||
| 867 | }; | 869 | }; |
| 868 | #define AAC_FEATURE_FALCON cpu_to_le32(0x00000010) | 870 | #define AAC_FEATURE_FALCON cpu_to_le32(0x00000010) |
| 869 | #define AAC_FEATURE_JBOD cpu_to_le32(0x08000000) | 871 | #define AAC_FEATURE_JBOD cpu_to_le32(0x08000000) |
| 870 | #define AAC_OPTION_MU_RESET cpu_to_le32(0x00000001) | 872 | /* SupportedOptions2 */ |
| 871 | #define AAC_OPTION_IGNORE_RESET cpu_to_le32(0x00000002) | 873 | #define AAC_OPTION_MU_RESET cpu_to_le32(0x00000001) |
| 874 | #define AAC_OPTION_IGNORE_RESET cpu_to_le32(0x00000002) | ||
| 875 | #define AAC_OPTION_POWER_MANAGEMENT cpu_to_le32(0x00000004) | ||
| 872 | #define AAC_SIS_VERSION_V3 3 | 876 | #define AAC_SIS_VERSION_V3 3 |
| 873 | #define AAC_SIS_SLOT_UNKNOWN 0xFF | 877 | #define AAC_SIS_SLOT_UNKNOWN 0xFF |
| 874 | 878 | ||
| @@ -1148,6 +1152,7 @@ struct aac_dev | |||
| 1148 | #define ST_DQUOT 69 | 1152 | #define ST_DQUOT 69 |
| 1149 | #define ST_STALE 70 | 1153 | #define ST_STALE 70 |
| 1150 | #define ST_REMOTE 71 | 1154 | #define ST_REMOTE 71 |
| 1155 | #define ST_NOT_READY 72 | ||
| 1151 | #define ST_BADHANDLE 10001 | 1156 | #define ST_BADHANDLE 10001 |
| 1152 | #define ST_NOT_SYNC 10002 | 1157 | #define ST_NOT_SYNC 10002 |
| 1153 | #define ST_BAD_COOKIE 10003 | 1158 | #define ST_BAD_COOKIE 10003 |
| @@ -1269,6 +1274,18 @@ struct aac_synchronize_reply { | |||
| 1269 | u8 data[16]; | 1274 | u8 data[16]; |
| 1270 | }; | 1275 | }; |
| 1271 | 1276 | ||
| 1277 | #define CT_POWER_MANAGEMENT 245 | ||
| 1278 | #define CT_PM_START_UNIT 2 | ||
| 1279 | #define CT_PM_STOP_UNIT 3 | ||
| 1280 | #define CT_PM_UNIT_IMMEDIATE 1 | ||
| 1281 | struct aac_power_management { | ||
| 1282 | __le32 command; /* VM_ContainerConfig */ | ||
| 1283 | __le32 type; /* CT_POWER_MANAGEMENT */ | ||
| 1284 | __le32 sub; /* CT_PM_* */ | ||
| 1285 | __le32 cid; | ||
| 1286 | __le32 parm; /* CT_PM_sub_* */ | ||
| 1287 | }; | ||
| 1288 | |||
| 1272 | #define CT_PAUSE_IO 65 | 1289 | #define CT_PAUSE_IO 65 |
| 1273 | #define CT_RELEASE_IO 66 | 1290 | #define CT_RELEASE_IO 66 |
| 1274 | struct aac_pause { | 1291 | struct aac_pause { |
| @@ -1536,6 +1553,7 @@ struct aac_mntent { | |||
| 1536 | #define FSCS_NOTCLEAN 0x0001 /* fsck is necessary before mounting */ | 1553 | #define FSCS_NOTCLEAN 0x0001 /* fsck is necessary before mounting */ |
| 1537 | #define FSCS_READONLY 0x0002 /* possible result of broken mirror */ | 1554 | #define FSCS_READONLY 0x0002 /* possible result of broken mirror */ |
| 1538 | #define FSCS_HIDDEN 0x0004 /* should be ignored - set during a clear */ | 1555 | #define FSCS_HIDDEN 0x0004 /* should be ignored - set during a clear */ |
| 1556 | #define FSCS_NOT_READY 0x0008 /* Array spinning up to fulfil request */ | ||
| 1539 | 1557 | ||
| 1540 | struct aac_query_mount { | 1558 | struct aac_query_mount { |
| 1541 | __le32 command; | 1559 | __le32 command; |
diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c index 294a802450be..cbac06355107 100644 --- a/drivers/scsi/aacraid/comminit.c +++ b/drivers/scsi/aacraid/comminit.c | |||
| @@ -97,6 +97,8 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co | |||
| 97 | init->InitFlags = cpu_to_le32(INITFLAGS_NEW_COMM_SUPPORTED); | 97 | init->InitFlags = cpu_to_le32(INITFLAGS_NEW_COMM_SUPPORTED); |
| 98 | dprintk((KERN_WARNING"aacraid: New Comm Interface enabled\n")); | 98 | dprintk((KERN_WARNING"aacraid: New Comm Interface enabled\n")); |
| 99 | } | 99 | } |
| 100 | init->InitFlags |= cpu_to_le32(INITFLAGS_DRIVER_USES_UTC_TIME | | ||
| 101 | INITFLAGS_DRIVER_SUPPORTS_PM); | ||
| 100 | init->MaxIoCommands = cpu_to_le32(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); | 102 | init->MaxIoCommands = cpu_to_le32(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); |
| 101 | init->MaxIoSize = cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9); | 103 | init->MaxIoSize = cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9); |
| 102 | init->MaxFibSize = cpu_to_le32(dev->max_fib_size); | 104 | init->MaxFibSize = cpu_to_le32(dev->max_fib_size); |
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index c444527ae2fa..1f7c83607f84 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c | |||
| @@ -811,6 +811,12 @@ static ssize_t aac_show_flags(struct device *cdev, | |||
| 811 | "SAI_READ_CAPACITY_16\n"); | 811 | "SAI_READ_CAPACITY_16\n"); |
| 812 | if (dev->jbod) | 812 | if (dev->jbod) |
| 813 | len += snprintf(buf + len, PAGE_SIZE - len, "SUPPORTED_JBOD\n"); | 813 | len += snprintf(buf + len, PAGE_SIZE - len, "SUPPORTED_JBOD\n"); |
| 814 | if (dev->supplement_adapter_info.SupportedOptions2 & | ||
| 815 | AAC_OPTION_POWER_MANAGEMENT) | ||
| 816 | len += snprintf(buf + len, PAGE_SIZE - len, | ||
| 817 | "SUPPORTED_POWER_MANAGEMENT\n"); | ||
| 818 | if (dev->msi) | ||
| 819 | len += snprintf(buf + len, PAGE_SIZE - len, "PCI_HAS_MSI\n"); | ||
| 814 | return len; | 820 | return len; |
| 815 | } | 821 | } |
| 816 | 822 | ||
