diff options
Diffstat (limited to 'drivers/scsi/aacraid')
-rw-r--r-- | drivers/scsi/aacraid/aachba.c | 62 | ||||
-rw-r--r-- | drivers/scsi/aacraid/aacraid.h | 9 | ||||
-rw-r--r-- | drivers/scsi/aacraid/linit.c | 4 |
3 files changed, 55 insertions, 20 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 1e82c69b36b0..a333e62fc487 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
@@ -822,7 +822,7 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3 | |||
822 | readcmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); | 822 | readcmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); |
823 | readcmd->count = cpu_to_le32(count<<9); | 823 | readcmd->count = cpu_to_le32(count<<9); |
824 | readcmd->cid = cpu_to_le16(scmd_id(cmd)); | 824 | readcmd->cid = cpu_to_le16(scmd_id(cmd)); |
825 | readcmd->flags = cpu_to_le16(1); | 825 | readcmd->flags = cpu_to_le16(IO_TYPE_READ); |
826 | readcmd->bpTotal = 0; | 826 | readcmd->bpTotal = 0; |
827 | readcmd->bpComplete = 0; | 827 | readcmd->bpComplete = 0; |
828 | 828 | ||
@@ -901,7 +901,7 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 | |||
901 | (void *) cmd); | 901 | (void *) cmd); |
902 | } | 902 | } |
903 | 903 | ||
904 | static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count) | 904 | static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua) |
905 | { | 905 | { |
906 | u16 fibsize; | 906 | u16 fibsize; |
907 | struct aac_raw_io *writecmd; | 907 | struct aac_raw_io *writecmd; |
@@ -911,7 +911,9 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u | |||
911 | writecmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); | 911 | writecmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); |
912 | writecmd->count = cpu_to_le32(count<<9); | 912 | writecmd->count = cpu_to_le32(count<<9); |
913 | writecmd->cid = cpu_to_le16(scmd_id(cmd)); | 913 | writecmd->cid = cpu_to_le16(scmd_id(cmd)); |
914 | writecmd->flags = 0; | 914 | writecmd->flags = fua ? |
915 | cpu_to_le16(IO_TYPE_WRITE|IO_SUREWRITE) : | ||
916 | cpu_to_le16(IO_TYPE_WRITE); | ||
915 | writecmd->bpTotal = 0; | 917 | writecmd->bpTotal = 0; |
916 | writecmd->bpComplete = 0; | 918 | writecmd->bpComplete = 0; |
917 | 919 | ||
@@ -930,7 +932,7 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u | |||
930 | (void *) cmd); | 932 | (void *) cmd); |
931 | } | 933 | } |
932 | 934 | ||
933 | static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count) | 935 | static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua) |
934 | { | 936 | { |
935 | u16 fibsize; | 937 | u16 fibsize; |
936 | struct aac_write64 *writecmd; | 938 | struct aac_write64 *writecmd; |
@@ -961,7 +963,7 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, | |||
961 | (void *) cmd); | 963 | (void *) cmd); |
962 | } | 964 | } |
963 | 965 | ||
964 | static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count) | 966 | static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua) |
965 | { | 967 | { |
966 | u16 fibsize; | 968 | u16 fibsize; |
967 | struct aac_write *writecmd; | 969 | struct aac_write *writecmd; |
@@ -1495,6 +1497,7 @@ static int aac_write(struct scsi_cmnd * scsicmd) | |||
1495 | { | 1497 | { |
1496 | u64 lba; | 1498 | u64 lba; |
1497 | u32 count; | 1499 | u32 count; |
1500 | int fua; | ||
1498 | int status; | 1501 | int status; |
1499 | struct aac_dev *dev; | 1502 | struct aac_dev *dev; |
1500 | struct fib * cmd_fibcontext; | 1503 | struct fib * cmd_fibcontext; |
@@ -1509,6 +1512,7 @@ static int aac_write(struct scsi_cmnd * scsicmd) | |||
1509 | count = scsicmd->cmnd[4]; | 1512 | count = scsicmd->cmnd[4]; |
1510 | if (count == 0) | 1513 | if (count == 0) |
1511 | count = 256; | 1514 | count = 256; |
1515 | fua = 0; | ||
1512 | } else if (scsicmd->cmnd[0] == WRITE_16) { /* 16 byte command */ | 1516 | } else if (scsicmd->cmnd[0] == WRITE_16) { /* 16 byte command */ |
1513 | dprintk((KERN_DEBUG "aachba: received a write(16) command on id %d.\n", scmd_id(scsicmd))); | 1517 | dprintk((KERN_DEBUG "aachba: received a write(16) command on id %d.\n", scmd_id(scsicmd))); |
1514 | 1518 | ||
@@ -1521,6 +1525,7 @@ static int aac_write(struct scsi_cmnd * scsicmd) | |||
1521 | (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; | 1525 | (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; |
1522 | count = (scsicmd->cmnd[10] << 24) | (scsicmd->cmnd[11] << 16) | | 1526 | count = (scsicmd->cmnd[10] << 24) | (scsicmd->cmnd[11] << 16) | |
1523 | (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13]; | 1527 | (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13]; |
1528 | fua = scsicmd->cmnd[1] & 0x8; | ||
1524 | } else if (scsicmd->cmnd[0] == WRITE_12) { /* 12 byte command */ | 1529 | } else if (scsicmd->cmnd[0] == WRITE_12) { /* 12 byte command */ |
1525 | dprintk((KERN_DEBUG "aachba: received a write(12) command on id %d.\n", scmd_id(scsicmd))); | 1530 | dprintk((KERN_DEBUG "aachba: received a write(12) command on id %d.\n", scmd_id(scsicmd))); |
1526 | 1531 | ||
@@ -1528,10 +1533,12 @@ static int aac_write(struct scsi_cmnd * scsicmd) | |||
1528 | | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; | 1533 | | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; |
1529 | count = (scsicmd->cmnd[6] << 24) | (scsicmd->cmnd[7] << 16) | 1534 | count = (scsicmd->cmnd[6] << 24) | (scsicmd->cmnd[7] << 16) |
1530 | | (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; | 1535 | | (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; |
1536 | fua = scsicmd->cmnd[1] & 0x8; | ||
1531 | } else { | 1537 | } else { |
1532 | dprintk((KERN_DEBUG "aachba: received a write(10) command on id %d.\n", scmd_id(scsicmd))); | 1538 | dprintk((KERN_DEBUG "aachba: received a write(10) command on id %d.\n", scmd_id(scsicmd))); |
1533 | lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; | 1539 | lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; |
1534 | count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8]; | 1540 | count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8]; |
1541 | fua = scsicmd->cmnd[1] & 0x8; | ||
1535 | } | 1542 | } |
1536 | dprintk((KERN_DEBUG "aac_write[cpu %d]: lba = %llu, t = %ld.\n", | 1543 | dprintk((KERN_DEBUG "aac_write[cpu %d]: lba = %llu, t = %ld.\n", |
1537 | smp_processor_id(), (unsigned long long)lba, jiffies)); | 1544 | smp_processor_id(), (unsigned long long)lba, jiffies)); |
@@ -1546,7 +1553,7 @@ static int aac_write(struct scsi_cmnd * scsicmd) | |||
1546 | return 0; | 1553 | return 0; |
1547 | } | 1554 | } |
1548 | 1555 | ||
1549 | status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count); | 1556 | status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua); |
1550 | 1557 | ||
1551 | /* | 1558 | /* |
1552 | * Check that the command queued to the controller | 1559 | * Check that the command queued to the controller |
@@ -1883,15 +1890,29 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) | |||
1883 | 1890 | ||
1884 | case MODE_SENSE: | 1891 | case MODE_SENSE: |
1885 | { | 1892 | { |
1886 | char mode_buf[4]; | 1893 | char mode_buf[7]; |
1894 | int mode_buf_length = 4; | ||
1887 | 1895 | ||
1888 | dprintk((KERN_DEBUG "MODE SENSE command.\n")); | 1896 | dprintk((KERN_DEBUG "MODE SENSE command.\n")); |
1889 | mode_buf[0] = 3; /* Mode data length */ | 1897 | mode_buf[0] = 3; /* Mode data length */ |
1890 | mode_buf[1] = 0; /* Medium type - default */ | 1898 | mode_buf[1] = 0; /* Medium type - default */ |
1891 | mode_buf[2] = 0; /* Device-specific param, bit 8: 0/1 = write enabled/protected */ | 1899 | mode_buf[2] = 0; /* Device-specific param, |
1900 | bit 8: 0/1 = write enabled/protected | ||
1901 | bit 4: 0/1 = FUA enabled */ | ||
1902 | if (dev->raw_io_interface) | ||
1903 | mode_buf[2] = 0x10; | ||
1892 | mode_buf[3] = 0; /* Block descriptor length */ | 1904 | mode_buf[3] = 0; /* Block descriptor length */ |
1893 | 1905 | if (((scsicmd->cmnd[2] & 0x3f) == 8) || | |
1894 | aac_internal_transfer(scsicmd, mode_buf, 0, sizeof(mode_buf)); | 1906 | ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) { |
1907 | mode_buf[0] = 6; | ||
1908 | mode_buf[4] = 8; | ||
1909 | mode_buf[5] = 1; | ||
1910 | mode_buf[6] = 0x04; /* WCE */ | ||
1911 | mode_buf_length = 7; | ||
1912 | if (mode_buf_length > scsicmd->cmnd[4]) | ||
1913 | mode_buf_length = scsicmd->cmnd[4]; | ||
1914 | } | ||
1915 | aac_internal_transfer(scsicmd, mode_buf, 0, mode_buf_length); | ||
1895 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; | 1916 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; |
1896 | scsicmd->scsi_done(scsicmd); | 1917 | scsicmd->scsi_done(scsicmd); |
1897 | 1918 | ||
@@ -1899,18 +1920,33 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) | |||
1899 | } | 1920 | } |
1900 | case MODE_SENSE_10: | 1921 | case MODE_SENSE_10: |
1901 | { | 1922 | { |
1902 | char mode_buf[8]; | 1923 | char mode_buf[11]; |
1924 | int mode_buf_length = 8; | ||
1903 | 1925 | ||
1904 | dprintk((KERN_DEBUG "MODE SENSE 10 byte command.\n")); | 1926 | dprintk((KERN_DEBUG "MODE SENSE 10 byte command.\n")); |
1905 | mode_buf[0] = 0; /* Mode data length (MSB) */ | 1927 | mode_buf[0] = 0; /* Mode data length (MSB) */ |
1906 | mode_buf[1] = 6; /* Mode data length (LSB) */ | 1928 | mode_buf[1] = 6; /* Mode data length (LSB) */ |
1907 | mode_buf[2] = 0; /* Medium type - default */ | 1929 | mode_buf[2] = 0; /* Medium type - default */ |
1908 | mode_buf[3] = 0; /* Device-specific param, bit 8: 0/1 = write enabled/protected */ | 1930 | mode_buf[3] = 0; /* Device-specific param, |
1931 | bit 8: 0/1 = write enabled/protected | ||
1932 | bit 4: 0/1 = FUA enabled */ | ||
1933 | if (dev->raw_io_interface) | ||
1934 | mode_buf[3] = 0x10; | ||
1909 | mode_buf[4] = 0; /* reserved */ | 1935 | mode_buf[4] = 0; /* reserved */ |
1910 | mode_buf[5] = 0; /* reserved */ | 1936 | mode_buf[5] = 0; /* reserved */ |
1911 | mode_buf[6] = 0; /* Block descriptor length (MSB) */ | 1937 | mode_buf[6] = 0; /* Block descriptor length (MSB) */ |
1912 | mode_buf[7] = 0; /* Block descriptor length (LSB) */ | 1938 | mode_buf[7] = 0; /* Block descriptor length (LSB) */ |
1913 | aac_internal_transfer(scsicmd, mode_buf, 0, sizeof(mode_buf)); | 1939 | if (((scsicmd->cmnd[2] & 0x3f) == 8) || |
1940 | ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) { | ||
1941 | mode_buf[1] = 9; | ||
1942 | mode_buf[8] = 8; | ||
1943 | mode_buf[9] = 1; | ||
1944 | mode_buf[10] = 0x04; /* WCE */ | ||
1945 | mode_buf_length = 11; | ||
1946 | if (mode_buf_length > scsicmd->cmnd[8]) | ||
1947 | mode_buf_length = scsicmd->cmnd[8]; | ||
1948 | } | ||
1949 | aac_internal_transfer(scsicmd, mode_buf, 0, mode_buf_length); | ||
1914 | 1950 | ||
1915 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; | 1951 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; |
1916 | scsicmd->scsi_done(scsicmd); | 1952 | scsicmd->scsi_done(scsicmd); |
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 45ca3e801619..c45725e9224f 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h | |||
@@ -469,7 +469,7 @@ struct adapter_ops | |||
469 | int (*adapter_deliver)(struct fib * fib); | 469 | int (*adapter_deliver)(struct fib * fib); |
470 | int (*adapter_bounds)(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba); | 470 | int (*adapter_bounds)(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba); |
471 | int (*adapter_read)(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count); | 471 | int (*adapter_read)(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count); |
472 | int (*adapter_write)(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count); | 472 | int (*adapter_write)(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua); |
473 | int (*adapter_scsi)(struct fib * fib, struct scsi_cmnd * cmd); | 473 | int (*adapter_scsi)(struct fib * fib, struct scsi_cmnd * cmd); |
474 | /* Administrative operations */ | 474 | /* Administrative operations */ |
475 | int (*adapter_comm)(struct aac_dev * dev, int comm); | 475 | int (*adapter_comm)(struct aac_dev * dev, int comm); |
@@ -1054,8 +1054,8 @@ struct aac_dev | |||
1054 | #define aac_adapter_read(fib,cmd,lba,count) \ | 1054 | #define aac_adapter_read(fib,cmd,lba,count) \ |
1055 | ((fib)->dev)->a_ops.adapter_read(fib,cmd,lba,count) | 1055 | ((fib)->dev)->a_ops.adapter_read(fib,cmd,lba,count) |
1056 | 1056 | ||
1057 | #define aac_adapter_write(fib,cmd,lba,count) \ | 1057 | #define aac_adapter_write(fib,cmd,lba,count,fua) \ |
1058 | ((fib)->dev)->a_ops.adapter_write(fib,cmd,lba,count) | 1058 | ((fib)->dev)->a_ops.adapter_write(fib,cmd,lba,count,fua) |
1059 | 1059 | ||
1060 | #define aac_adapter_scsi(fib,cmd) \ | 1060 | #define aac_adapter_scsi(fib,cmd) \ |
1061 | ((fib)->dev)->a_ops.adapter_scsi(fib,cmd) | 1061 | ((fib)->dev)->a_ops.adapter_scsi(fib,cmd) |
@@ -1213,6 +1213,9 @@ struct aac_write64 | |||
1213 | __le32 block; | 1213 | __le32 block; |
1214 | __le16 pad; | 1214 | __le16 pad; |
1215 | __le16 flags; | 1215 | __le16 flags; |
1216 | #define IO_TYPE_WRITE 0x00000000 | ||
1217 | #define IO_TYPE_READ 0x00000001 | ||
1218 | #define IO_SUREWRITE 0x00000008 | ||
1216 | struct sgmap64 sg; // Must be last in struct because it is variable | 1219 | struct sgmap64 sg; // Must be last in struct because it is variable |
1217 | }; | 1220 | }; |
1218 | struct aac_write_reply | 1221 | struct aac_write_reply |
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 350ea7feb61d..a270a3f00647 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c | |||
@@ -403,10 +403,6 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev, | |||
403 | 403 | ||
404 | static int aac_slave_configure(struct scsi_device *sdev) | 404 | static int aac_slave_configure(struct scsi_device *sdev) |
405 | { | 405 | { |
406 | if (sdev_channel(sdev) == CONTAINER_CHANNEL) { | ||
407 | sdev->skip_ms_page_8 = 1; | ||
408 | sdev->skip_ms_page_3f = 1; | ||
409 | } | ||
410 | if ((sdev->type == TYPE_DISK) && | 406 | if ((sdev->type == TYPE_DISK) && |
411 | (sdev_channel(sdev) != CONTAINER_CHANNEL)) { | 407 | (sdev_channel(sdev) != CONTAINER_CHANNEL)) { |
412 | if (expose_physicals == 0) | 408 | if (expose_physicals == 0) |