diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-02 16:52:35 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-02 16:52:35 -0400 |
commit | d626e3bf728c47746f2129aa00c775d4e8c2a73b (patch) | |
tree | 551a8c362c7b9833e7848bc6167cf322f75563a1 /drivers/scsi/aacraid | |
parent | b66e1f11ebc429569a3784aaf64123633d9e3ed1 (diff) | |
parent | 7ad4a485002c141f156a014e89542e01e7f8e36a (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6:
[SCSI] aic94xx: fix section mismatch
[SCSI] u14-34f: Fix 32bit only problem
[SCSI] dpt_i2o: sysfs code
[SCSI] dpt_i2o: 64 bit support
[SCSI] dpt_i2o: move from virt_to_bus/bus_to_virt to dma_alloc_coherent
[SCSI] dpt_i2o: use standard __init / __exit code
[SCSI] megaraid_sas: fix suspend/resume sections
[SCSI] aacraid: Add Power Management support
[SCSI] aacraid: Fix jbod operations scan issues
[SCSI] aacraid: Fix warning about macro side-effects
[SCSI] add support for variable length extended commands
[SCSI] Let scsi_cmnd->cmnd use request->cmd buffer
[SCSI] bsg: add large command support
[SCSI] aacraid: Fix down_interruptible() to check the return value correctly
[SCSI] megaraid_sas; Update the Version and Changelog
[SCSI] ibmvscsi: Handle non SCSI error status
[SCSI] bug fix for free list handling
[SCSI] ipr: Rename ipr's state scsi host attribute to prevent collisions
[SCSI] megaraid_mbox: fix Dell CERC firmware problem
Diffstat (limited to 'drivers/scsi/aacraid')
-rw-r--r-- | drivers/scsi/aacraid/aachba.c | 133 | ||||
-rw-r--r-- | drivers/scsi/aacraid/aacraid.h | 28 | ||||
-rw-r--r-- | drivers/scsi/aacraid/comminit.c | 2 | ||||
-rw-r--r-- | drivers/scsi/aacraid/commsup.c | 34 | ||||
-rw-r--r-- | drivers/scsi/aacraid/linit.c | 22 |
5 files changed, 191 insertions, 28 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 113ca9c8934c..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 |
@@ -34,8 +34,8 @@ | |||
34 | #define CONTAINER_TO_ID(cont) (cont) | 34 | #define CONTAINER_TO_ID(cont) (cont) |
35 | #define CONTAINER_TO_LUN(cont) (0) | 35 | #define CONTAINER_TO_LUN(cont) (0) |
36 | 36 | ||
37 | #define aac_phys_to_logical(x) (x+1) | 37 | #define aac_phys_to_logical(x) ((x)+1) |
38 | #define aac_logical_to_phys(x) (x?x-1:0) | 38 | #define aac_logical_to_phys(x) ((x)?(x)-1:0) |
39 | 39 | ||
40 | /* #define AAC_DETAILED_STATUS_INFO */ | 40 | /* #define AAC_DETAILED_STATUS_INFO */ |
41 | 41 | ||
@@ -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/commsup.c b/drivers/scsi/aacraid/commsup.c index ef67816a6fe5..289304aab690 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c | |||
@@ -515,7 +515,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, | |||
515 | } | 515 | } |
516 | udelay(5); | 516 | udelay(5); |
517 | } | 517 | } |
518 | } else if (down_interruptible(&fibptr->event_wait) == 0) { | 518 | } else if (down_interruptible(&fibptr->event_wait)) { |
519 | fibptr->done = 2; | 519 | fibptr->done = 2; |
520 | up(&fibptr->event_wait); | 520 | up(&fibptr->event_wait); |
521 | } | 521 | } |
@@ -906,15 +906,22 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
906 | case AifEnAddJBOD: | 906 | case AifEnAddJBOD: |
907 | case AifEnDeleteJBOD: | 907 | case AifEnDeleteJBOD: |
908 | container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); | 908 | container = le32_to_cpu(((__le32 *)aifcmd->data)[1]); |
909 | if ((container >> 28)) | 909 | if ((container >> 28)) { |
910 | container = (u32)-1; | ||
910 | break; | 911 | break; |
912 | } | ||
911 | channel = (container >> 24) & 0xF; | 913 | channel = (container >> 24) & 0xF; |
912 | if (channel >= dev->maximum_num_channels) | 914 | if (channel >= dev->maximum_num_channels) { |
915 | container = (u32)-1; | ||
913 | break; | 916 | break; |
917 | } | ||
914 | id = container & 0xFFFF; | 918 | id = container & 0xFFFF; |
915 | if (id >= dev->maximum_num_physicals) | 919 | if (id >= dev->maximum_num_physicals) { |
920 | container = (u32)-1; | ||
916 | break; | 921 | break; |
922 | } | ||
917 | lun = (container >> 16) & 0xFF; | 923 | lun = (container >> 16) & 0xFF; |
924 | container = (u32)-1; | ||
918 | channel = aac_phys_to_logical(channel); | 925 | channel = aac_phys_to_logical(channel); |
919 | device_config_needed = | 926 | device_config_needed = |
920 | (((__le32 *)aifcmd->data)[0] == | 927 | (((__le32 *)aifcmd->data)[0] == |
@@ -933,13 +940,18 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
933 | case EM_DRIVE_REMOVAL: | 940 | case EM_DRIVE_REMOVAL: |
934 | container = le32_to_cpu( | 941 | container = le32_to_cpu( |
935 | ((__le32 *)aifcmd->data)[2]); | 942 | ((__le32 *)aifcmd->data)[2]); |
936 | if ((container >> 28)) | 943 | if ((container >> 28)) { |
944 | container = (u32)-1; | ||
937 | break; | 945 | break; |
946 | } | ||
938 | channel = (container >> 24) & 0xF; | 947 | channel = (container >> 24) & 0xF; |
939 | if (channel >= dev->maximum_num_channels) | 948 | if (channel >= dev->maximum_num_channels) { |
949 | container = (u32)-1; | ||
940 | break; | 950 | break; |
951 | } | ||
941 | id = container & 0xFFFF; | 952 | id = container & 0xFFFF; |
942 | lun = (container >> 16) & 0xFF; | 953 | lun = (container >> 16) & 0xFF; |
954 | container = (u32)-1; | ||
943 | if (id >= dev->maximum_num_physicals) { | 955 | if (id >= dev->maximum_num_physicals) { |
944 | /* legacy dev_t ? */ | 956 | /* legacy dev_t ? */ |
945 | if ((0x2000 <= id) || lun || channel || | 957 | if ((0x2000 <= id) || lun || channel || |
@@ -1025,9 +1037,10 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
1025 | break; | 1037 | break; |
1026 | } | 1038 | } |
1027 | 1039 | ||
1040 | container = 0; | ||
1041 | retry_next: | ||
1028 | if (device_config_needed == NOTHING) | 1042 | if (device_config_needed == NOTHING) |
1029 | for (container = 0; container < dev->maximum_num_containers; | 1043 | for (; container < dev->maximum_num_containers; ++container) { |
1030 | ++container) { | ||
1031 | if ((dev->fsa_dev[container].config_waiting_on == 0) && | 1044 | if ((dev->fsa_dev[container].config_waiting_on == 0) && |
1032 | (dev->fsa_dev[container].config_needed != NOTHING) && | 1045 | (dev->fsa_dev[container].config_needed != NOTHING) && |
1033 | time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) { | 1046 | time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) { |
@@ -1110,6 +1123,11 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
1110 | } | 1123 | } |
1111 | if (device_config_needed == ADD) | 1124 | if (device_config_needed == ADD) |
1112 | scsi_add_device(dev->scsi_host_ptr, channel, id, lun); | 1125 | scsi_add_device(dev->scsi_host_ptr, channel, id, lun); |
1126 | if (channel == CONTAINER_CHANNEL) { | ||
1127 | container++; | ||
1128 | device_config_needed = NOTHING; | ||
1129 | goto retry_next; | ||
1130 | } | ||
1113 | } | 1131 | } |
1114 | 1132 | ||
1115 | static int _aac_reset_adapter(struct aac_dev *aac, int forced) | 1133 | static int _aac_reset_adapter(struct aac_dev *aac, int forced) |
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index c109f63f8279..1f7c83607f84 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c | |||
@@ -401,6 +401,8 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev, | |||
401 | static int aac_slave_configure(struct scsi_device *sdev) | 401 | static int aac_slave_configure(struct scsi_device *sdev) |
402 | { | 402 | { |
403 | struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata; | 403 | struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata; |
404 | if (aac->jbod && (sdev->type == TYPE_DISK)) | ||
405 | sdev->removable = 1; | ||
404 | if ((sdev->type == TYPE_DISK) && | 406 | if ((sdev->type == TYPE_DISK) && |
405 | (sdev_channel(sdev) != CONTAINER_CHANNEL) && | 407 | (sdev_channel(sdev) != CONTAINER_CHANNEL) && |
406 | (!aac->jbod || sdev->inq_periph_qual) && | 408 | (!aac->jbod || sdev->inq_periph_qual) && |
@@ -809,6 +811,12 @@ static ssize_t aac_show_flags(struct device *cdev, | |||
809 | "SAI_READ_CAPACITY_16\n"); | 811 | "SAI_READ_CAPACITY_16\n"); |
810 | if (dev->jbod) | 812 | if (dev->jbod) |
811 | 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"); | ||
812 | return len; | 820 | return len; |
813 | } | 821 | } |
814 | 822 | ||
@@ -1106,7 +1114,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
1106 | aac->pdev = pdev; | 1114 | aac->pdev = pdev; |
1107 | aac->name = aac_driver_template.name; | 1115 | aac->name = aac_driver_template.name; |
1108 | aac->id = shost->unique_id; | 1116 | aac->id = shost->unique_id; |
1109 | aac->cardtype = index; | 1117 | aac->cardtype = index; |
1110 | INIT_LIST_HEAD(&aac->entry); | 1118 | INIT_LIST_HEAD(&aac->entry); |
1111 | 1119 | ||
1112 | aac->fibs = kmalloc(sizeof(struct fib) * (shost->can_queue + AAC_NUM_MGT_FIB), GFP_KERNEL); | 1120 | aac->fibs = kmalloc(sizeof(struct fib) * (shost->can_queue + AAC_NUM_MGT_FIB), GFP_KERNEL); |
@@ -1146,19 +1154,19 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
1146 | goto out_deinit; | 1154 | goto out_deinit; |
1147 | 1155 | ||
1148 | /* | 1156 | /* |
1149 | * Lets override negotiations and drop the maximum SG limit to 34 | 1157 | * Lets override negotiations and drop the maximum SG limit to 34 |
1150 | */ | 1158 | */ |
1151 | if ((aac_drivers[index].quirks & AAC_QUIRK_34SG) && | 1159 | if ((aac_drivers[index].quirks & AAC_QUIRK_34SG) && |
1152 | (shost->sg_tablesize > 34)) { | 1160 | (shost->sg_tablesize > 34)) { |
1153 | shost->sg_tablesize = 34; | 1161 | shost->sg_tablesize = 34; |
1154 | shost->max_sectors = (shost->sg_tablesize * 8) + 112; | 1162 | shost->max_sectors = (shost->sg_tablesize * 8) + 112; |
1155 | } | 1163 | } |
1156 | 1164 | ||
1157 | if ((aac_drivers[index].quirks & AAC_QUIRK_17SG) && | 1165 | if ((aac_drivers[index].quirks & AAC_QUIRK_17SG) && |
1158 | (shost->sg_tablesize > 17)) { | 1166 | (shost->sg_tablesize > 17)) { |
1159 | shost->sg_tablesize = 17; | 1167 | shost->sg_tablesize = 17; |
1160 | shost->max_sectors = (shost->sg_tablesize * 8) + 112; | 1168 | shost->max_sectors = (shost->sg_tablesize * 8) + 112; |
1161 | } | 1169 | } |
1162 | 1170 | ||
1163 | error = pci_set_dma_max_seg_size(pdev, | 1171 | error = pci_set_dma_max_seg_size(pdev, |
1164 | (aac->adapter_info.options & AAC_OPT_NEW_COMM) ? | 1172 | (aac->adapter_info.options & AAC_OPT_NEW_COMM) ? |
@@ -1174,7 +1182,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
1174 | else | 1182 | else |
1175 | aac->printf_enabled = 0; | 1183 | aac->printf_enabled = 0; |
1176 | 1184 | ||
1177 | /* | 1185 | /* |
1178 | * max channel will be the physical channels plus 1 virtual channel | 1186 | * max channel will be the physical channels plus 1 virtual channel |
1179 | * all containers are on the virtual channel 0 (CONTAINER_CHANNEL) | 1187 | * all containers are on the virtual channel 0 (CONTAINER_CHANNEL) |
1180 | * physical channels are address by their actual physical number+1 | 1188 | * physical channels are address by their actual physical number+1 |