diff options
author | Borislav Petkov <petkovbb@googlemail.com> | 2008-10-13 15:39:48 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-10-13 15:39:48 -0400 |
commit | fc8323f793852ca1fcb58d96512fd71d39af2e9b (patch) | |
tree | e7fa81758e7f5c416a5261201b34531f76bebdfa | |
parent | 2dbe7e919eb696c86790797f8a814bef19a0d50a (diff) |
ide-cd: convert driver to new ide debugging macro (v3)
Also,
- leave in the possibility for optimizing away all debugging macros
- add a PFX macro and prepend all printk calls with it for consistency
- add debug macro calls in important driver paths
- remove #if 0-ed code
- mv restore_request -> ide_cd_restore_request
- add a driver registration printk
v2:
failed_command can be NULL so check it before accessing it
v3:
fix another NULL ptr in debug statement
There should be no functionality change resulting from this patch.
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-rw-r--r-- | drivers/ide/ide-cd.c | 187 |
1 files changed, 150 insertions, 37 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 880d6d042fc8..52e4bbdfd4a8 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -23,6 +23,9 @@ | |||
23 | * Documentation/ide/ChangeLog.ide-cd.1994-2004 | 23 | * Documentation/ide/ChangeLog.ide-cd.1994-2004 |
24 | */ | 24 | */ |
25 | 25 | ||
26 | #define DRV_NAME "ide-cd" | ||
27 | #define PFX DRV_NAME ": " | ||
28 | |||
26 | #define IDECD_VERSION "5.00" | 29 | #define IDECD_VERSION "5.00" |
27 | 30 | ||
28 | #include <linux/module.h> | 31 | #include <linux/module.h> |
@@ -50,6 +53,14 @@ | |||
50 | 53 | ||
51 | #include "ide-cd.h" | 54 | #include "ide-cd.h" |
52 | 55 | ||
56 | #define IDECD_DEBUG_LOG 1 | ||
57 | |||
58 | #if IDECD_DEBUG_LOG | ||
59 | #define ide_debug_log(lvl, fmt, args...) __ide_debug_log(lvl, fmt, args) | ||
60 | #else | ||
61 | #define ide_debug_log(lvl, fmt, args...) do {} while (0) | ||
62 | #endif | ||
63 | |||
53 | static DEFINE_MUTEX(idecd_ref_mutex); | 64 | static DEFINE_MUTEX(idecd_ref_mutex); |
54 | 65 | ||
55 | static void ide_cd_release(struct kref *); | 66 | static void ide_cd_release(struct kref *); |
@@ -97,6 +108,9 @@ static int cdrom_log_sense(ide_drive_t *drive, struct request *rq, | |||
97 | { | 108 | { |
98 | int log = 0; | 109 | int log = 0; |
99 | 110 | ||
111 | ide_debug_log(IDE_DBG_SENSE, "Call %s, sense_key: 0x%x\n", __func__, | ||
112 | sense->sense_key); | ||
113 | |||
100 | if (!sense || !rq || (rq->cmd_flags & REQ_QUIET)) | 114 | if (!sense || !rq || (rq->cmd_flags & REQ_QUIET)) |
101 | return 0; | 115 | return 0; |
102 | 116 | ||
@@ -145,6 +159,14 @@ static void cdrom_analyze_sense_data(ide_drive_t *drive, | |||
145 | unsigned long bio_sectors; | 159 | unsigned long bio_sectors; |
146 | struct cdrom_info *info = drive->driver_data; | 160 | struct cdrom_info *info = drive->driver_data; |
147 | 161 | ||
162 | ide_debug_log(IDE_DBG_SENSE, "Call %s, error_code: 0x%x, " | ||
163 | "sense_key: 0x%x\n", __func__, sense->error_code, | ||
164 | sense->sense_key); | ||
165 | |||
166 | if (failed_command) | ||
167 | ide_debug_log(IDE_DBG_SENSE, "%s: failed cmd: 0x%x\n", | ||
168 | __func__, failed_command->cmd[0]); | ||
169 | |||
148 | if (!cdrom_log_sense(drive, failed_command, sense)) | 170 | if (!cdrom_log_sense(drive, failed_command, sense)) |
149 | return; | 171 | return; |
150 | 172 | ||
@@ -195,6 +217,8 @@ static void cdrom_queue_request_sense(ide_drive_t *drive, void *sense, | |||
195 | struct cdrom_info *info = drive->driver_data; | 217 | struct cdrom_info *info = drive->driver_data; |
196 | struct request *rq = &info->request_sense_request; | 218 | struct request *rq = &info->request_sense_request; |
197 | 219 | ||
220 | ide_debug_log(IDE_DBG_SENSE, "Call %s\n", __func__); | ||
221 | |||
198 | if (sense == NULL) | 222 | if (sense == NULL) |
199 | sense = &info->sense_data; | 223 | sense = &info->sense_data; |
200 | 224 | ||
@@ -214,6 +238,10 @@ static void cdrom_queue_request_sense(ide_drive_t *drive, void *sense, | |||
214 | /* NOTE! Save the failed command in "rq->buffer" */ | 238 | /* NOTE! Save the failed command in "rq->buffer" */ |
215 | rq->buffer = (void *) failed_command; | 239 | rq->buffer = (void *) failed_command; |
216 | 240 | ||
241 | if (failed_command) | ||
242 | ide_debug_log(IDE_DBG_SENSE, "failed_cmd: 0x%x\n", | ||
243 | failed_command->cmd[0]); | ||
244 | |||
217 | ide_do_drive_cmd(drive, rq); | 245 | ide_do_drive_cmd(drive, rq); |
218 | } | 246 | } |
219 | 247 | ||
@@ -222,6 +250,10 @@ static void cdrom_end_request(ide_drive_t *drive, int uptodate) | |||
222 | struct request *rq = HWGROUP(drive)->rq; | 250 | struct request *rq = HWGROUP(drive)->rq; |
223 | int nsectors = rq->hard_cur_sectors; | 251 | int nsectors = rq->hard_cur_sectors; |
224 | 252 | ||
253 | ide_debug_log(IDE_DBG_FUNC, "Call %s, cmd: 0x%x, uptodate: 0x%x, " | ||
254 | "nsectors: %d\n", __func__, rq->cmd[0], uptodate, | ||
255 | nsectors); | ||
256 | |||
225 | if (blk_sense_request(rq) && uptodate) { | 257 | if (blk_sense_request(rq) && uptodate) { |
226 | /* | 258 | /* |
227 | * For REQ_TYPE_SENSE, "rq->buffer" points to the original | 259 | * For REQ_TYPE_SENSE, "rq->buffer" points to the original |
@@ -264,6 +296,9 @@ static void cdrom_end_request(ide_drive_t *drive, int uptodate) | |||
264 | if (!nsectors) | 296 | if (!nsectors) |
265 | nsectors = 1; | 297 | nsectors = 1; |
266 | 298 | ||
299 | ide_debug_log(IDE_DBG_FUNC, "Exit %s, uptodate: 0x%x, nsectors: %d\n", | ||
300 | __func__, uptodate, nsectors); | ||
301 | |||
267 | ide_end_request(drive, uptodate, nsectors); | 302 | ide_end_request(drive, uptodate, nsectors); |
268 | } | 303 | } |
269 | 304 | ||
@@ -299,11 +334,15 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) | |||
299 | sense_key = err >> 4; | 334 | sense_key = err >> 4; |
300 | 335 | ||
301 | if (rq == NULL) { | 336 | if (rq == NULL) { |
302 | printk(KERN_ERR "%s: missing rq in %s\n", | 337 | printk(KERN_ERR PFX "%s: missing rq in %s\n", |
303 | drive->name, __func__); | 338 | drive->name, __func__); |
304 | return 1; | 339 | return 1; |
305 | } | 340 | } |
306 | 341 | ||
342 | ide_debug_log(IDE_DBG_RQ, "%s: stat: 0x%x, good_stat: 0x%x, " | ||
343 | "rq->cmd_type: 0x%x, err: 0x%x\n", __func__, stat, | ||
344 | good_stat, rq->cmd_type, err); | ||
345 | |||
307 | if (blk_sense_request(rq)) { | 346 | if (blk_sense_request(rq)) { |
308 | /* | 347 | /* |
309 | * We got an error trying to get sense info from the drive | 348 | * We got an error trying to get sense info from the drive |
@@ -369,7 +408,8 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) | |||
369 | cdrom_saw_media_change(drive); | 408 | cdrom_saw_media_change(drive); |
370 | 409 | ||
371 | /* fail the request */ | 410 | /* fail the request */ |
372 | printk(KERN_ERR "%s: tray open\n", drive->name); | 411 | printk(KERN_ERR PFX "%s: tray open\n", |
412 | drive->name); | ||
373 | do_end_request = 1; | 413 | do_end_request = 1; |
374 | } else { | 414 | } else { |
375 | struct cdrom_info *info = drive->driver_data; | 415 | struct cdrom_info *info = drive->driver_data; |
@@ -455,7 +495,7 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) | |||
455 | if (stat & ATA_ERR) | 495 | if (stat & ATA_ERR) |
456 | cdrom_queue_request_sense(drive, NULL, NULL); | 496 | cdrom_queue_request_sense(drive, NULL, NULL); |
457 | } else { | 497 | } else { |
458 | blk_dump_rq_flags(rq, "ide-cd: bad rq"); | 498 | blk_dump_rq_flags(rq, PFX "bad rq"); |
459 | cdrom_end_request(drive, 0); | 499 | cdrom_end_request(drive, 0); |
460 | } | 500 | } |
461 | 501 | ||
@@ -483,6 +523,9 @@ static int cdrom_timer_expiry(ide_drive_t *drive) | |||
483 | struct request *rq = HWGROUP(drive)->rq; | 523 | struct request *rq = HWGROUP(drive)->rq; |
484 | unsigned long wait = 0; | 524 | unsigned long wait = 0; |
485 | 525 | ||
526 | ide_debug_log(IDE_DBG_RQ, "Call %s: rq->cmd[0]: 0x%x\n", __func__, | ||
527 | rq->cmd[0]); | ||
528 | |||
486 | /* | 529 | /* |
487 | * Some commands are *slow* and normally take a long time to complete. | 530 | * Some commands are *slow* and normally take a long time to complete. |
488 | * Usually we can use the ATAPI "disconnect" to bypass this, but not all | 531 | * Usually we can use the ATAPI "disconnect" to bypass this, but not all |
@@ -499,7 +542,7 @@ static int cdrom_timer_expiry(ide_drive_t *drive) | |||
499 | break; | 542 | break; |
500 | default: | 543 | default: |
501 | if (!(rq->cmd_flags & REQ_QUIET)) | 544 | if (!(rq->cmd_flags & REQ_QUIET)) |
502 | printk(KERN_INFO "ide-cd: cmd 0x%x timed out\n", | 545 | printk(KERN_INFO PFX "cmd 0x%x timed out\n", |
503 | rq->cmd[0]); | 546 | rq->cmd[0]); |
504 | wait = 0; | 547 | wait = 0; |
505 | break; | 548 | break; |
@@ -522,6 +565,8 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive, | |||
522 | struct cdrom_info *info = drive->driver_data; | 565 | struct cdrom_info *info = drive->driver_data; |
523 | ide_hwif_t *hwif = drive->hwif; | 566 | ide_hwif_t *hwif = drive->hwif; |
524 | 567 | ||
568 | ide_debug_log(IDE_DBG_PC, "Call %s, xferlen: %d\n", __func__, xferlen); | ||
569 | |||
525 | /* FIXME: for Virtual DMA we must check harder */ | 570 | /* FIXME: for Virtual DMA we must check harder */ |
526 | if (info->dma) | 571 | if (info->dma) |
527 | info->dma = !hwif->dma_ops->dma_setup(drive); | 572 | info->dma = !hwif->dma_ops->dma_setup(drive); |
@@ -562,6 +607,8 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive, | |||
562 | struct cdrom_info *info = drive->driver_data; | 607 | struct cdrom_info *info = drive->driver_data; |
563 | ide_startstop_t startstop; | 608 | ide_startstop_t startstop; |
564 | 609 | ||
610 | ide_debug_log(IDE_DBG_PC, "Call %s\n", __func__); | ||
611 | |||
565 | if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) { | 612 | if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) { |
566 | /* | 613 | /* |
567 | * Here we should have been called after receiving an interrupt | 614 | * Here we should have been called after receiving an interrupt |
@@ -610,6 +657,9 @@ static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq, | |||
610 | { | 657 | { |
611 | ide_hwif_t *hwif = drive->hwif; | 658 | ide_hwif_t *hwif = drive->hwif; |
612 | 659 | ||
660 | ide_debug_log(IDE_DBG_FUNC, "Call %s, ireason: 0x%x, rw: 0x%x\n", | ||
661 | __func__, ireason, rw); | ||
662 | |||
613 | /* | 663 | /* |
614 | * ireason == 0: the drive wants to receive data from us | 664 | * ireason == 0: the drive wants to receive data from us |
615 | * ireason == 2: the drive is expecting to transfer data to us | 665 | * ireason == 2: the drive is expecting to transfer data to us |
@@ -619,7 +669,7 @@ static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq, | |||
619 | else if (ireason == (rw << 1)) { | 669 | else if (ireason == (rw << 1)) { |
620 | 670 | ||
621 | /* whoops... */ | 671 | /* whoops... */ |
622 | printk(KERN_ERR "%s: %s: wrong transfer direction!\n", | 672 | printk(KERN_ERR PFX "%s: %s: wrong transfer direction!\n", |
623 | drive->name, __func__); | 673 | drive->name, __func__); |
624 | 674 | ||
625 | ide_pad_transfer(drive, rw, len); | 675 | ide_pad_transfer(drive, rw, len); |
@@ -632,7 +682,7 @@ static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq, | |||
632 | return 0; | 682 | return 0; |
633 | } else { | 683 | } else { |
634 | /* drive wants a command packet, or invalid ireason... */ | 684 | /* drive wants a command packet, or invalid ireason... */ |
635 | printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n", | 685 | printk(KERN_ERR PFX "%s: %s: bad interrupt reason 0x%02x\n", |
636 | drive->name, __func__, ireason); | 686 | drive->name, __func__, ireason); |
637 | } | 687 | } |
638 | 688 | ||
@@ -649,17 +699,19 @@ static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq, | |||
649 | */ | 699 | */ |
650 | static int ide_cd_check_transfer_size(ide_drive_t *drive, int len) | 700 | static int ide_cd_check_transfer_size(ide_drive_t *drive, int len) |
651 | { | 701 | { |
702 | ide_debug_log(IDE_DBG_FUNC, "Call %s, len: %d\n", __func__, len); | ||
703 | |||
652 | if ((len % SECTOR_SIZE) == 0) | 704 | if ((len % SECTOR_SIZE) == 0) |
653 | return 0; | 705 | return 0; |
654 | 706 | ||
655 | printk(KERN_ERR "%s: %s: Bad transfer size %d\n", | 707 | printk(KERN_ERR PFX "%s: %s: Bad transfer size %d\n", drive->name, |
656 | drive->name, __func__, len); | 708 | __func__, len); |
657 | 709 | ||
658 | if (drive->atapi_flags & IDE_AFLAG_LIMIT_NFRAMES) | 710 | if (drive->atapi_flags & IDE_AFLAG_LIMIT_NFRAMES) |
659 | printk(KERN_ERR " This drive is not supported by " | 711 | printk(KERN_ERR PFX "This drive is not supported by this " |
660 | "this version of the driver\n"); | 712 | "version of the driver\n"); |
661 | else { | 713 | else { |
662 | printk(KERN_ERR " Trying to limit transfer sizes\n"); | 714 | printk(KERN_ERR PFX "Trying to limit transfer sizes\n"); |
663 | drive->atapi_flags |= IDE_AFLAG_LIMIT_NFRAMES; | 715 | drive->atapi_flags |= IDE_AFLAG_LIMIT_NFRAMES; |
664 | } | 716 | } |
665 | 717 | ||
@@ -671,6 +723,9 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *); | |||
671 | static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive, | 723 | static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive, |
672 | struct request *rq) | 724 | struct request *rq) |
673 | { | 725 | { |
726 | ide_debug_log(IDE_DBG_RQ, "Call %s: rq->cmd_flags: 0x%x\n", __func__, | ||
727 | rq->cmd_flags); | ||
728 | |||
674 | if (rq_data_dir(rq) == READ) { | 729 | if (rq_data_dir(rq) == READ) { |
675 | unsigned short sectors_per_frame = | 730 | unsigned short sectors_per_frame = |
676 | queue_hardsect_size(drive->queue) >> SECTOR_BITS; | 731 | queue_hardsect_size(drive->queue) >> SECTOR_BITS; |
@@ -690,7 +745,7 @@ static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive, | |||
690 | /* sanity check... */ | 745 | /* sanity check... */ |
691 | if (rq->current_nr_sectors != | 746 | if (rq->current_nr_sectors != |
692 | bio_cur_sectors(rq->bio)) { | 747 | bio_cur_sectors(rq->bio)) { |
693 | printk(KERN_ERR "%s: %s: buffer botch (%u)\n", | 748 | printk(KERN_ERR PFX "%s: %s: buffer botch (%u)\n", |
694 | drive->name, __func__, | 749 | drive->name, __func__, |
695 | rq->current_nr_sectors); | 750 | rq->current_nr_sectors); |
696 | cdrom_end_request(drive, 0); | 751 | cdrom_end_request(drive, 0); |
@@ -699,11 +754,7 @@ static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive, | |||
699 | rq->current_nr_sectors += nskip; | 754 | rq->current_nr_sectors += nskip; |
700 | } | 755 | } |
701 | } | 756 | } |
702 | #if 0 | 757 | |
703 | else | ||
704 | /* the immediate bit */ | ||
705 | rq->cmd[1] = 1 << 3; | ||
706 | #endif | ||
707 | /* set up the command */ | 758 | /* set up the command */ |
708 | rq->timeout = ATAPI_WAIT_PC; | 759 | rq->timeout = ATAPI_WAIT_PC; |
709 | 760 | ||
@@ -734,6 +785,8 @@ static ide_startstop_t cdrom_seek_intr(ide_drive_t *drive) | |||
734 | int stat; | 785 | int stat; |
735 | static int retry = 10; | 786 | static int retry = 10; |
736 | 787 | ||
788 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
789 | |||
737 | if (cdrom_decode_status(drive, 0, &stat)) | 790 | if (cdrom_decode_status(drive, 0, &stat)) |
738 | return ide_stopped; | 791 | return ide_stopped; |
739 | 792 | ||
@@ -750,6 +803,8 @@ static void ide_cd_prepare_seek_request(ide_drive_t *drive, struct request *rq) | |||
750 | { | 803 | { |
751 | sector_t frame = rq->sector; | 804 | sector_t frame = rq->sector; |
752 | 805 | ||
806 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
807 | |||
753 | sector_div(frame, queue_hardsect_size(drive->queue) >> SECTOR_BITS); | 808 | sector_div(frame, queue_hardsect_size(drive->queue) >> SECTOR_BITS); |
754 | 809 | ||
755 | memset(rq->cmd, 0, BLK_MAX_CDB); | 810 | memset(rq->cmd, 0, BLK_MAX_CDB); |
@@ -770,8 +825,11 @@ static ide_startstop_t cdrom_start_seek_continuation(ide_drive_t *drive) | |||
770 | * Fix up a possibly partially-processed request so that we can start it over | 825 | * Fix up a possibly partially-processed request so that we can start it over |
771 | * entirely, or even put it back on the request queue. | 826 | * entirely, or even put it back on the request queue. |
772 | */ | 827 | */ |
773 | static void restore_request(struct request *rq) | 828 | static void ide_cd_restore_request(ide_drive_t *drive, struct request *rq) |
774 | { | 829 | { |
830 | |||
831 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
832 | |||
775 | if (rq->buffer != bio_data(rq->bio)) { | 833 | if (rq->buffer != bio_data(rq->bio)) { |
776 | sector_t n = | 834 | sector_t n = |
777 | (rq->buffer - (char *)bio_data(rq->bio)) / SECTOR_SIZE; | 835 | (rq->buffer - (char *)bio_data(rq->bio)) / SECTOR_SIZE; |
@@ -790,8 +848,11 @@ static void restore_request(struct request *rq) | |||
790 | /* | 848 | /* |
791 | * All other packet commands. | 849 | * All other packet commands. |
792 | */ | 850 | */ |
793 | static void ide_cd_request_sense_fixup(struct request *rq) | 851 | static void ide_cd_request_sense_fixup(ide_drive_t *drive, struct request *rq) |
794 | { | 852 | { |
853 | |||
854 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
855 | |||
795 | /* | 856 | /* |
796 | * Some of the trailing request sense fields are optional, | 857 | * Some of the trailing request sense fields are optional, |
797 | * and some drives don't send them. Sigh. | 858 | * and some drives don't send them. Sigh. |
@@ -817,6 +878,10 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, | |||
817 | if (!sense) | 878 | if (!sense) |
818 | sense = &local_sense; | 879 | sense = &local_sense; |
819 | 880 | ||
881 | ide_debug_log(IDE_DBG_PC, "Call %s, rq->cmd[0]: 0x%x, write: 0x%x, " | ||
882 | "timeout: %d, cmd_flags: 0x%x\n", __func__, cmd[0], write, | ||
883 | timeout, cmd_flags); | ||
884 | |||
820 | /* start of retry loop */ | 885 | /* start of retry loop */ |
821 | do { | 886 | do { |
822 | struct request *rq; | 887 | struct request *rq; |
@@ -900,13 +965,16 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
900 | u16 len; | 965 | u16 len; |
901 | u8 ireason; | 966 | u8 ireason; |
902 | 967 | ||
968 | ide_debug_log(IDE_DBG_PC, "Call %s, rq->cmd[0]: 0x%x, write: 0x%x\n", | ||
969 | __func__, rq->cmd[0], write); | ||
970 | |||
903 | /* check for errors */ | 971 | /* check for errors */ |
904 | dma = info->dma; | 972 | dma = info->dma; |
905 | if (dma) { | 973 | if (dma) { |
906 | info->dma = 0; | 974 | info->dma = 0; |
907 | dma_error = hwif->dma_ops->dma_end(drive); | 975 | dma_error = hwif->dma_ops->dma_end(drive); |
908 | if (dma_error) { | 976 | if (dma_error) { |
909 | printk(KERN_ERR "%s: DMA %s error\n", drive->name, | 977 | printk(KERN_ERR PFX "%s: DMA %s error\n", drive->name, |
910 | write ? "write" : "read"); | 978 | write ? "write" : "read"); |
911 | ide_dma_off(drive); | 979 | ide_dma_off(drive); |
912 | } | 980 | } |
@@ -932,6 +1000,9 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
932 | if (thislen > len) | 1000 | if (thislen > len) |
933 | thislen = len; | 1001 | thislen = len; |
934 | 1002 | ||
1003 | ide_debug_log(IDE_DBG_PC, "%s: DRQ: stat: 0x%x, thislen: %d\n", | ||
1004 | __func__, stat, thislen); | ||
1005 | |||
935 | /* If DRQ is clear, the command has completed. */ | 1006 | /* If DRQ is clear, the command has completed. */ |
936 | if ((stat & ATA_DRQ) == 0) { | 1007 | if ((stat & ATA_DRQ) == 0) { |
937 | if (blk_fs_request(rq)) { | 1008 | if (blk_fs_request(rq)) { |
@@ -941,7 +1012,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
941 | */ | 1012 | */ |
942 | uptodate = 1; | 1013 | uptodate = 1; |
943 | if (rq->current_nr_sectors > 0) { | 1014 | if (rq->current_nr_sectors > 0) { |
944 | printk(KERN_ERR "%s: %s: data underrun " | 1015 | printk(KERN_ERR PFX "%s: %s: data underrun " |
945 | "(%d blocks)\n", | 1016 | "(%d blocks)\n", |
946 | drive->name, __func__, | 1017 | drive->name, __func__, |
947 | rq->current_nr_sectors); | 1018 | rq->current_nr_sectors); |
@@ -952,7 +1023,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
952 | cdrom_end_request(drive, uptodate); | 1023 | cdrom_end_request(drive, uptodate); |
953 | return ide_stopped; | 1024 | return ide_stopped; |
954 | } else if (!blk_pc_request(rq)) { | 1025 | } else if (!blk_pc_request(rq)) { |
955 | ide_cd_request_sense_fixup(rq); | 1026 | ide_cd_request_sense_fixup(drive, rq); |
956 | /* complain if we still have data left to transfer */ | 1027 | /* complain if we still have data left to transfer */ |
957 | uptodate = rq->data_len ? 0 : 1; | 1028 | uptodate = rq->data_len ? 0 : 1; |
958 | } | 1029 | } |
@@ -995,6 +1066,9 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
995 | xferfunc = hwif->tp_ops->input_data; | 1066 | xferfunc = hwif->tp_ops->input_data; |
996 | } | 1067 | } |
997 | 1068 | ||
1069 | ide_debug_log(IDE_DBG_PC, "%s: data transfer, rq->cmd_type: 0x%x, " | ||
1070 | "ireason: 0x%x\n", __func__, rq->cmd_type, ireason); | ||
1071 | |||
998 | /* transfer data */ | 1072 | /* transfer data */ |
999 | while (thislen > 0) { | 1073 | while (thislen > 0) { |
1000 | u8 *ptr = blk_fs_request(rq) ? NULL : rq->data; | 1074 | u8 *ptr = blk_fs_request(rq) ? NULL : rq->data; |
@@ -1019,7 +1093,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
1019 | */ | 1093 | */ |
1020 | ide_pad_transfer(drive, 0, thislen); | 1094 | ide_pad_transfer(drive, 0, thislen); |
1021 | else { | 1095 | else { |
1022 | printk(KERN_ERR "%s: confused, missing data\n", | 1096 | printk(KERN_ERR PFX "%s: confused, missing data\n", |
1023 | drive->name); | 1097 | drive->name); |
1024 | blk_dump_rq_flags(rq, rq_data_dir(rq) | 1098 | blk_dump_rq_flags(rq, rq_data_dir(rq) |
1025 | ? "cdrom_newpc_intr, write" | 1099 | ? "cdrom_newpc_intr, write" |
@@ -1106,6 +1180,9 @@ static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq) | |||
1106 | unsigned short sectors_per_frame = | 1180 | unsigned short sectors_per_frame = |
1107 | queue_hardsect_size(drive->queue) >> SECTOR_BITS; | 1181 | queue_hardsect_size(drive->queue) >> SECTOR_BITS; |
1108 | 1182 | ||
1183 | ide_debug_log(IDE_DBG_RQ, "Call %s, write: 0x%x, secs_per_frame: %u\n", | ||
1184 | __func__, write, sectors_per_frame); | ||
1185 | |||
1109 | if (write) { | 1186 | if (write) { |
1110 | /* disk has become write protected */ | 1187 | /* disk has become write protected */ |
1111 | if (get_disk_ro(cd->disk)) { | 1188 | if (get_disk_ro(cd->disk)) { |
@@ -1117,7 +1194,7 @@ static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq) | |||
1117 | * We may be retrying this request after an error. Fix up any | 1194 | * We may be retrying this request after an error. Fix up any |
1118 | * weirdness which might be present in the request packet. | 1195 | * weirdness which might be present in the request packet. |
1119 | */ | 1196 | */ |
1120 | restore_request(rq); | 1197 | ide_cd_restore_request(drive, rq); |
1121 | } | 1198 | } |
1122 | 1199 | ||
1123 | /* use DMA, if possible / writes *must* be hardware frame aligned */ | 1200 | /* use DMA, if possible / writes *must* be hardware frame aligned */ |
@@ -1148,6 +1225,9 @@ static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) | |||
1148 | { | 1225 | { |
1149 | struct cdrom_info *info = drive->driver_data; | 1226 | struct cdrom_info *info = drive->driver_data; |
1150 | 1227 | ||
1228 | ide_debug_log(IDE_DBG_PC, "Call %s, rq->cmd_type: 0x%x\n", __func__, | ||
1229 | rq->cmd_type); | ||
1230 | |||
1151 | if (blk_pc_request(rq)) | 1231 | if (blk_pc_request(rq)) |
1152 | rq->cmd_flags |= REQ_QUIET; | 1232 | rq->cmd_flags |= REQ_QUIET; |
1153 | else | 1233 | else |
@@ -1191,6 +1271,9 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | |||
1191 | ide_handler_t *fn; | 1271 | ide_handler_t *fn; |
1192 | int xferlen; | 1272 | int xferlen; |
1193 | 1273 | ||
1274 | ide_debug_log(IDE_DBG_RQ, "Call %s, rq->cmd_type: 0x%x, block: %llu\n", | ||
1275 | __func__, rq->cmd_type, (u64)block); | ||
1276 | |||
1194 | if (blk_fs_request(rq)) { | 1277 | if (blk_fs_request(rq)) { |
1195 | if (drive->atapi_flags & IDE_AFLAG_SEEKING) { | 1278 | if (drive->atapi_flags & IDE_AFLAG_SEEKING) { |
1196 | ide_hwif_t *hwif = drive->hwif; | 1279 | ide_hwif_t *hwif = drive->hwif; |
@@ -1203,7 +1286,7 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | |||
1203 | IDECD_SEEK_TIMER); | 1286 | IDECD_SEEK_TIMER); |
1204 | return ide_stopped; | 1287 | return ide_stopped; |
1205 | } | 1288 | } |
1206 | printk(KERN_ERR "%s: DSC timeout\n", | 1289 | printk(KERN_ERR PFX "%s: DSC timeout\n", |
1207 | drive->name); | 1290 | drive->name); |
1208 | } | 1291 | } |
1209 | drive->atapi_flags &= ~IDE_AFLAG_SEEKING; | 1292 | drive->atapi_flags &= ~IDE_AFLAG_SEEKING; |
@@ -1244,7 +1327,7 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | |||
1244 | cdrom_end_request(drive, 1); | 1327 | cdrom_end_request(drive, 1); |
1245 | return ide_stopped; | 1328 | return ide_stopped; |
1246 | } else { | 1329 | } else { |
1247 | blk_dump_rq_flags(rq, "ide-cd bad flags"); | 1330 | blk_dump_rq_flags(rq, DRV_NAME " bad flags"); |
1248 | cdrom_end_request(drive, 0); | 1331 | cdrom_end_request(drive, 0); |
1249 | return ide_stopped; | 1332 | return ide_stopped; |
1250 | } | 1333 | } |
@@ -1274,6 +1357,8 @@ int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense) | |||
1274 | struct cdrom_device_info *cdi = &info->devinfo; | 1357 | struct cdrom_device_info *cdi = &info->devinfo; |
1275 | unsigned char cmd[BLK_MAX_CDB]; | 1358 | unsigned char cmd[BLK_MAX_CDB]; |
1276 | 1359 | ||
1360 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
1361 | |||
1277 | memset(cmd, 0, BLK_MAX_CDB); | 1362 | memset(cmd, 0, BLK_MAX_CDB); |
1278 | cmd[0] = GPCMD_TEST_UNIT_READY; | 1363 | cmd[0] = GPCMD_TEST_UNIT_READY; |
1279 | 1364 | ||
@@ -1300,6 +1385,8 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, | |||
1300 | unsigned len = sizeof(capbuf); | 1385 | unsigned len = sizeof(capbuf); |
1301 | u32 blocklen; | 1386 | u32 blocklen; |
1302 | 1387 | ||
1388 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
1389 | |||
1303 | memset(cmd, 0, BLK_MAX_CDB); | 1390 | memset(cmd, 0, BLK_MAX_CDB); |
1304 | cmd[0] = GPCMD_READ_CDVD_CAPACITY; | 1391 | cmd[0] = GPCMD_READ_CDVD_CAPACITY; |
1305 | 1392 | ||
@@ -1319,10 +1406,10 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, | |||
1319 | case 4096: | 1406 | case 4096: |
1320 | break; | 1407 | break; |
1321 | default: | 1408 | default: |
1322 | printk(KERN_ERR "%s: weird block size %u\n", | 1409 | printk(KERN_ERR PFX "%s: weird block size %u\n", |
1323 | drive->name, blocklen); | 1410 | drive->name, blocklen); |
1324 | printk(KERN_ERR "%s: default to 2kb block size\n", | 1411 | printk(KERN_ERR PFX "%s: default to 2kb block size\n", |
1325 | drive->name); | 1412 | drive->name); |
1326 | blocklen = 2048; | 1413 | blocklen = 2048; |
1327 | break; | 1414 | break; |
1328 | } | 1415 | } |
@@ -1338,6 +1425,8 @@ static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag, | |||
1338 | { | 1425 | { |
1339 | unsigned char cmd[BLK_MAX_CDB]; | 1426 | unsigned char cmd[BLK_MAX_CDB]; |
1340 | 1427 | ||
1428 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
1429 | |||
1341 | memset(cmd, 0, BLK_MAX_CDB); | 1430 | memset(cmd, 0, BLK_MAX_CDB); |
1342 | 1431 | ||
1343 | cmd[0] = GPCMD_READ_TOC_PMA_ATIP; | 1432 | cmd[0] = GPCMD_READ_TOC_PMA_ATIP; |
@@ -1366,11 +1455,13 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense) | |||
1366 | long last_written; | 1455 | long last_written; |
1367 | unsigned long sectors_per_frame = SECTORS_PER_FRAME; | 1456 | unsigned long sectors_per_frame = SECTORS_PER_FRAME; |
1368 | 1457 | ||
1458 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
1459 | |||
1369 | if (toc == NULL) { | 1460 | if (toc == NULL) { |
1370 | /* try to allocate space */ | 1461 | /* try to allocate space */ |
1371 | toc = kmalloc(sizeof(struct atapi_toc), GFP_KERNEL); | 1462 | toc = kmalloc(sizeof(struct atapi_toc), GFP_KERNEL); |
1372 | if (toc == NULL) { | 1463 | if (toc == NULL) { |
1373 | printk(KERN_ERR "%s: No cdrom TOC buffer!\n", | 1464 | printk(KERN_ERR PFX "%s: No cdrom TOC buffer!\n", |
1374 | drive->name); | 1465 | drive->name); |
1375 | return -ENOMEM; | 1466 | return -ENOMEM; |
1376 | } | 1467 | } |
@@ -1526,6 +1617,8 @@ int ide_cdrom_get_capabilities(ide_drive_t *drive, u8 *buf) | |||
1526 | struct packet_command cgc; | 1617 | struct packet_command cgc; |
1527 | int stat, attempts = 3, size = ATAPI_CAPABILITIES_PAGE_SIZE; | 1618 | int stat, attempts = 3, size = ATAPI_CAPABILITIES_PAGE_SIZE; |
1528 | 1619 | ||
1620 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
1621 | |||
1529 | if ((drive->atapi_flags & IDE_AFLAG_FULL_CAPS_PAGE) == 0) | 1622 | if ((drive->atapi_flags & IDE_AFLAG_FULL_CAPS_PAGE) == 0) |
1530 | size -= ATAPI_CAPABILITIES_PAGE_PAD_SIZE; | 1623 | size -= ATAPI_CAPABILITIES_PAGE_PAD_SIZE; |
1531 | 1624 | ||
@@ -1544,6 +1637,8 @@ void ide_cdrom_update_speed(ide_drive_t *drive, u8 *buf) | |||
1544 | struct cdrom_info *cd = drive->driver_data; | 1637 | struct cdrom_info *cd = drive->driver_data; |
1545 | u16 curspeed, maxspeed; | 1638 | u16 curspeed, maxspeed; |
1546 | 1639 | ||
1640 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
1641 | |||
1547 | if (drive->atapi_flags & IDE_AFLAG_LE_SPEED_FIELDS) { | 1642 | if (drive->atapi_flags & IDE_AFLAG_LE_SPEED_FIELDS) { |
1548 | curspeed = le16_to_cpup((__le16 *)&buf[8 + 14]); | 1643 | curspeed = le16_to_cpup((__le16 *)&buf[8 + 14]); |
1549 | maxspeed = le16_to_cpup((__le16 *)&buf[8 + 8]); | 1644 | maxspeed = le16_to_cpup((__le16 *)&buf[8 + 8]); |
@@ -1584,6 +1679,8 @@ static int ide_cdrom_register(ide_drive_t *drive, int nslots) | |||
1584 | struct cdrom_info *info = drive->driver_data; | 1679 | struct cdrom_info *info = drive->driver_data; |
1585 | struct cdrom_device_info *devinfo = &info->devinfo; | 1680 | struct cdrom_device_info *devinfo = &info->devinfo; |
1586 | 1681 | ||
1682 | ide_debug_log(IDE_DBG_PROBE, "Call %s, nslots: %d\n", __func__, nslots); | ||
1683 | |||
1587 | devinfo->ops = &ide_cdrom_dops; | 1684 | devinfo->ops = &ide_cdrom_dops; |
1588 | devinfo->speed = info->current_speed; | 1685 | devinfo->speed = info->current_speed; |
1589 | devinfo->capacity = nslots; | 1686 | devinfo->capacity = nslots; |
@@ -1605,13 +1702,17 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive) | |||
1605 | mechtype_t mechtype; | 1702 | mechtype_t mechtype; |
1606 | int nslots = 1; | 1703 | int nslots = 1; |
1607 | 1704 | ||
1705 | ide_debug_log(IDE_DBG_PROBE, "Call %s, drive->media: 0x%x, " | ||
1706 | "drive->atapi_flags: 0x%lx\n", __func__, drive->media, | ||
1707 | drive->atapi_flags); | ||
1708 | |||
1608 | cdi->mask = (CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R | | 1709 | cdi->mask = (CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R | |
1609 | CDC_DVD_RAM | CDC_SELECT_DISC | CDC_PLAY_AUDIO | | 1710 | CDC_DVD_RAM | CDC_SELECT_DISC | CDC_PLAY_AUDIO | |
1610 | CDC_MO_DRIVE | CDC_RAM); | 1711 | CDC_MO_DRIVE | CDC_RAM); |
1611 | 1712 | ||
1612 | if (drive->media == ide_optical) { | 1713 | if (drive->media == ide_optical) { |
1613 | cdi->mask &= ~(CDC_MO_DRIVE | CDC_RAM); | 1714 | cdi->mask &= ~(CDC_MO_DRIVE | CDC_RAM); |
1614 | printk(KERN_ERR "%s: ATAPI magneto-optical drive\n", | 1715 | printk(KERN_ERR PFX "%s: ATAPI magneto-optical drive\n", |
1615 | drive->name); | 1716 | drive->name); |
1616 | return nslots; | 1717 | return nslots; |
1617 | } | 1718 | } |
@@ -1669,7 +1770,7 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive) | |||
1669 | 1770 | ||
1670 | ide_cdrom_update_speed(drive, buf); | 1771 | ide_cdrom_update_speed(drive, buf); |
1671 | 1772 | ||
1672 | printk(KERN_INFO "%s: ATAPI", drive->name); | 1773 | printk(KERN_INFO PFX "%s: ATAPI", drive->name); |
1673 | 1774 | ||
1674 | /* don't print speed if the drive reported 0 */ | 1775 | /* don't print speed if the drive reported 0 */ |
1675 | if (cd->max_speed) | 1776 | if (cd->max_speed) |
@@ -1692,7 +1793,8 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive) | |||
1692 | else | 1793 | else |
1693 | printk(KERN_CONT " drive"); | 1794 | printk(KERN_CONT " drive"); |
1694 | 1795 | ||
1695 | printk(KERN_CONT ", %dkB Cache\n", be16_to_cpup((__be16 *)&buf[8 + 12])); | 1796 | printk(KERN_CONT ", %dkB Cache\n", |
1797 | be16_to_cpup((__be16 *)&buf[8 + 12])); | ||
1696 | 1798 | ||
1697 | return nslots; | 1799 | return nslots; |
1698 | } | 1800 | } |
@@ -1879,6 +1981,8 @@ static int ide_cdrom_setup(ide_drive_t *drive) | |||
1879 | char *fw_rev = (char *)&id[ATA_ID_FW_REV]; | 1981 | char *fw_rev = (char *)&id[ATA_ID_FW_REV]; |
1880 | int nslots; | 1982 | int nslots; |
1881 | 1983 | ||
1984 | ide_debug_log(IDE_DBG_PROBE, "Call %s\n", __func__); | ||
1985 | |||
1882 | blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn); | 1986 | blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn); |
1883 | blk_queue_dma_alignment(drive->queue, 31); | 1987 | blk_queue_dma_alignment(drive->queue, 31); |
1884 | blk_queue_update_dma_pad(drive->queue, 15); | 1988 | blk_queue_update_dma_pad(drive->queue, 15); |
@@ -1911,7 +2015,7 @@ static int ide_cdrom_setup(ide_drive_t *drive) | |||
1911 | drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP; | 2015 | drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP; |
1912 | 2016 | ||
1913 | if (ide_cdrom_register(drive, nslots)) { | 2017 | if (ide_cdrom_register(drive, nslots)) { |
1914 | printk(KERN_ERR "%s: %s failed to register device with the" | 2018 | printk(KERN_ERR PFX "%s: %s failed to register device with the" |
1915 | " cdrom driver.\n", drive->name, __func__); | 2019 | " cdrom driver.\n", drive->name, __func__); |
1916 | cd->devinfo.handle = NULL; | 2020 | cd->devinfo.handle = NULL; |
1917 | return 1; | 2021 | return 1; |
@@ -1925,6 +2029,8 @@ static void ide_cd_remove(ide_drive_t *drive) | |||
1925 | { | 2029 | { |
1926 | struct cdrom_info *info = drive->driver_data; | 2030 | struct cdrom_info *info = drive->driver_data; |
1927 | 2031 | ||
2032 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
2033 | |||
1928 | ide_proc_unregister_driver(drive, info->driver); | 2034 | ide_proc_unregister_driver(drive, info->driver); |
1929 | 2035 | ||
1930 | del_gendisk(info->disk); | 2036 | del_gendisk(info->disk); |
@@ -1939,6 +2045,8 @@ static void ide_cd_release(struct kref *kref) | |||
1939 | ide_drive_t *drive = info->drive; | 2045 | ide_drive_t *drive = info->drive; |
1940 | struct gendisk *g = info->disk; | 2046 | struct gendisk *g = info->disk; |
1941 | 2047 | ||
2048 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
2049 | |||
1942 | kfree(info->toc); | 2050 | kfree(info->toc); |
1943 | if (devinfo->handle == drive) | 2051 | if (devinfo->handle == drive) |
1944 | unregister_cdrom(devinfo); | 2052 | unregister_cdrom(devinfo); |
@@ -2099,6 +2207,10 @@ static int ide_cd_probe(ide_drive_t *drive) | |||
2099 | struct gendisk *g; | 2207 | struct gendisk *g; |
2100 | struct request_sense sense; | 2208 | struct request_sense sense; |
2101 | 2209 | ||
2210 | ide_debug_log(IDE_DBG_PROBE, "Call %s, drive->driver_req: %s, " | ||
2211 | "drive->media: 0x%x\n", __func__, drive->driver_req, | ||
2212 | drive->media); | ||
2213 | |||
2102 | if (!strstr("ide-cdrom", drive->driver_req)) | 2214 | if (!strstr("ide-cdrom", drive->driver_req)) |
2103 | goto failed; | 2215 | goto failed; |
2104 | 2216 | ||
@@ -2108,14 +2220,14 @@ static int ide_cd_probe(ide_drive_t *drive) | |||
2108 | /* skip drives that we were told to ignore */ | 2220 | /* skip drives that we were told to ignore */ |
2109 | if (ignore != NULL) { | 2221 | if (ignore != NULL) { |
2110 | if (strstr(ignore, drive->name)) { | 2222 | if (strstr(ignore, drive->name)) { |
2111 | printk(KERN_INFO "ide-cd: ignoring drive %s\n", | 2223 | printk(KERN_INFO PFX "ignoring drive %s\n", |
2112 | drive->name); | 2224 | drive->name); |
2113 | goto failed; | 2225 | goto failed; |
2114 | } | 2226 | } |
2115 | } | 2227 | } |
2116 | info = kzalloc(sizeof(struct cdrom_info), GFP_KERNEL); | 2228 | info = kzalloc(sizeof(struct cdrom_info), GFP_KERNEL); |
2117 | if (info == NULL) { | 2229 | if (info == NULL) { |
2118 | printk(KERN_ERR "%s: Can't allocate a cdrom structure\n", | 2230 | printk(KERN_ERR PFX "%s: Can't allocate a cdrom structure\n", |
2119 | drive->name); | 2231 | drive->name); |
2120 | goto failed; | 2232 | goto failed; |
2121 | } | 2233 | } |
@@ -2163,6 +2275,7 @@ static void __exit ide_cdrom_exit(void) | |||
2163 | 2275 | ||
2164 | static int __init ide_cdrom_init(void) | 2276 | static int __init ide_cdrom_init(void) |
2165 | { | 2277 | { |
2278 | printk(KERN_INFO DRV_NAME " driver " IDECD_VERSION "\n"); | ||
2166 | return driver_register(&ide_cdrom_driver.gen_driver); | 2279 | return driver_register(&ide_cdrom_driver.gen_driver); |
2167 | } | 2280 | } |
2168 | 2281 | ||