aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-taskfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-taskfile.c')
-rw-r--r--drivers/ide/ide-taskfile.c33
1 files changed, 16 insertions, 17 deletions
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
index d3bd93afbf2b..249a707f88a4 100644
--- a/drivers/ide/ide-taskfile.c
+++ b/drivers/ide/ide-taskfile.c
@@ -209,7 +209,7 @@ static void ide_pio_sector(ide_drive_t *drive, struct ide_cmd *cmd,
209{ 209{
210 ide_hwif_t *hwif = drive->hwif; 210 ide_hwif_t *hwif = drive->hwif;
211 struct scatterlist *sg = hwif->sg_table; 211 struct scatterlist *sg = hwif->sg_table;
212 struct scatterlist *cursg = hwif->cursg; 212 struct scatterlist *cursg = cmd->cursg;
213 struct page *page; 213 struct page *page;
214#ifdef CONFIG_HIGHMEM 214#ifdef CONFIG_HIGHMEM
215 unsigned long flags; 215 unsigned long flags;
@@ -217,14 +217,14 @@ static void ide_pio_sector(ide_drive_t *drive, struct ide_cmd *cmd,
217 unsigned int offset; 217 unsigned int offset;
218 u8 *buf; 218 u8 *buf;
219 219
220 cursg = hwif->cursg; 220 cursg = cmd->cursg;
221 if (!cursg) { 221 if (!cursg) {
222 cursg = sg; 222 cursg = sg;
223 hwif->cursg = sg; 223 cmd->cursg = sg;
224 } 224 }
225 225
226 page = sg_page(cursg); 226 page = sg_page(cursg);
227 offset = cursg->offset + hwif->cursg_ofs * SECTOR_SIZE; 227 offset = cursg->offset + cmd->cursg_ofs * SECTOR_SIZE;
228 228
229 /* get the current page and offset */ 229 /* get the current page and offset */
230 page = nth_page(page, (offset >> PAGE_SHIFT)); 230 page = nth_page(page, (offset >> PAGE_SHIFT));
@@ -235,12 +235,12 @@ static void ide_pio_sector(ide_drive_t *drive, struct ide_cmd *cmd,
235#endif 235#endif
236 buf = kmap_atomic(page, KM_BIO_SRC_IRQ) + offset; 236 buf = kmap_atomic(page, KM_BIO_SRC_IRQ) + offset;
237 237
238 hwif->nleft--; 238 cmd->nleft--;
239 hwif->cursg_ofs++; 239 cmd->cursg_ofs++;
240 240
241 if ((hwif->cursg_ofs * SECTOR_SIZE) == cursg->length) { 241 if ((cmd->cursg_ofs * SECTOR_SIZE) == cursg->length) {
242 hwif->cursg = sg_next(hwif->cursg); 242 cmd->cursg = sg_next(cmd->cursg);
243 hwif->cursg_ofs = 0; 243 cmd->cursg_ofs = 0;
244 } 244 }
245 245
246 /* do the actual data transfer */ 246 /* do the actual data transfer */
@@ -260,7 +260,7 @@ static void ide_pio_multi(ide_drive_t *drive, struct ide_cmd *cmd,
260{ 260{
261 unsigned int nsect; 261 unsigned int nsect;
262 262
263 nsect = min_t(unsigned int, drive->hwif->nleft, drive->mult_count); 263 nsect = min_t(unsigned int, cmd->nleft, drive->mult_count);
264 while (nsect--) 264 while (nsect--)
265 ide_pio_sector(drive, cmd, write); 265 ide_pio_sector(drive, cmd, write);
266} 266}
@@ -295,19 +295,18 @@ static ide_startstop_t task_error(ide_drive_t *drive, struct ide_cmd *cmd,
295 const char *s, u8 stat) 295 const char *s, u8 stat)
296{ 296{
297 if (cmd->tf_flags & IDE_TFLAG_FS) { 297 if (cmd->tf_flags & IDE_TFLAG_FS) {
298 ide_hwif_t *hwif = drive->hwif; 298 int sectors = cmd->nsect - cmd->nleft;
299 int sectors = hwif->nsect - hwif->nleft;
300 299
301 switch (cmd->data_phase) { 300 switch (cmd->data_phase) {
302 case TASKFILE_IN: 301 case TASKFILE_IN:
303 if (hwif->nleft) 302 if (cmd->nleft)
304 break; 303 break;
305 /* fall through */ 304 /* fall through */
306 case TASKFILE_OUT: 305 case TASKFILE_OUT:
307 sectors--; 306 sectors--;
308 break; 307 break;
309 case TASKFILE_MULTI_IN: 308 case TASKFILE_MULTI_IN:
310 if (hwif->nleft) 309 if (cmd->nleft)
311 break; 310 break;
312 /* fall through */ 311 /* fall through */
313 case TASKFILE_MULTI_OUT: 312 case TASKFILE_MULTI_OUT:
@@ -375,7 +374,7 @@ static ide_startstop_t task_in_intr(ide_drive_t *drive)
375 ide_pio_datablock(drive, cmd, 0); 374 ide_pio_datablock(drive, cmd, 0);
376 375
377 /* Are we done? Check status and finish transfer. */ 376 /* Are we done? Check status and finish transfer. */
378 if (!hwif->nleft) { 377 if (cmd->nleft == 0) {
379 stat = wait_drive_not_busy(drive); 378 stat = wait_drive_not_busy(drive);
380 if (!OK_STAT(stat, 0, BAD_STAT)) 379 if (!OK_STAT(stat, 0, BAD_STAT))
381 return task_error(drive, cmd, __func__, stat); 380 return task_error(drive, cmd, __func__, stat);
@@ -402,10 +401,10 @@ static ide_startstop_t task_out_intr (ide_drive_t *drive)
402 return task_error(drive, cmd, __func__, stat); 401 return task_error(drive, cmd, __func__, stat);
403 402
404 /* Deal with unexpected ATA data phase. */ 403 /* Deal with unexpected ATA data phase. */
405 if (((stat & ATA_DRQ) == 0) ^ !hwif->nleft) 404 if (((stat & ATA_DRQ) == 0) ^ (cmd->nleft == 0))
406 return task_error(drive, cmd, __func__, stat); 405 return task_error(drive, cmd, __func__, stat);
407 406
408 if (!hwif->nleft) { 407 if (cmd->nleft == 0) {
409 ide_finish_cmd(drive, cmd, stat); 408 ide_finish_cmd(drive, cmd, stat);
410 return ide_stopped; 409 return ide_stopped;
411 } 410 }