diff options
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/ide-cd.c | 64 |
1 files changed, 15 insertions, 49 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 50f78eb7dce9..9d2e458250ba 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -683,21 +683,25 @@ static void cdrom_buffer_sectors (ide_drive_t *drive, unsigned long sector, | |||
683 | * ok; nonzero if the request has been terminated. | 683 | * ok; nonzero if the request has been terminated. |
684 | */ | 684 | */ |
685 | static | 685 | static |
686 | int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason) | 686 | int ide_cd_check_ireason(ide_drive_t *drive, int len, int ireason, int rw) |
687 | { | 687 | { |
688 | if (ireason == 2) | 688 | /* |
689 | * ireason == 0: the drive wants to receive data from us | ||
690 | * ireason == 2: the drive is expecting to transfer data to us | ||
691 | */ | ||
692 | if (ireason == (!rw << 1)) | ||
689 | return 0; | 693 | return 0; |
690 | else if (ireason == 0) { | 694 | else if (ireason == (rw << 1)) { |
691 | ide_hwif_t *hwif = drive->hwif; | 695 | ide_hwif_t *hwif = drive->hwif; |
696 | xfer_func_t *xf; | ||
692 | 697 | ||
693 | /* Whoops... The drive is expecting to receive data from us! */ | 698 | /* Whoops... */ |
694 | printk(KERN_ERR "%s: %s: wrong transfer direction!\n", | 699 | printk(KERN_ERR "%s: %s: wrong transfer direction!\n", |
695 | drive->name, __FUNCTION__); | 700 | drive->name, __FUNCTION__); |
696 | 701 | ||
697 | /* Throw some data at the drive so it doesn't hang | 702 | xf = rw ? hwif->atapi_output_bytes : hwif->atapi_input_bytes; |
698 | and quit this request. */ | 703 | ide_cd_pad_transfer(drive, xf, len); |
699 | ide_cd_pad_transfer(drive, hwif->atapi_output_bytes, len); | 704 | } else if (rw == 0 && ireason == 1) { |
700 | } else if (ireason == 1) { | ||
701 | /* Some drives (ASUS) seem to tell us that status | 705 | /* Some drives (ASUS) seem to tell us that status |
702 | * info is available. just get it and ignore. | 706 | * info is available. just get it and ignore. |
703 | */ | 707 | */ |
@@ -985,35 +989,6 @@ int ide_cd_queue_pc(ide_drive_t *drive, struct request *rq) | |||
985 | } | 989 | } |
986 | 990 | ||
987 | /* | 991 | /* |
988 | * Write handling | ||
989 | */ | ||
990 | static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason) | ||
991 | { | ||
992 | /* Two notes about IDE interrupt reason here - 0 means that | ||
993 | * the drive wants to receive data from us, 2 means that | ||
994 | * the drive is expecting to transfer data to us. | ||
995 | */ | ||
996 | if (ireason == 0) | ||
997 | return 0; | ||
998 | else if (ireason == 2) { | ||
999 | ide_hwif_t *hwif = drive->hwif; | ||
1000 | |||
1001 | /* Whoops... The drive wants to send data. */ | ||
1002 | printk(KERN_ERR "%s: %s: wrong transfer direction!\n", | ||
1003 | drive->name, __FUNCTION__); | ||
1004 | |||
1005 | ide_cd_pad_transfer(drive, hwif->atapi_input_bytes, len); | ||
1006 | } else { | ||
1007 | /* Drive wants a command packet, or invalid ireason... */ | ||
1008 | printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n", | ||
1009 | drive->name, __FUNCTION__, ireason); | ||
1010 | } | ||
1011 | |||
1012 | cdrom_end_request(drive, 0); | ||
1013 | return 1; | ||
1014 | } | ||
1015 | |||
1016 | /* | ||
1017 | * Called from blk_end_request_callback() after the data of the request | 992 | * Called from blk_end_request_callback() after the data of the request |
1018 | * is completed and before the request is completed. | 993 | * is completed and before the request is completed. |
1019 | * By returning value '1', blk_end_request_callback() returns immediately | 994 | * By returning value '1', blk_end_request_callback() returns immediately |
@@ -1108,20 +1083,11 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
1108 | /* | 1083 | /* |
1109 | * check which way to transfer data | 1084 | * check which way to transfer data |
1110 | */ | 1085 | */ |
1111 | if ((blk_fs_request(rq) || blk_pc_request(rq)) && write) { | 1086 | if (blk_fs_request(rq) || blk_pc_request(rq)) { |
1112 | /* | 1087 | if (ide_cd_check_ireason(drive, len, ireason, write)) |
1113 | * write to drive | ||
1114 | */ | ||
1115 | if (cdrom_write_check_ireason(drive, len, ireason)) | ||
1116 | return ide_stopped; | ||
1117 | } else if (blk_fs_request(rq) || blk_pc_request(rq)) { | ||
1118 | /* | ||
1119 | * read from drive | ||
1120 | */ | ||
1121 | if (cdrom_read_check_ireason(drive, len, ireason)) | ||
1122 | return ide_stopped; | 1088 | return ide_stopped; |
1123 | 1089 | ||
1124 | if (blk_fs_request(rq)) { | 1090 | if (blk_fs_request(rq) && write == 0) { |
1125 | int nskip; | 1091 | int nskip; |
1126 | 1092 | ||
1127 | if (ide_cd_check_transfer_size(drive, len)) { | 1093 | if (ide_cd_check_transfer_size(drive, len)) { |