Skip to content

Commit b836439

Browse files
Mahesh RajashekharaJames Bottomley
authored andcommitted
aacraid: 4KB sector support
Also fix up a name truncation problem Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com> Signed-off-by: James Bottomley <JBottomley@Odin.com>
1 parent 2f5d1f7 commit b836439

File tree

2 files changed

+200
-51
lines changed

2 files changed

+200
-51
lines changed

drivers/scsi/aacraid/aachba.c

Lines changed: 190 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,41 @@
111111
#define BYTE2(x) (unsigned char)((x) >> 16)
112112
#define BYTE3(x) (unsigned char)((x) >> 24)
113113

114+
/* MODE_SENSE data format */
115+
typedef struct {
116+
struct {
117+
u8 data_length;
118+
u8 med_type;
119+
u8 dev_par;
120+
u8 bd_length;
121+
} __attribute__((packed)) hd;
122+
struct {
123+
u8 dens_code;
124+
u8 block_count[3];
125+
u8 reserved;
126+
u8 block_length[3];
127+
} __attribute__((packed)) bd;
128+
u8 mpc_buf[3];
129+
} __attribute__((packed)) aac_modep_data;
130+
131+
/* MODE_SENSE_10 data format */
132+
typedef struct {
133+
struct {
134+
u8 data_length[2];
135+
u8 med_type;
136+
u8 dev_par;
137+
u8 rsrvd[2];
138+
u8 bd_length[2];
139+
} __attribute__((packed)) hd;
140+
struct {
141+
u8 dens_code;
142+
u8 block_count[3];
143+
u8 reserved;
144+
u8 block_length[3];
145+
} __attribute__((packed)) bd;
146+
u8 mpc_buf[3];
147+
} __attribute__((packed)) aac_modep10_data;
148+
114149
/*------------------------------------------------------------------------------
115150
* S T R U C T S / T Y P E D E F S
116151
*----------------------------------------------------------------------------*/
@@ -438,7 +473,7 @@ static void get_container_name_callback(void *context, struct fib * fibptr)
438473
if ((le32_to_cpu(get_name_reply->status) == CT_OK)
439474
&& (get_name_reply->data[0] != '\0')) {
440475
char *sp = get_name_reply->data;
441-
sp[sizeof(((struct aac_get_name_resp *)NULL)->data)-1] = '\0';
476+
sp[sizeof(((struct aac_get_name_resp *)NULL)->data)] = '\0';
442477
while (*sp == ' ')
443478
++sp;
444479
if (*sp) {
@@ -539,6 +574,14 @@ static void _aac_probe_container2(void * context, struct fib * fibptr)
539574
if ((le32_to_cpu(dresp->status) == ST_OK) &&
540575
(le32_to_cpu(dresp->mnt[0].vol) != CT_NONE) &&
541576
(le32_to_cpu(dresp->mnt[0].state) != FSCS_HIDDEN)) {
577+
if (!(fibptr->dev->supplement_adapter_info.SupportedOptions2 &
578+
AAC_OPTION_VARIABLE_BLOCK_SIZE)) {
579+
dresp->mnt[0].fileinfo.bdevinfo.block_size = 0x200;
580+
fsa_dev_ptr->block_size = 0x200;
581+
} else {
582+
fsa_dev_ptr->block_size =
583+
le32_to_cpu(dresp->mnt[0].fileinfo.bdevinfo.block_size);
584+
}
542585
fsa_dev_ptr->valid = 1;
543586
/* sense_key holds the current state of the spin-up */
544587
if (dresp->mnt[0].state & cpu_to_le32(FSCS_NOT_READY))
@@ -571,7 +614,9 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
571614
int status;
572615

573616
dresp = (struct aac_mount *) fib_data(fibptr);
574-
dresp->mnt[0].capacityhigh = 0;
617+
if (!(fibptr->dev->supplement_adapter_info.SupportedOptions2 &
618+
AAC_OPTION_VARIABLE_BLOCK_SIZE))
619+
dresp->mnt[0].capacityhigh = 0;
575620
if ((le32_to_cpu(dresp->status) != ST_OK) ||
576621
(le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) {
577622
_aac_probe_container2(context, fibptr);
@@ -586,7 +631,12 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
586631

587632
dinfo = (struct aac_query_mount *)fib_data(fibptr);
588633

589-
dinfo->command = cpu_to_le32(VM_NameServe64);
634+
if (fibptr->dev->supplement_adapter_info.SupportedOptions2 &
635+
AAC_OPTION_VARIABLE_BLOCK_SIZE)
636+
dinfo->command = cpu_to_le32(VM_NameServeAllBlk);
637+
else
638+
dinfo->command = cpu_to_le32(VM_NameServe64);
639+
590640
dinfo->count = cpu_to_le32(scmd_id(scsicmd));
591641
dinfo->type = cpu_to_le32(FT_FILESYS);
592642

@@ -621,7 +671,12 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
621671

622672
dinfo = (struct aac_query_mount *)fib_data(fibptr);
623673

624-
dinfo->command = cpu_to_le32(VM_NameServe);
674+
if (fibptr->dev->supplement_adapter_info.SupportedOptions2 &
675+
AAC_OPTION_VARIABLE_BLOCK_SIZE)
676+
dinfo->command = cpu_to_le32(VM_NameServeAllBlk);
677+
else
678+
dinfo->command = cpu_to_le32(VM_NameServe);
679+
625680
dinfo->count = cpu_to_le32(scmd_id(scsicmd));
626681
dinfo->type = cpu_to_le32(FT_FILESYS);
627682
scsicmd->SCp.ptr = (char *)callback;
@@ -982,7 +1037,8 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
9821037
memset(readcmd2, 0, sizeof(struct aac_raw_io2));
9831038
readcmd2->blockLow = cpu_to_le32((u32)(lba&0xffffffff));
9841039
readcmd2->blockHigh = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
985-
readcmd2->byteCount = cpu_to_le32(count<<9);
1040+
readcmd2->byteCount = cpu_to_le32(count *
1041+
dev->fsa_dev[scmd_id(cmd)].block_size);
9861042
readcmd2->cid = cpu_to_le16(scmd_id(cmd));
9871043
readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
9881044
ret = aac_build_sgraw2(cmd, readcmd2,
@@ -997,7 +1053,8 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
9971053
readcmd = (struct aac_raw_io *) fib_data(fib);
9981054
readcmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
9991055
readcmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
1000-
readcmd->count = cpu_to_le32(count<<9);
1056+
readcmd->count = cpu_to_le32(count *
1057+
dev->fsa_dev[scmd_id(cmd)].block_size);
10011058
readcmd->cid = cpu_to_le16(scmd_id(cmd));
10021059
readcmd->flags = cpu_to_le16(RIO_TYPE_READ);
10031060
readcmd->bpTotal = 0;
@@ -1062,14 +1119,16 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
10621119
{
10631120
u16 fibsize;
10641121
struct aac_read *readcmd;
1122+
struct aac_dev *dev = fib->dev;
10651123
long ret;
10661124

10671125
aac_fib_init(fib);
10681126
readcmd = (struct aac_read *) fib_data(fib);
10691127
readcmd->command = cpu_to_le32(VM_CtBlockRead);
10701128
readcmd->cid = cpu_to_le32(scmd_id(cmd));
10711129
readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
1072-
readcmd->count = cpu_to_le32(count * 512);
1130+
readcmd->count = cpu_to_le32(count *
1131+
dev->fsa_dev[scmd_id(cmd)].block_size);
10731132

10741133
ret = aac_build_sg(cmd, &readcmd->sg);
10751134
if (ret < 0)
@@ -1104,7 +1163,8 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
11041163
memset(writecmd2, 0, sizeof(struct aac_raw_io2));
11051164
writecmd2->blockLow = cpu_to_le32((u32)(lba&0xffffffff));
11061165
writecmd2->blockHigh = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
1107-
writecmd2->byteCount = cpu_to_le32(count<<9);
1166+
writecmd2->byteCount = cpu_to_le32(count *
1167+
dev->fsa_dev[scmd_id(cmd)].block_size);
11081168
writecmd2->cid = cpu_to_le16(scmd_id(cmd));
11091169
writecmd2->flags = (fua && ((aac_cache & 5) != 1) &&
11101170
(((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
@@ -1122,7 +1182,8 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
11221182
writecmd = (struct aac_raw_io *) fib_data(fib);
11231183
writecmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
11241184
writecmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
1125-
writecmd->count = cpu_to_le32(count<<9);
1185+
writecmd->count = cpu_to_le32(count *
1186+
dev->fsa_dev[scmd_id(cmd)].block_size);
11261187
writecmd->cid = cpu_to_le16(scmd_id(cmd));
11271188
writecmd->flags = (fua && ((aac_cache & 5) != 1) &&
11281189
(((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
@@ -1190,14 +1251,16 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
11901251
{
11911252
u16 fibsize;
11921253
struct aac_write *writecmd;
1254+
struct aac_dev *dev = fib->dev;
11931255
long ret;
11941256

11951257
aac_fib_init(fib);
11961258
writecmd = (struct aac_write *) fib_data(fib);
11971259
writecmd->command = cpu_to_le32(VM_CtBlockWrite);
11981260
writecmd->cid = cpu_to_le32(scmd_id(cmd));
11991261
writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
1200-
writecmd->count = cpu_to_le32(count * 512);
1262+
writecmd->count = cpu_to_le32(count *
1263+
dev->fsa_dev[scmd_id(cmd)].block_size);
12011264
writecmd->sg.count = cpu_to_le32(1);
12021265
/* ->stable is not used - it did mean which type of write */
12031266

@@ -2329,10 +2392,10 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
23292392
cp[5] = (capacity >> 16) & 0xff;
23302393
cp[6] = (capacity >> 8) & 0xff;
23312394
cp[7] = (capacity >> 0) & 0xff;
2332-
cp[8] = 0;
2333-
cp[9] = 0;
2334-
cp[10] = 2;
2335-
cp[11] = 0;
2395+
cp[8] = (fsa_dev_ptr[cid].block_size >> 24) & 0xff;
2396+
cp[9] = (fsa_dev_ptr[cid].block_size >> 16) & 0xff;
2397+
cp[10] = (fsa_dev_ptr[cid].block_size >> 8) & 0xff;
2398+
cp[11] = (fsa_dev_ptr[cid].block_size) & 0xff;
23362399
cp[12] = 0;
23372400

23382401
alloc_len = ((scsicmd->cmnd[10] << 24)
@@ -2369,10 +2432,10 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
23692432
cp[1] = (capacity >> 16) & 0xff;
23702433
cp[2] = (capacity >> 8) & 0xff;
23712434
cp[3] = (capacity >> 0) & 0xff;
2372-
cp[4] = 0;
2373-
cp[5] = 0;
2374-
cp[6] = 2;
2375-
cp[7] = 0;
2435+
cp[4] = (fsa_dev_ptr[cid].block_size >> 24) & 0xff;
2436+
cp[5] = (fsa_dev_ptr[cid].block_size >> 16) & 0xff;
2437+
cp[6] = (fsa_dev_ptr[cid].block_size >> 8) & 0xff;
2438+
cp[7] = (fsa_dev_ptr[cid].block_size) & 0xff;
23762439
scsi_sg_copy_from_buffer(scsicmd, cp, sizeof(cp));
23772440
/* Do not cache partition table for arrays */
23782441
scsicmd->device->removable = 1;
@@ -2385,65 +2448,142 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
23852448

23862449
case MODE_SENSE:
23872450
{
2388-
char mode_buf[7];
23892451
int mode_buf_length = 4;
2452+
u32 capacity;
2453+
aac_modep_data mpd;
2454+
2455+
if (fsa_dev_ptr[cid].size <= 0x100000000ULL)
2456+
capacity = fsa_dev_ptr[cid].size - 1;
2457+
else
2458+
capacity = (u32)-1;
23902459

23912460
dprintk((KERN_DEBUG "MODE SENSE command.\n"));
2392-
mode_buf[0] = 3; /* Mode data length */
2393-
mode_buf[1] = 0; /* Medium type - default */
2394-
mode_buf[2] = 0; /* Device-specific param,
2395-
bit 8: 0/1 = write enabled/protected
2396-
bit 4: 0/1 = FUA enabled */
2461+
memset((char *)&mpd, 0, sizeof(aac_modep_data));
2462+
2463+
/* Mode data length */
2464+
mpd.hd.data_length = sizeof(mpd.hd) - 1;
2465+
/* Medium type - default */
2466+
mpd.hd.med_type = 0;
2467+
/* Device-specific param,
2468+
bit 8: 0/1 = write enabled/protected
2469+
bit 4: 0/1 = FUA enabled */
2470+
mpd.hd.dev_par = 0;
2471+
23972472
if (dev->raw_io_interface && ((aac_cache & 5) != 1))
2398-
mode_buf[2] = 0x10;
2399-
mode_buf[3] = 0; /* Block descriptor length */
2473+
mpd.hd.dev_par = 0x10;
2474+
if (scsicmd->cmnd[1] & 0x8)
2475+
mpd.hd.bd_length = 0; /* Block descriptor length */
2476+
else {
2477+
mpd.hd.bd_length = sizeof(mpd.bd);
2478+
mpd.hd.data_length += mpd.hd.bd_length;
2479+
mpd.bd.block_length[0] =
2480+
(fsa_dev_ptr[cid].block_size >> 16) & 0xff;
2481+
mpd.bd.block_length[1] =
2482+
(fsa_dev_ptr[cid].block_size >> 8) & 0xff;
2483+
mpd.bd.block_length[2] =
2484+
fsa_dev_ptr[cid].block_size & 0xff;
2485+
if (capacity > 0xffffff) {
2486+
mpd.bd.block_count[0] = 0xff;
2487+
mpd.bd.block_count[1] = 0xff;
2488+
mpd.bd.block_count[2] = 0xff;
2489+
} else {
2490+
mpd.bd.block_count[0] = (capacity >> 16) & 0xff;
2491+
mpd.bd.block_count[1] = (capacity >> 8) & 0xff;
2492+
mpd.bd.block_count[2] = capacity & 0xff;
2493+
}
2494+
}
24002495
if (((scsicmd->cmnd[2] & 0x3f) == 8) ||
24012496
((scsicmd->cmnd[2] & 0x3f) == 0x3f)) {
2402-
mode_buf[0] = 6;
2403-
mode_buf[4] = 8;
2404-
mode_buf[5] = 1;
2405-
mode_buf[6] = ((aac_cache & 6) == 2)
2497+
mpd.hd.data_length += 3;
2498+
mpd.mpc_buf[0] = 8;
2499+
mpd.mpc_buf[1] = 1;
2500+
mpd.mpc_buf[2] = ((aac_cache & 6) == 2)
24062501
? 0 : 0x04; /* WCE */
2407-
mode_buf_length = 7;
2502+
mode_buf_length = sizeof(mpd);
24082503
if (mode_buf_length > scsicmd->cmnd[4])
24092504
mode_buf_length = scsicmd->cmnd[4];
24102505
}
2411-
scsi_sg_copy_from_buffer(scsicmd, mode_buf, mode_buf_length);
2506+
scsi_sg_copy_from_buffer(scsicmd,
2507+
(char *)&mpd,
2508+
mode_buf_length);
24122509
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
24132510
scsicmd->scsi_done(scsicmd);
24142511

24152512
return 0;
24162513
}
24172514
case MODE_SENSE_10:
24182515
{
2419-
char mode_buf[11];
2516+
u32 capacity;
24202517
int mode_buf_length = 8;
2518+
aac_modep10_data mpd10;
2519+
2520+
if (fsa_dev_ptr[cid].size <= 0x100000000ULL)
2521+
capacity = fsa_dev_ptr[cid].size - 1;
2522+
else
2523+
capacity = (u32)-1;
24212524

24222525
dprintk((KERN_DEBUG "MODE SENSE 10 byte command.\n"));
2423-
mode_buf[0] = 0; /* Mode data length (MSB) */
2424-
mode_buf[1] = 6; /* Mode data length (LSB) */
2425-
mode_buf[2] = 0; /* Medium type - default */
2426-
mode_buf[3] = 0; /* Device-specific param,
2427-
bit 8: 0/1 = write enabled/protected
2428-
bit 4: 0/1 = FUA enabled */
2526+
memset((char *)&mpd10, 0, sizeof(aac_modep10_data));
2527+
/* Mode data length (MSB) */
2528+
mpd10.hd.data_length[0] = 0;
2529+
/* Mode data length (LSB) */
2530+
mpd10.hd.data_length[1] = sizeof(mpd10.hd) - 1;
2531+
/* Medium type - default */
2532+
mpd10.hd.med_type = 0;
2533+
/* Device-specific param,
2534+
bit 8: 0/1 = write enabled/protected
2535+
bit 4: 0/1 = FUA enabled */
2536+
mpd10.hd.dev_par = 0;
2537+
24292538
if (dev->raw_io_interface && ((aac_cache & 5) != 1))
2430-
mode_buf[3] = 0x10;
2431-
mode_buf[4] = 0; /* reserved */
2432-
mode_buf[5] = 0; /* reserved */
2433-
mode_buf[6] = 0; /* Block descriptor length (MSB) */
2434-
mode_buf[7] = 0; /* Block descriptor length (LSB) */
2539+
mpd10.hd.dev_par = 0x10;
2540+
mpd10.hd.rsrvd[0] = 0; /* reserved */
2541+
mpd10.hd.rsrvd[1] = 0; /* reserved */
2542+
if (scsicmd->cmnd[1] & 0x8) {
2543+
/* Block descriptor length (MSB) */
2544+
mpd10.hd.bd_length[0] = 0;
2545+
/* Block descriptor length (LSB) */
2546+
mpd10.hd.bd_length[1] = 0;
2547+
} else {
2548+
mpd10.hd.bd_length[0] = 0;
2549+
mpd10.hd.bd_length[1] = sizeof(mpd10.bd);
2550+
2551+
mpd10.hd.data_length[1] += mpd10.hd.bd_length[1];
2552+
2553+
mpd10.bd.block_length[0] =
2554+
(fsa_dev_ptr[cid].block_size >> 16) & 0xff;
2555+
mpd10.bd.block_length[1] =
2556+
(fsa_dev_ptr[cid].block_size >> 8) & 0xff;
2557+
mpd10.bd.block_length[2] =
2558+
fsa_dev_ptr[cid].block_size & 0xff;
2559+
2560+
if (capacity > 0xffffff) {
2561+
mpd10.bd.block_count[0] = 0xff;
2562+
mpd10.bd.block_count[1] = 0xff;
2563+
mpd10.bd.block_count[2] = 0xff;
2564+
} else {
2565+
mpd10.bd.block_count[0] =
2566+
(capacity >> 16) & 0xff;
2567+
mpd10.bd.block_count[1] =
2568+
(capacity >> 8) & 0xff;
2569+
mpd10.bd.block_count[2] =
2570+
capacity & 0xff;
2571+
}
2572+
}
24352573
if (((scsicmd->cmnd[2] & 0x3f) == 8) ||
24362574
((scsicmd->cmnd[2] & 0x3f) == 0x3f)) {
2437-
mode_buf[1] = 9;
2438-
mode_buf[8] = 8;
2439-
mode_buf[9] = 1;
2440-
mode_buf[10] = ((aac_cache & 6) == 2)
2575+
mpd10.hd.data_length[1] += 3;
2576+
mpd10.mpc_buf[0] = 8;
2577+
mpd10.mpc_buf[1] = 1;
2578+
mpd10.mpc_buf[2] = ((aac_cache & 6) == 2)
24412579
? 0 : 0x04; /* WCE */
2442-
mode_buf_length = 11;
2580+
mode_buf_length = sizeof(mpd10);
24432581
if (mode_buf_length > scsicmd->cmnd[8])
24442582
mode_buf_length = scsicmd->cmnd[8];
24452583
}
2446-
scsi_sg_copy_from_buffer(scsicmd, mode_buf, mode_buf_length);
2584+
scsi_sg_copy_from_buffer(scsicmd,
2585+
(char *)&mpd10,
2586+
mode_buf_length);
24472587

24482588
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
24492589
scsicmd->scsi_done(scsicmd);

0 commit comments

Comments
 (0)