diff options
-rw-r--r-- | drivers/ide/ide-floppy.c | 14 | ||||
-rw-r--r-- | drivers/ide/ide-lib.c | 21 | ||||
-rw-r--r-- | drivers/ide/ide-tape.c | 34 | ||||
-rw-r--r-- | drivers/scsi/ide-scsi.c | 9 | ||||
-rw-r--r-- | include/linux/ide.h | 44 |
5 files changed, 37 insertions, 85 deletions
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 53f90257a8f0..7b94c7aff256 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -788,12 +788,12 @@ static void idefloppy_retry_pc (ide_drive_t *drive) | |||
788 | static ide_startstop_t idefloppy_pc_intr (ide_drive_t *drive) | 788 | static ide_startstop_t idefloppy_pc_intr (ide_drive_t *drive) |
789 | { | 789 | { |
790 | idefloppy_floppy_t *floppy = drive->driver_data; | 790 | idefloppy_floppy_t *floppy = drive->driver_data; |
791 | atapi_status_t status; | ||
792 | atapi_bcount_t bcount; | 791 | atapi_bcount_t bcount; |
793 | atapi_ireason_t ireason; | 792 | atapi_ireason_t ireason; |
794 | idefloppy_pc_t *pc = floppy->pc; | 793 | idefloppy_pc_t *pc = floppy->pc; |
795 | struct request *rq = pc->rq; | 794 | struct request *rq = pc->rq; |
796 | unsigned int temp; | 795 | unsigned int temp; |
796 | u8 stat; | ||
797 | 797 | ||
798 | debug_log(KERN_INFO "ide-floppy: Reached %s interrupt handler\n", | 798 | debug_log(KERN_INFO "ide-floppy: Reached %s interrupt handler\n", |
799 | __FUNCTION__); | 799 | __FUNCTION__); |
@@ -809,16 +809,16 @@ static ide_startstop_t idefloppy_pc_intr (ide_drive_t *drive) | |||
809 | } | 809 | } |
810 | 810 | ||
811 | /* Clear the interrupt */ | 811 | /* Clear the interrupt */ |
812 | status.all = HWIF(drive)->INB(IDE_STATUS_REG); | 812 | stat = drive->hwif->INB(IDE_STATUS_REG); |
813 | 813 | ||
814 | if (!status.b.drq) { /* No more interrupts */ | 814 | if ((stat & DRQ_STAT) == 0) { /* No more interrupts */ |
815 | debug_log(KERN_INFO "Packet command completed, %d bytes " | 815 | debug_log(KERN_INFO "Packet command completed, %d bytes " |
816 | "transferred\n", pc->actually_transferred); | 816 | "transferred\n", pc->actually_transferred); |
817 | clear_bit(PC_DMA_IN_PROGRESS, &pc->flags); | 817 | clear_bit(PC_DMA_IN_PROGRESS, &pc->flags); |
818 | 818 | ||
819 | local_irq_enable_in_hardirq(); | 819 | local_irq_enable_in_hardirq(); |
820 | 820 | ||
821 | if (status.b.check || test_bit(PC_DMA_ERROR, &pc->flags)) { | 821 | if ((stat & ERR_STAT) || test_bit(PC_DMA_ERROR, &pc->flags)) { |
822 | /* Error detected */ | 822 | /* Error detected */ |
823 | debug_log(KERN_INFO "ide-floppy: %s: I/O error\n", | 823 | debug_log(KERN_INFO "ide-floppy: %s: I/O error\n", |
824 | drive->name); | 824 | drive->name); |
@@ -1632,14 +1632,14 @@ static int idefloppy_get_format_progress(ide_drive_t *drive, int __user *arg) | |||
1632 | /* Else assume format_unit has finished, and we're | 1632 | /* Else assume format_unit has finished, and we're |
1633 | ** at 0x10000 */ | 1633 | ** at 0x10000 */ |
1634 | } else { | 1634 | } else { |
1635 | atapi_status_t status; | ||
1636 | unsigned long flags; | 1635 | unsigned long flags; |
1636 | u8 stat; | ||
1637 | 1637 | ||
1638 | local_irq_save(flags); | 1638 | local_irq_save(flags); |
1639 | status.all = HWIF(drive)->INB(IDE_STATUS_REG); | 1639 | stat = drive->hwif->INB(IDE_STATUS_REG); |
1640 | local_irq_restore(flags); | 1640 | local_irq_restore(flags); |
1641 | 1641 | ||
1642 | progress_indication = !status.b.dsc ? 0 : 0x10000; | 1642 | progress_indication = ((stat & SEEK_STAT) == 0) ? 0 : 0x10000; |
1643 | } | 1643 | } |
1644 | if (put_user(progress_indication, arg)) | 1644 | if (put_user(progress_indication, arg)) |
1645 | return (-EFAULT); | 1645 | return (-EFAULT); |
diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c index 3bae2c46924f..dc7e539b4d0b 100644 --- a/drivers/ide/ide-lib.c +++ b/drivers/ide/ide-lib.c | |||
@@ -562,27 +562,24 @@ static u8 ide_dump_ata_status(ide_drive_t *drive, const char *msg, u8 stat) | |||
562 | static u8 ide_dump_atapi_status(ide_drive_t *drive, const char *msg, u8 stat) | 562 | static u8 ide_dump_atapi_status(ide_drive_t *drive, const char *msg, u8 stat) |
563 | { | 563 | { |
564 | unsigned long flags; | 564 | unsigned long flags; |
565 | |||
566 | atapi_status_t status; | ||
567 | atapi_error_t error; | 565 | atapi_error_t error; |
568 | 566 | ||
569 | status.all = stat; | ||
570 | error.all = 0; | 567 | error.all = 0; |
571 | local_irq_save(flags); | 568 | local_irq_save(flags); |
572 | printk("%s: %s: status=0x%02x { ", drive->name, msg, stat); | 569 | printk("%s: %s: status=0x%02x { ", drive->name, msg, stat); |
573 | if (status.b.bsy) | 570 | if (stat & BUSY_STAT) |
574 | printk("Busy "); | 571 | printk("Busy "); |
575 | else { | 572 | else { |
576 | if (status.b.drdy) printk("DriveReady "); | 573 | if (stat & READY_STAT) printk("DriveReady "); |
577 | if (status.b.df) printk("DeviceFault "); | 574 | if (stat & WRERR_STAT) printk("DeviceFault "); |
578 | if (status.b.dsc) printk("SeekComplete "); | 575 | if (stat & SEEK_STAT) printk("SeekComplete "); |
579 | if (status.b.drq) printk("DataRequest "); | 576 | if (stat & DRQ_STAT) printk("DataRequest "); |
580 | if (status.b.corr) printk("CorrectedError "); | 577 | if (stat & ECC_STAT) printk("CorrectedError "); |
581 | if (status.b.idx) printk("Index "); | 578 | if (stat & INDEX_STAT) printk("Index "); |
582 | if (status.b.check) printk("Error "); | 579 | if (stat & ERR_STAT) printk("Error "); |
583 | } | 580 | } |
584 | printk("}\n"); | 581 | printk("}\n"); |
585 | if (status.b.check && !status.b.bsy) { | 582 | if ((stat & (BUSY_STAT|ERR_STAT)) == ERR_STAT) { |
586 | error.all = HWIF(drive)->INB(IDE_ERROR_REG); | 583 | error.all = HWIF(drive)->INB(IDE_ERROR_REG); |
587 | printk("%s: %s: error=0x%02x { ", drive->name, msg, error.all); | 584 | printk("%s: %s: error=0x%02x { ", drive->name, msg, error.all); |
588 | if (error.b.ili) printk("IllegalLengthIndication "); | 585 | if (error.b.ili) printk("IllegalLengthIndication "); |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 90e902d233cf..c91039505436 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -1848,15 +1848,14 @@ static ide_startstop_t idetape_pc_intr (ide_drive_t *drive) | |||
1848 | { | 1848 | { |
1849 | ide_hwif_t *hwif = drive->hwif; | 1849 | ide_hwif_t *hwif = drive->hwif; |
1850 | idetape_tape_t *tape = drive->driver_data; | 1850 | idetape_tape_t *tape = drive->driver_data; |
1851 | atapi_status_t status; | ||
1852 | atapi_bcount_t bcount; | 1851 | atapi_bcount_t bcount; |
1853 | atapi_ireason_t ireason; | 1852 | atapi_ireason_t ireason; |
1854 | idetape_pc_t *pc = tape->pc; | 1853 | idetape_pc_t *pc = tape->pc; |
1855 | |||
1856 | unsigned int temp; | 1854 | unsigned int temp; |
1857 | #if SIMULATE_ERRORS | 1855 | #if SIMULATE_ERRORS |
1858 | static int error_sim_count = 0; | 1856 | static int error_sim_count = 0; |
1859 | #endif | 1857 | #endif |
1858 | u8 stat; | ||
1860 | 1859 | ||
1861 | #if IDETAPE_DEBUG_LOG | 1860 | #if IDETAPE_DEBUG_LOG |
1862 | if (tape->debug_level >= 4) | 1861 | if (tape->debug_level >= 4) |
@@ -1865,10 +1864,10 @@ static ide_startstop_t idetape_pc_intr (ide_drive_t *drive) | |||
1865 | #endif /* IDETAPE_DEBUG_LOG */ | 1864 | #endif /* IDETAPE_DEBUG_LOG */ |
1866 | 1865 | ||
1867 | /* Clear the interrupt */ | 1866 | /* Clear the interrupt */ |
1868 | status.all = HWIF(drive)->INB(IDE_STATUS_REG); | 1867 | stat = hwif->INB(IDE_STATUS_REG); |
1869 | 1868 | ||
1870 | if (test_bit(PC_DMA_IN_PROGRESS, &pc->flags)) { | 1869 | if (test_bit(PC_DMA_IN_PROGRESS, &pc->flags)) { |
1871 | if (HWIF(drive)->ide_dma_end(drive) || status.b.check) { | 1870 | if (hwif->ide_dma_end(drive) || (stat & ERR_STAT)) { |
1872 | /* | 1871 | /* |
1873 | * A DMA error is sometimes expected. For example, | 1872 | * A DMA error is sometimes expected. For example, |
1874 | * if the tape is crossing a filemark during a | 1873 | * if the tape is crossing a filemark during a |
@@ -1902,7 +1901,7 @@ static ide_startstop_t idetape_pc_intr (ide_drive_t *drive) | |||
1902 | } | 1901 | } |
1903 | 1902 | ||
1904 | /* No more interrupts */ | 1903 | /* No more interrupts */ |
1905 | if (!status.b.drq) { | 1904 | if ((stat & DRQ_STAT) == 0) { |
1906 | #if IDETAPE_DEBUG_LOG | 1905 | #if IDETAPE_DEBUG_LOG |
1907 | if (tape->debug_level >= 2) | 1906 | if (tape->debug_level >= 2) |
1908 | printk(KERN_INFO "ide-tape: Packet command completed, %d bytes transferred\n", pc->actually_transferred); | 1907 | printk(KERN_INFO "ide-tape: Packet command completed, %d bytes transferred\n", pc->actually_transferred); |
@@ -1917,12 +1916,13 @@ static ide_startstop_t idetape_pc_intr (ide_drive_t *drive) | |||
1917 | (++error_sim_count % 100) == 0) { | 1916 | (++error_sim_count % 100) == 0) { |
1918 | printk(KERN_INFO "ide-tape: %s: simulating error\n", | 1917 | printk(KERN_INFO "ide-tape: %s: simulating error\n", |
1919 | tape->name); | 1918 | tape->name); |
1920 | status.b.check = 1; | 1919 | stat |= ERR_STAT; |
1921 | } | 1920 | } |
1922 | #endif | 1921 | #endif |
1923 | if (status.b.check && pc->c[0] == IDETAPE_REQUEST_SENSE_CMD) | 1922 | if ((stat & ERR_STAT) && pc->c[0] == IDETAPE_REQUEST_SENSE_CMD) |
1924 | status.b.check = 0; | 1923 | stat &= ~ERR_STAT; |
1925 | if (status.b.check || test_bit(PC_DMA_ERROR, &pc->flags)) { /* Error detected */ | 1924 | if ((stat & ERR_STAT) || test_bit(PC_DMA_ERROR, &pc->flags)) { |
1925 | /* Error detected */ | ||
1926 | #if IDETAPE_DEBUG_LOG | 1926 | #if IDETAPE_DEBUG_LOG |
1927 | if (tape->debug_level >= 1) | 1927 | if (tape->debug_level >= 1) |
1928 | printk(KERN_INFO "ide-tape: %s: I/O error\n", | 1928 | printk(KERN_INFO "ide-tape: %s: I/O error\n", |
@@ -1941,7 +1941,7 @@ static ide_startstop_t idetape_pc_intr (ide_drive_t *drive) | |||
1941 | } | 1941 | } |
1942 | pc->error = 0; | 1942 | pc->error = 0; |
1943 | if (test_bit(PC_WAIT_FOR_DSC, &pc->flags) && | 1943 | if (test_bit(PC_WAIT_FOR_DSC, &pc->flags) && |
1944 | !status.b.dsc) { | 1944 | (stat & SEEK_STAT) == 0) { |
1945 | /* Media access command */ | 1945 | /* Media access command */ |
1946 | tape->dsc_polling_start = jiffies; | 1946 | tape->dsc_polling_start = jiffies; |
1947 | tape->dsc_polling_frequency = IDETAPE_DSC_MA_FAST; | 1947 | tape->dsc_polling_frequency = IDETAPE_DSC_MA_FAST; |
@@ -2285,11 +2285,11 @@ static ide_startstop_t idetape_media_access_finished (ide_drive_t *drive) | |||
2285 | { | 2285 | { |
2286 | idetape_tape_t *tape = drive->driver_data; | 2286 | idetape_tape_t *tape = drive->driver_data; |
2287 | idetape_pc_t *pc = tape->pc; | 2287 | idetape_pc_t *pc = tape->pc; |
2288 | atapi_status_t status; | 2288 | u8 stat; |
2289 | 2289 | ||
2290 | status.all = HWIF(drive)->INB(IDE_STATUS_REG); | 2290 | stat = drive->hwif->INB(IDE_STATUS_REG); |
2291 | if (status.b.dsc) { | 2291 | if (stat & SEEK_STAT) { |
2292 | if (status.b.check) { | 2292 | if (stat & ERR_STAT) { |
2293 | /* Error detected */ | 2293 | /* Error detected */ |
2294 | if (pc->c[0] != IDETAPE_TEST_UNIT_READY_CMD) | 2294 | if (pc->c[0] != IDETAPE_TEST_UNIT_READY_CMD) |
2295 | printk(KERN_ERR "ide-tape: %s: I/O error, ", | 2295 | printk(KERN_ERR "ide-tape: %s: I/O error, ", |
@@ -2407,7 +2407,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
2407 | idetape_tape_t *tape = drive->driver_data; | 2407 | idetape_tape_t *tape = drive->driver_data; |
2408 | idetape_pc_t *pc = NULL; | 2408 | idetape_pc_t *pc = NULL; |
2409 | struct request *postponed_rq = tape->postponed_rq; | 2409 | struct request *postponed_rq = tape->postponed_rq; |
2410 | atapi_status_t status; | 2410 | u8 stat; |
2411 | 2411 | ||
2412 | #if IDETAPE_DEBUG_LOG | 2412 | #if IDETAPE_DEBUG_LOG |
2413 | #if 0 | 2413 | #if 0 |
@@ -2455,7 +2455,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
2455 | * If the tape is still busy, postpone our request and service | 2455 | * If the tape is still busy, postpone our request and service |
2456 | * the other device meanwhile. | 2456 | * the other device meanwhile. |
2457 | */ | 2457 | */ |
2458 | status.all = HWIF(drive)->INB(IDE_STATUS_REG); | 2458 | stat = drive->hwif->INB(IDE_STATUS_REG); |
2459 | 2459 | ||
2460 | if (!drive->dsc_overlap && !(rq->cmd[0] & REQ_IDETAPE_PC2)) | 2460 | if (!drive->dsc_overlap && !(rq->cmd[0] & REQ_IDETAPE_PC2)) |
2461 | set_bit(IDETAPE_IGNORE_DSC, &tape->flags); | 2461 | set_bit(IDETAPE_IGNORE_DSC, &tape->flags); |
@@ -2471,7 +2471,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
2471 | tape->insert_speed = tape->insert_size / 1024 * HZ / (jiffies - tape->insert_time); | 2471 | tape->insert_speed = tape->insert_size / 1024 * HZ / (jiffies - tape->insert_time); |
2472 | calculate_speeds(drive); | 2472 | calculate_speeds(drive); |
2473 | if (!test_and_clear_bit(IDETAPE_IGNORE_DSC, &tape->flags) && | 2473 | if (!test_and_clear_bit(IDETAPE_IGNORE_DSC, &tape->flags) && |
2474 | !status.b.dsc) { | 2474 | (stat & SEEK_STAT) == 0) { |
2475 | if (postponed_rq == NULL) { | 2475 | if (postponed_rq == NULL) { |
2476 | tape->dsc_polling_start = jiffies; | 2476 | tape->dsc_polling_start = jiffies; |
2477 | tape->dsc_polling_frequency = tape->best_dsc_rw_frequency; | 2477 | tape->dsc_polling_frequency = tape->best_dsc_rw_frequency; |
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index 9706de9d98d5..bd2b56912472 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
@@ -398,11 +398,10 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) | |||
398 | idescsi_pc_t *pc=scsi->pc; | 398 | idescsi_pc_t *pc=scsi->pc; |
399 | struct request *rq = pc->rq; | 399 | struct request *rq = pc->rq; |
400 | atapi_bcount_t bcount; | 400 | atapi_bcount_t bcount; |
401 | atapi_status_t status; | ||
402 | atapi_ireason_t ireason; | 401 | atapi_ireason_t ireason; |
403 | atapi_feature_t feature; | 402 | atapi_feature_t feature; |
404 | |||
405 | unsigned int temp; | 403 | unsigned int temp; |
404 | u8 stat; | ||
406 | 405 | ||
407 | #if IDESCSI_DEBUG_LOG | 406 | #if IDESCSI_DEBUG_LOG |
408 | printk (KERN_INFO "ide-scsi: Reached idescsi_pc_intr interrupt handler\n"); | 407 | printk (KERN_INFO "ide-scsi: Reached idescsi_pc_intr interrupt handler\n"); |
@@ -427,14 +426,14 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) | |||
427 | 426 | ||
428 | feature.all = 0; | 427 | feature.all = 0; |
429 | /* Clear the interrupt */ | 428 | /* Clear the interrupt */ |
430 | status.all = HWIF(drive)->INB(IDE_STATUS_REG); | 429 | stat = drive->hwif->INB(IDE_STATUS_REG); |
431 | 430 | ||
432 | if (!status.b.drq) { | 431 | if ((stat & DRQ_STAT) == 0) { |
433 | /* No more interrupts */ | 432 | /* No more interrupts */ |
434 | if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) | 433 | if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) |
435 | printk (KERN_INFO "Packet command completed, %d bytes transferred\n", pc->actually_transferred); | 434 | printk (KERN_INFO "Packet command completed, %d bytes transferred\n", pc->actually_transferred); |
436 | local_irq_enable_in_hardirq(); | 435 | local_irq_enable_in_hardirq(); |
437 | if (status.b.check) | 436 | if (stat & ERR_STAT) |
438 | rq->errors++; | 437 | rq->errors++; |
439 | idescsi_end_request (drive, 1, 0); | 438 | idescsi_end_request (drive, 1, 0); |
440 | return ide_stopped; | 439 | return ide_stopped; |
diff --git a/include/linux/ide.h b/include/linux/ide.h index c6ffc2028fb5..921cf717f22a 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -366,50 +366,6 @@ typedef union { | |||
366 | } select_t, ata_select_t; | 366 | } select_t, ata_select_t; |
367 | 367 | ||
368 | /* | 368 | /* |
369 | * The ATA-IDE Status Register. | ||
370 | * The ATAPI Status Register. | ||
371 | * | ||
372 | * check : Error occurred | ||
373 | * idx : Index Error | ||
374 | * corr : Correctable error occurred | ||
375 | * drq : Data is request by the device | ||
376 | * dsc : Disk Seek Complete : ata | ||
377 | * : Media access command finished : atapi | ||
378 | * df : Device Fault : ata | ||
379 | * : Reserved : atapi | ||
380 | * drdy : Ready, Command Mode Capable : ata | ||
381 | * : Ignored for ATAPI commands : atapi | ||
382 | * bsy : Disk is Busy | ||
383 | * : The device has access to the command block | ||
384 | */ | ||
385 | typedef union { | ||
386 | unsigned all :8; | ||
387 | struct { | ||
388 | #if defined(__LITTLE_ENDIAN_BITFIELD) | ||
389 | unsigned check :1; | ||
390 | unsigned idx :1; | ||
391 | unsigned corr :1; | ||
392 | unsigned drq :1; | ||
393 | unsigned dsc :1; | ||
394 | unsigned df :1; | ||
395 | unsigned drdy :1; | ||
396 | unsigned bsy :1; | ||
397 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
398 | unsigned bsy :1; | ||
399 | unsigned drdy :1; | ||
400 | unsigned df :1; | ||
401 | unsigned dsc :1; | ||
402 | unsigned drq :1; | ||
403 | unsigned corr :1; | ||
404 | unsigned idx :1; | ||
405 | unsigned check :1; | ||
406 | #else | ||
407 | #error "Please fix <asm/byteorder.h>" | ||
408 | #endif | ||
409 | } b; | ||
410 | } ata_status_t, atapi_status_t; | ||
411 | |||
412 | /* | ||
413 | * ATAPI Feature Register | 369 | * ATAPI Feature Register |
414 | * | 370 | * |
415 | * dma : Using DMA or PIO | 371 | * dma : Using DMA or PIO |