Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 9599
b: refs/heads/master
c: c187c4b
h: refs/heads/master
i:
  9597: ea88bd8
  9595: d4a1c78
  9591: b30c4bc
  9583: 4bc0faf
  9567: 8e3ddb8
  9535: f96761d
  9471: 4661b39
v: v3
  • Loading branch information
Albert Lee authored and Jeff Garzik committed Oct 4, 2005
1 parent 2e864ba commit 686c8d6
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 47a8659380d40d5c0786ddb62a89b3f7f1392430
refs/heads/master: c187c4b58a9caff660a4c8ae39d0def88cc449af
25 changes: 17 additions & 8 deletions trunk/drivers/scsi/libata-scsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,7 +589,8 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
head = track % dev->heads;
sect = (u32)block % dev->sectors + 1;

DPRINTK("block[%u] track[%u] cyl[%u] head[%u] sect[%u] \n", (u32)block, track, cyl, head, sect);
DPRINTK("block %u track %u cyl %u head %u sect %u\n",
(u32)block, track, cyl, head, sect);

/* Check whether the converted CHS can fit.
Cylinder: 0-65535
Expand Down Expand Up @@ -665,6 +666,10 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
block |= ((u64)scsicmd[3]);

n_block |= ((u32)scsicmd[4]);

/* for 6-byte r/w commands, transfer length 0
* means 256 blocks of data, not 0 block.
*/
if (!n_block)
n_block = 256;

Expand Down Expand Up @@ -692,7 +697,11 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)

/* Check and compose ATA command */
if (!n_block)
/* In ATA, sector count 0 means 256 or 65536 sectors, not 0 sectors. */
/* For 10-byte and 16-byte SCSI R/W commands, transfer
* length 0 means transfer 0 block of data.
* However, for ATA R/W commands, sector count 0 means
* 256 or 65536 sectors, not 0 sectors as in SCSI.
*/
return 1;

if (lba) {
Expand All @@ -715,7 +724,7 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)

tf->device |= (block >> 24) & 0xf;
}

qc->nsect = n_block;
tf->nsect = n_block & 0xff;

Expand All @@ -731,23 +740,23 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
/* The request -may- be too large for CHS addressing. */
if ((block >> 28) || (n_block > 256))
return 1;

/* Convert LBA to CHS */
track = (u32)block / dev->sectors;
cyl = track / dev->heads;
head = track % dev->heads;
sect = (u32)block % dev->sectors + 1;

DPRINTK("block[%u] track[%u] cyl[%u] head[%u] sect[%u] \n",
DPRINTK("block %u track %u cyl %u head %u sect %u\n",
(u32)block, track, cyl, head, sect);

/* Check whether the converted CHS can fit.
Cylinder: 0-65535
Head: 0-15
Sector: 1-255*/
if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect))
if ((cyl >> 16) || (head >> 4) || (sect >> 8) || (!sect))
return 1;

qc->nsect = n_block;
tf->nsect = n_block & 0xff; /* Sector count 0 means 256 sectors */
tf->lbal = sect;
Expand Down

0 comments on commit 686c8d6

Please sign in to comment.