Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 6043
b: refs/heads/master
c: 563a6e1
h: refs/heads/master
i:
  6041: ebc9331
  6039: 5107929
v: v3
  • Loading branch information
Albert Lee authored and Jeff Garzik committed Aug 12, 2005
1 parent d002a4e commit 2a3775e
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 4 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: 6ae4cfb5711b6f2878c9e384617971d98c34a7f5
refs/heads/master: 563a6e1fb0af58433beec1ab418e1fafbd100b56
28 changes: 25 additions & 3 deletions trunk/drivers/scsi/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2697,10 +2697,33 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
unsigned char *buf;
unsigned int offset, count;

if (qc->curbytes == qc->nbytes - bytes)
if (qc->curbytes + bytes >= qc->nbytes)
ap->pio_task_state = PIO_ST_LAST;

next_sg:
if (unlikely(qc->cursg >= qc->n_elem)) {
/*
* The end of qc->sg is reached and the device expects
* more data to transfer. In order not to overrun qc->sg
* and fulfill length specified in the byte count register,
* - for read case, discard trailing data from the device
* - for write case, padding zero data to the device
*/
u16 pad_buf[1] = { 0 };
unsigned int words = bytes >> 1;
unsigned int i;

if (words) /* warning if bytes > 1 */
printk(KERN_WARNING "ata%u: %u bytes trailing data\n",
ap->id, bytes);

for (i = 0; i < words; i++)
ata_data_xfer(ap, (unsigned char*)pad_buf, 2, do_write);

ap->pio_task_state = PIO_ST_LAST;
return;
}

sg = &qc->sg[qc->cursg];

page = sg->page;
Expand Down Expand Up @@ -2734,9 +2757,8 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)

kunmap(page);

if (bytes) {
if (bytes)
goto next_sg;
}
}

/**
Expand Down

0 comments on commit 2a3775e

Please sign in to comment.