2 pcd.c (c) 1997-8 Grant R. Guenther <grant@torque.net>
3 Under the terms of the GNU General Public License.
5 This is a high-level driver for parallel port ATAPI CD-ROM
6 drives based on chips supported by the paride module.
8 By default, the driver will autoprobe for a single parallel
9 port ATAPI CD-ROM drive, but if their individual parameters are
10 specified, the driver can handle up to 4 drives.
12 The behaviour of the pcd driver can be altered by setting
13 some parameters from the insmod command line. The following
14 parameters are adjustable:
16 drive0 These four arguments can be arrays of
17 drive1 1-6 integers as follows:
19 drive3 <prt>,<pro>,<uni>,<mod>,<slv>,<dly>
23 <prt> is the base of the parallel port address for
24 the corresponding drive. (required)
26 <pro> is the protocol number for the adapter that
27 supports this drive. These numbers are
28 logged by 'paride' when the protocol modules
29 are initialised. (0 if not given)
31 <uni> for those adapters that support chained
32 devices, this is the unit selector for the
33 chain of devices on the given port. It should
34 be zero for devices that don't support chaining.
37 <mod> this can be -1 to choose the best mode, or one
38 of the mode numbers supported by the adapter.
41 <slv> ATAPI CD-ROMs can be jumpered to master or slave.
42 Set this to 0 to choose the master drive, 1 to
43 choose the slave, -1 (the default) to choose the
46 <dly> some parallel ports require the driver to
47 go more slowly. -1 sets a default value that
48 should work with the chosen protocol. Otherwise,
49 set this to a small integer, the larger it is
50 the slower the port i/o. In some cases, setting
51 this to zero will speed up the device. (default -1)
53 major You may use this parameter to override the
54 default major number (46) that this driver
55 will use. Be sure to change the device
58 name This parameter is a character string that
59 contains the name the kernel will use for this
60 device (in /proc output, for instance).
63 verbose This parameter controls the amount of logging
64 that the driver will do. Set it to 0 for
65 normal operation, 1 to see autoprobe progress
66 messages, or 2 to see additional debugging
69 nice This parameter controls the driver's use of
70 idle CPU time, at the expense of some speed.
72 If this driver is built into the kernel, you can use the
73 following kernel command line parameters, with the same values
74 as the corresponding module parameters listed above:
82 In addition, you can use the parameter pcd.disable to disable
89 1.01 GRG 1998.01.24 Added test unit ready support
90 1.02 GRG 1998.05.06 Changes to pcd_completion, ready_wait,
91 and loosen interpretation of ATAPI
92 standard for clearing error status.
93 Use spinlocks. Eliminate sti().
94 1.03 GRG 1998.06.16 Eliminated an Ugh
95 1.04 GRG 1998.08.15 Added extra debugging, improvements to
96 pcd_completion, use HZ in loop timing
97 1.05 GRG 1998.08.16 Conformed to "Uniform CD-ROM" standard
98 1.06 GRG 1998.08.19 Added audio ioctl support
99 1.07 GRG 1998.09.24 Increased reset timeout, added jumbo support
103 #define PCD_VERSION "1.07"
105 #define PCD_NAME "pcd"
108 /* Here are things one can override from the insmod command.
109 Most are autoprobed by paride unless set here. Verbose is off
114 static int verbose
= 0;
115 static int major
= PCD_MAJOR
;
116 static char *name
= PCD_NAME
;
118 static int disable
= 0;
120 static int drive0
[6] = { 0, 0, 0, -1, -1, -1 };
121 static int drive1
[6] = { 0, 0, 0, -1, -1, -1 };
122 static int drive2
[6] = { 0, 0, 0, -1, -1, -1 };
123 static int drive3
[6] = { 0, 0, 0, -1, -1, -1 };
125 static int (*drives
[4])[6] = {&drive0
, &drive1
, &drive2
, &drive3
};
126 static int pcd_drive_count
;
128 enum {D_PRT
, D_PRO
, D_UNI
, D_MOD
, D_SLV
, D_DLY
};
130 /* end of parameters */
132 #include <linux/module.h>
133 #include <linux/init.h>
134 #include <linux/errno.h>
135 #include <linux/fs.h>
136 #include <linux/kernel.h>
137 #include <linux/delay.h>
138 #include <linux/cdrom.h>
139 #include <linux/spinlock.h>
140 #include <linux/blk-mq.h>
141 #include <linux/mutex.h>
142 #include <linux/uaccess.h>
144 static DEFINE_MUTEX(pcd_mutex
);
145 static DEFINE_SPINLOCK(pcd_lock
);
147 module_param(verbose
, int, 0644);
148 module_param(major
, int, 0);
149 module_param(name
, charp
, 0);
150 module_param(nice
, int, 0);
151 module_param_array(drive0
, int, NULL
, 0);
152 module_param_array(drive1
, int, NULL
, 0);
153 module_param_array(drive2
, int, NULL
, 0);
154 module_param_array(drive3
, int, NULL
, 0);
159 #define PCD_RETRIES 5
160 #define PCD_TMO 800 /* timeout in jiffies */
161 #define PCD_DELAY 50 /* spin delay in uS */
162 #define PCD_READY_TMO 20 /* in seconds */
163 #define PCD_RESET_TMO 100 /* in tenths of a second */
165 #define PCD_SPIN (1000000*PCD_TMO)/(HZ*PCD_DELAY)
169 #define IDE_READY 0x40
170 #define IDE_BUSY 0x80
172 static int pcd_open(struct cdrom_device_info
*cdi
, int purpose
);
173 static void pcd_release(struct cdrom_device_info
*cdi
);
174 static int pcd_drive_status(struct cdrom_device_info
*cdi
, int slot_nr
);
175 static unsigned int pcd_check_events(struct cdrom_device_info
*cdi
,
176 unsigned int clearing
, int slot_nr
);
177 static int pcd_tray_move(struct cdrom_device_info
*cdi
, int position
);
178 static int pcd_lock_door(struct cdrom_device_info
*cdi
, int lock
);
179 static int pcd_drive_reset(struct cdrom_device_info
*cdi
);
180 static int pcd_get_mcn(struct cdrom_device_info
*cdi
, struct cdrom_mcn
*mcn
);
181 static int pcd_audio_ioctl(struct cdrom_device_info
*cdi
,
182 unsigned int cmd
, void *arg
);
183 static int pcd_packet(struct cdrom_device_info
*cdi
,
184 struct packet_command
*cgc
);
186 static int pcd_detect(void);
187 static void pcd_probe_capabilities(void);
188 static void do_pcd_read_drq(void);
189 static blk_status_t
pcd_queue_rq(struct blk_mq_hw_ctx
*hctx
,
190 const struct blk_mq_queue_data
*bd
);
191 static void do_pcd_read(void);
194 struct pi_adapter pia
; /* interface to paride layer */
195 struct pi_adapter
*pi
;
196 int drive
; /* master/slave */
197 int last_sense
; /* result of last request sense */
198 int changed
; /* media change seen */
199 int present
; /* does this unit exist ? */
200 char *name
; /* pcd0, pcd1, etc */
201 struct cdrom_device_info info
; /* uniform cdrom interface */
202 struct gendisk
*disk
;
203 struct blk_mq_tag_set tag_set
;
204 struct list_head rq_list
;
207 static struct pcd_unit pcd
[PCD_UNITS
];
209 static char pcd_scratch
[64];
210 static char pcd_buffer
[2048]; /* raw block buffer */
211 static int pcd_bufblk
= -1; /* block in buffer, in CD units,
212 -1 for nothing there. See also
216 /* the variables below are used mainly in the I/O request engine, which
217 processes only one request at a time.
220 static struct pcd_unit
*pcd_current
; /* current request's drive */
221 static struct request
*pcd_req
;
222 static int pcd_retries
; /* retries on current request */
223 static int pcd_busy
; /* request being processed ? */
224 static int pcd_sector
; /* address of next requested sector */
225 static int pcd_count
; /* number of blocks still to do */
226 static char *pcd_buf
; /* buffer for request in progress */
227 static void *par_drv
; /* reference of parport driver */
229 /* kernel glue structures */
231 static int pcd_block_open(struct block_device
*bdev
, fmode_t mode
)
233 struct pcd_unit
*cd
= bdev
->bd_disk
->private_data
;
236 check_disk_change(bdev
);
238 mutex_lock(&pcd_mutex
);
239 ret
= cdrom_open(&cd
->info
, bdev
, mode
);
240 mutex_unlock(&pcd_mutex
);
245 static void pcd_block_release(struct gendisk
*disk
, fmode_t mode
)
247 struct pcd_unit
*cd
= disk
->private_data
;
248 mutex_lock(&pcd_mutex
);
249 cdrom_release(&cd
->info
, mode
);
250 mutex_unlock(&pcd_mutex
);
253 static int pcd_block_ioctl(struct block_device
*bdev
, fmode_t mode
,
254 unsigned cmd
, unsigned long arg
)
256 struct pcd_unit
*cd
= bdev
->bd_disk
->private_data
;
259 mutex_lock(&pcd_mutex
);
260 ret
= cdrom_ioctl(&cd
->info
, bdev
, mode
, cmd
, arg
);
261 mutex_unlock(&pcd_mutex
);
266 static unsigned int pcd_block_check_events(struct gendisk
*disk
,
267 unsigned int clearing
)
269 struct pcd_unit
*cd
= disk
->private_data
;
270 return cdrom_check_events(&cd
->info
, clearing
);
273 static const struct block_device_operations pcd_bdops
= {
274 .owner
= THIS_MODULE
,
275 .open
= pcd_block_open
,
276 .release
= pcd_block_release
,
277 .ioctl
= pcd_block_ioctl
,
279 .ioctl
= blkdev_compat_ptr_ioctl
,
281 .check_events
= pcd_block_check_events
,
284 static const struct cdrom_device_ops pcd_dops
= {
286 .release
= pcd_release
,
287 .drive_status
= pcd_drive_status
,
288 .check_events
= pcd_check_events
,
289 .tray_move
= pcd_tray_move
,
290 .lock_door
= pcd_lock_door
,
291 .get_mcn
= pcd_get_mcn
,
292 .reset
= pcd_drive_reset
,
293 .audio_ioctl
= pcd_audio_ioctl
,
294 .generic_packet
= pcd_packet
,
295 .capability
= CDC_CLOSE_TRAY
| CDC_OPEN_TRAY
| CDC_LOCK
|
296 CDC_MCN
| CDC_MEDIA_CHANGED
| CDC_RESET
|
297 CDC_PLAY_AUDIO
| CDC_GENERIC_PACKET
| CDC_CD_R
|
301 static const struct blk_mq_ops pcd_mq_ops
= {
302 .queue_rq
= pcd_queue_rq
,
305 static void pcd_init_units(void)
311 for (unit
= 0, cd
= pcd
; unit
< PCD_UNITS
; unit
++, cd
++) {
312 struct gendisk
*disk
= alloc_disk(1);
317 disk
->queue
= blk_mq_init_sq_queue(&cd
->tag_set
, &pcd_mq_ops
,
318 1, BLK_MQ_F_SHOULD_MERGE
);
319 if (IS_ERR(disk
->queue
)) {
325 INIT_LIST_HEAD(&cd
->rq_list
);
326 disk
->queue
->queuedata
= cd
;
327 blk_queue_bounce_limit(disk
->queue
, BLK_BOUNCE_HIGH
);
333 cd
->drive
= (*drives
[unit
])[D_SLV
];
334 if ((*drives
[unit
])[D_PRT
])
337 cd
->name
= &cd
->info
.name
[0];
338 snprintf(cd
->name
, sizeof(cd
->info
.name
), "%s%d", name
, unit
);
339 cd
->info
.ops
= &pcd_dops
;
340 cd
->info
.handle
= cd
;
342 cd
->info
.capacity
= 1;
345 disk
->first_minor
= unit
;
346 strcpy(disk
->disk_name
, cd
->name
); /* umm... */
347 disk
->fops
= &pcd_bdops
;
348 disk
->flags
= GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE
;
349 disk
->events
= DISK_EVENT_MEDIA_CHANGE
;
353 static int pcd_open(struct cdrom_device_info
*cdi
, int purpose
)
355 struct pcd_unit
*cd
= cdi
->handle
;
361 static void pcd_release(struct cdrom_device_info
*cdi
)
365 static inline int status_reg(struct pcd_unit
*cd
)
367 return pi_read_regr(cd
->pi
, 1, 6);
370 static inline int read_reg(struct pcd_unit
*cd
, int reg
)
372 return pi_read_regr(cd
->pi
, 0, reg
);
375 static inline void write_reg(struct pcd_unit
*cd
, int reg
, int val
)
377 pi_write_regr(cd
->pi
, 0, reg
, val
);
380 static int pcd_wait(struct pcd_unit
*cd
, int go
, int stop
, char *fun
, char *msg
)
385 while ((((r
= status_reg(cd
)) & go
) || (stop
&& (!(r
& stop
))))
389 if ((r
& (IDE_ERR
& stop
)) || (j
> PCD_SPIN
)) {
396 printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"
397 " loop=%d phase=%d\n",
398 cd
->name
, fun
, msg
, r
, s
, e
, j
, p
);
404 static int pcd_command(struct pcd_unit
*cd
, char *cmd
, int dlen
, char *fun
)
408 write_reg(cd
, 6, 0xa0 + 0x10 * cd
->drive
);
410 if (pcd_wait(cd
, IDE_BUSY
| IDE_DRQ
, 0, fun
, "before command")) {
411 pi_disconnect(cd
->pi
);
415 write_reg(cd
, 4, dlen
% 256);
416 write_reg(cd
, 5, dlen
/ 256);
417 write_reg(cd
, 7, 0xa0); /* ATAPI packet command */
419 if (pcd_wait(cd
, IDE_BUSY
, IDE_DRQ
, fun
, "command DRQ")) {
420 pi_disconnect(cd
->pi
);
424 if (read_reg(cd
, 2) != 1) {
425 printk("%s: %s: command phase error\n", cd
->name
, fun
);
426 pi_disconnect(cd
->pi
);
430 pi_write_block(cd
->pi
, cmd
, 12);
435 static int pcd_completion(struct pcd_unit
*cd
, char *buf
, char *fun
)
437 int r
, d
, p
, n
, k
, j
;
443 if (!pcd_wait(cd
, IDE_BUSY
, IDE_DRQ
| IDE_READY
| IDE_ERR
,
444 fun
, "completion")) {
446 while (read_reg(cd
, 7) & IDE_DRQ
) {
447 d
= read_reg(cd
, 4) + 256 * read_reg(cd
, 5);
448 n
= (d
+ 3) & 0xfffc;
449 p
= read_reg(cd
, 2) & 3;
451 if ((p
== 2) && (n
> 0) && (j
== 0)) {
452 pi_read_block(cd
->pi
, buf
, n
);
454 printk("%s: %s: Read %d bytes\n",
461 ("%s: %s: Unexpected phase %d, d=%d, k=%d\n",
462 cd
->name
, fun
, p
, d
, k
);
465 "%s: WARNING: ATAPI phase errors\n",
470 printk("%s: Stuck DRQ\n", cd
->name
);
474 (cd
, IDE_BUSY
, IDE_DRQ
| IDE_READY
| IDE_ERR
, fun
,
482 pi_disconnect(cd
->pi
);
487 static void pcd_req_sense(struct pcd_unit
*cd
, char *fun
)
489 char rs_cmd
[12] = { 0x03, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
493 r
= pcd_command(cd
, rs_cmd
, 16, "Request sense");
496 pcd_completion(cd
, buf
, "Request sense");
502 printk("%s: %s: Sense key: %x, ASC: %x, ASQ: %x\n",
503 cd
->name
, fun
, buf
[2] & 0xf, buf
[12], buf
[13]);
506 c
| ((buf
[12] & 0xff) << 8) | ((buf
[13] & 0xff) << 16);
508 if ((c
== 2) || (c
== 6))
512 static int pcd_atapi(struct pcd_unit
*cd
, char *cmd
, int dlen
, char *buf
, char *fun
)
516 r
= pcd_command(cd
, cmd
, dlen
, fun
);
519 r
= pcd_completion(cd
, buf
, fun
);
521 pcd_req_sense(cd
, fun
);
526 static int pcd_packet(struct cdrom_device_info
*cdi
, struct packet_command
*cgc
)
528 return pcd_atapi(cdi
->handle
, cgc
->cmd
, cgc
->buflen
, cgc
->buffer
,
532 #define DBMSG(msg) ((verbose>1)?(msg):NULL)
534 static unsigned int pcd_check_events(struct cdrom_device_info
*cdi
,
535 unsigned int clearing
, int slot_nr
)
537 struct pcd_unit
*cd
= cdi
->handle
;
538 int res
= cd
->changed
;
541 return res
? DISK_EVENT_MEDIA_CHANGE
: 0;
544 static int pcd_lock_door(struct cdrom_device_info
*cdi
, int lock
)
546 char un_cmd
[12] = { 0x1e, 0, 0, 0, lock
, 0, 0, 0, 0, 0, 0, 0 };
548 return pcd_atapi(cdi
->handle
, un_cmd
, 0, pcd_scratch
,
549 lock
? "lock door" : "unlock door");
552 static int pcd_tray_move(struct cdrom_device_info
*cdi
, int position
)
554 char ej_cmd
[12] = { 0x1b, 0, 0, 0, 3 - position
, 0, 0, 0, 0, 0, 0, 0 };
556 return pcd_atapi(cdi
->handle
, ej_cmd
, 0, pcd_scratch
,
557 position
? "eject" : "close tray");
560 static void pcd_sleep(int cs
)
562 schedule_timeout_interruptible(cs
);
565 static int pcd_reset(struct pcd_unit
*cd
)
568 int expect
[5] = { 1, 1, 1, 0x14, 0xeb };
571 write_reg(cd
, 6, 0xa0 + 0x10 * cd
->drive
);
574 pcd_sleep(20 * HZ
/ 1000); /* delay a bit */
577 while ((k
++ < PCD_RESET_TMO
) && (status_reg(cd
) & IDE_BUSY
))
581 for (i
= 0; i
< 5; i
++)
582 flg
&= (read_reg(cd
, i
+ 1) == expect
[i
]);
585 printk("%s: Reset (%d) signature = ", cd
->name
, k
);
586 for (i
= 0; i
< 5; i
++)
587 printk("%3x", read_reg(cd
, i
+ 1));
589 printk(" (incorrect)");
593 pi_disconnect(cd
->pi
);
597 static int pcd_drive_reset(struct cdrom_device_info
*cdi
)
599 return pcd_reset(cdi
->handle
);
602 static int pcd_ready_wait(struct pcd_unit
*cd
, int tmo
)
604 char tr_cmd
[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
610 pcd_atapi(cd
, tr_cmd
, 0, NULL
, DBMSG("test unit ready"));
614 if (!(((p
& 0xffff) == 0x0402) || ((p
& 0xff) == 6)))
619 return 0x000020; /* timeout */
622 static int pcd_drive_status(struct cdrom_device_info
*cdi
, int slot_nr
)
624 char rc_cmd
[12] = { 0x25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
625 struct pcd_unit
*cd
= cdi
->handle
;
627 if (pcd_ready_wait(cd
, PCD_READY_TMO
))
628 return CDS_DRIVE_NOT_READY
;
629 if (pcd_atapi(cd
, rc_cmd
, 8, pcd_scratch
, DBMSG("check media")))
634 static int pcd_identify(struct pcd_unit
*cd
, char *id
)
637 char id_cmd
[12] = { 0x12, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
641 s
= pcd_atapi(cd
, id_cmd
, 36, pcd_buffer
, "identify");
645 if ((pcd_buffer
[0] & 0x1f) != 5) {
647 printk("%s: %s is not a CD-ROM\n",
648 cd
->name
, cd
->drive
? "Slave" : "Master");
651 memcpy(id
, pcd_buffer
+ 16, 16);
654 while ((k
>= 0) && (id
[k
] <= 0x20)) {
659 printk("%s: %s: %s\n", cd
->name
, cd
->drive
? "Slave" : "Master", id
);
665 * returns 0, with id set if drive is detected
666 * -1, if drive detection failed
668 static int pcd_probe(struct pcd_unit
*cd
, int ms
, char *id
)
671 for (cd
->drive
= 0; cd
->drive
<= 1; cd
->drive
++)
672 if (!pcd_reset(cd
) && !pcd_identify(cd
, id
))
676 if (!pcd_reset(cd
) && !pcd_identify(cd
, id
))
682 static void pcd_probe_capabilities(void)
686 char cmd
[12] = { 0x5a, 1 << 3, 0x2a, 0, 0, 0, 0, 18, 0, 0, 0, 0 };
689 for (unit
= 0, cd
= pcd
; unit
< PCD_UNITS
; unit
++, cd
++) {
692 r
= pcd_atapi(cd
, cmd
, 18, buffer
, "mode sense capabilities");
695 /* we should now have the cap page */
696 if ((buffer
[11] & 1) == 0)
697 cd
->info
.mask
|= CDC_CD_R
;
698 if ((buffer
[11] & 2) == 0)
699 cd
->info
.mask
|= CDC_CD_RW
;
700 if ((buffer
[12] & 1) == 0)
701 cd
->info
.mask
|= CDC_PLAY_AUDIO
;
702 if ((buffer
[14] & 1) == 0)
703 cd
->info
.mask
|= CDC_LOCK
;
704 if ((buffer
[14] & 8) == 0)
705 cd
->info
.mask
|= CDC_OPEN_TRAY
;
706 if ((buffer
[14] >> 6) == 0)
707 cd
->info
.mask
|= CDC_CLOSE_TRAY
;
711 static int pcd_detect(void)
717 printk("%s: %s version %s, major %d, nice %d\n",
718 name
, name
, PCD_VERSION
, major
, nice
);
720 par_drv
= pi_register_driver(name
);
722 pr_err("failed to register %s driver\n", name
);
727 if (pcd_drive_count
== 0) { /* nothing spec'd - so autoprobe for 1 */
729 if (cd
->disk
&& pi_init(cd
->pi
, 1, -1, -1, -1, -1, -1,
730 pcd_buffer
, PI_PCD
, verbose
, cd
->name
)) {
731 if (!pcd_probe(cd
, -1, id
)) {
738 for (unit
= 0, cd
= pcd
; unit
< PCD_UNITS
; unit
++, cd
++) {
739 int *conf
= *drives
[unit
];
744 if (!pi_init(cd
->pi
, 0, conf
[D_PRT
], conf
[D_MOD
],
745 conf
[D_UNI
], conf
[D_PRO
], conf
[D_DLY
],
746 pcd_buffer
, PI_PCD
, verbose
, cd
->name
))
748 if (!pcd_probe(cd
, conf
[D_SLV
], id
)) {
758 printk("%s: No CD-ROM drive found\n", name
);
759 for (unit
= 0, cd
= pcd
; unit
< PCD_UNITS
; unit
++, cd
++) {
762 blk_cleanup_queue(cd
->disk
->queue
);
763 cd
->disk
->queue
= NULL
;
764 blk_mq_free_tag_set(&cd
->tag_set
);
767 pi_unregister_driver(par_drv
);
771 /* I/O request processing */
772 static int pcd_queue
;
774 static int set_next_request(void)
777 int old_pos
= pcd_queue
;
780 cd
= &pcd
[pcd_queue
];
781 if (++pcd_queue
== PCD_UNITS
)
783 if (cd
->present
&& !list_empty(&cd
->rq_list
)) {
784 pcd_req
= list_first_entry(&cd
->rq_list
, struct request
,
786 list_del_init(&pcd_req
->queuelist
);
787 blk_mq_start_request(pcd_req
);
790 } while (pcd_queue
!= old_pos
);
792 return pcd_req
!= NULL
;
795 static void pcd_request(void)
802 if (!pcd_req
&& !set_next_request())
805 cd
= pcd_req
->rq_disk
->private_data
;
806 if (cd
!= pcd_current
)
809 pcd_sector
= blk_rq_pos(pcd_req
);
810 pcd_count
= blk_rq_cur_sectors(pcd_req
);
811 pcd_buf
= bio_data(pcd_req
->bio
);
813 ps_set_intr(do_pcd_read
, NULL
, 0, nice
);
816 static blk_status_t
pcd_queue_rq(struct blk_mq_hw_ctx
*hctx
,
817 const struct blk_mq_queue_data
*bd
)
819 struct pcd_unit
*cd
= hctx
->queue
->queuedata
;
821 if (rq_data_dir(bd
->rq
) != READ
) {
822 blk_mq_start_request(bd
->rq
);
823 return BLK_STS_IOERR
;
826 spin_lock_irq(&pcd_lock
);
827 list_add_tail(&bd
->rq
->queuelist
, &cd
->rq_list
);
829 spin_unlock_irq(&pcd_lock
);
834 static inline void next_request(blk_status_t err
)
836 unsigned long saved_flags
;
838 spin_lock_irqsave(&pcd_lock
, saved_flags
);
839 if (!blk_update_request(pcd_req
, err
, blk_rq_cur_bytes(pcd_req
))) {
840 __blk_mq_end_request(pcd_req
, err
);
845 spin_unlock_irqrestore(&pcd_lock
, saved_flags
);
848 static int pcd_ready(void)
850 return (((status_reg(pcd_current
) & (IDE_BUSY
| IDE_DRQ
)) == IDE_DRQ
));
853 static void pcd_transfer(void)
856 while (pcd_count
&& (pcd_sector
/ 4 == pcd_bufblk
)) {
857 int o
= (pcd_sector
% 4) * 512;
858 memcpy(pcd_buf
, pcd_buffer
+ o
, 512);
865 static void pcd_start(void)
868 char rd_cmd
[12] = { 0xa8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 };
870 pcd_bufblk
= pcd_sector
/ 4;
872 for (i
= 0; i
< 4; i
++) {
873 rd_cmd
[5 - i
] = b
& 0xff;
877 if (pcd_command(pcd_current
, rd_cmd
, 2048, "read block")) {
879 next_request(BLK_STS_IOERR
);
885 ps_set_intr(do_pcd_read_drq
, pcd_ready
, PCD_TMO
, nice
);
888 static void do_pcd_read(void)
898 pi_do_claimed(pcd_current
->pi
, pcd_start
);
901 static void do_pcd_read_drq(void)
903 unsigned long saved_flags
;
905 if (pcd_completion(pcd_current
, pcd_buffer
, "read block")) {
906 if (pcd_retries
< PCD_RETRIES
) {
909 pi_do_claimed(pcd_current
->pi
, pcd_start
);
913 next_request(BLK_STS_IOERR
);
918 spin_lock_irqsave(&pcd_lock
, saved_flags
);
920 spin_unlock_irqrestore(&pcd_lock
, saved_flags
);
923 /* the audio_ioctl stuff is adapted from sr_ioctl.c */
925 static int pcd_audio_ioctl(struct cdrom_device_info
*cdi
, unsigned int cmd
, void *arg
)
927 struct pcd_unit
*cd
= cdi
->handle
;
931 case CDROMREADTOCHDR
:
935 { GPCMD_READ_TOC_PMA_ATIP
, 0, 0, 0, 0, 0, 0, 0, 12,
937 struct cdrom_tochdr
*tochdr
=
938 (struct cdrom_tochdr
*) arg
;
942 r
= pcd_atapi(cd
, cmd
, 12, buffer
, "read toc header");
944 tochdr
->cdth_trk0
= buffer
[2];
945 tochdr
->cdth_trk1
= buffer
[3];
950 case CDROMREADTOCENTRY
:
954 { GPCMD_READ_TOC_PMA_ATIP
, 0, 0, 0, 0, 0, 0, 0, 12,
957 struct cdrom_tocentry
*tocentry
=
958 (struct cdrom_tocentry
*) arg
;
959 unsigned char buffer
[32];
963 (tocentry
->cdte_format
== CDROM_MSF
? 0x02 : 0);
964 cmd
[6] = tocentry
->cdte_track
;
966 r
= pcd_atapi(cd
, cmd
, 12, buffer
, "read toc entry");
968 tocentry
->cdte_ctrl
= buffer
[5] & 0xf;
969 tocentry
->cdte_adr
= buffer
[5] >> 4;
970 tocentry
->cdte_datamode
=
971 (tocentry
->cdte_ctrl
& 0x04) ? 1 : 0;
972 if (tocentry
->cdte_format
== CDROM_MSF
) {
973 tocentry
->cdte_addr
.msf
.minute
= buffer
[9];
974 tocentry
->cdte_addr
.msf
.second
= buffer
[10];
975 tocentry
->cdte_addr
.msf
.frame
= buffer
[11];
977 tocentry
->cdte_addr
.lba
=
978 (((((buffer
[8] << 8) + buffer
[9]) << 8)
979 + buffer
[10]) << 8) + buffer
[11];
990 static int pcd_get_mcn(struct cdrom_device_info
*cdi
, struct cdrom_mcn
*mcn
)
993 { GPCMD_READ_SUBCHANNEL
, 0, 0x40, 2, 0, 0, 0, 0, 24, 0, 0, 0 };
996 if (pcd_atapi(cdi
->handle
, cmd
, 24, buffer
, "get mcn"))
999 memcpy(mcn
->medium_catalog_number
, buffer
+ 9, 13);
1000 mcn
->medium_catalog_number
[13] = 0;
1005 static int __init
pcd_init(void)
1007 struct pcd_unit
*cd
;
1018 /* get the atapi capabilities page */
1019 pcd_probe_capabilities();
1021 if (register_blkdev(major
, name
)) {
1022 for (unit
= 0, cd
= pcd
; unit
< PCD_UNITS
; unit
++, cd
++) {
1026 blk_cleanup_queue(cd
->disk
->queue
);
1027 blk_mq_free_tag_set(&cd
->tag_set
);
1033 for (unit
= 0, cd
= pcd
; unit
< PCD_UNITS
; unit
++, cd
++) {
1035 register_cdrom(&cd
->info
);
1036 cd
->disk
->private_data
= cd
;
1044 static void __exit
pcd_exit(void)
1046 struct pcd_unit
*cd
;
1049 for (unit
= 0, cd
= pcd
; unit
< PCD_UNITS
; unit
++, cd
++) {
1054 del_gendisk(cd
->disk
);
1056 unregister_cdrom(&cd
->info
);
1058 blk_cleanup_queue(cd
->disk
->queue
);
1059 blk_mq_free_tag_set(&cd
->tag_set
);
1062 unregister_blkdev(major
, name
);
1063 pi_unregister_driver(par_drv
);
1066 MODULE_LICENSE("GPL");
1067 module_init(pcd_init
)
1068 module_exit(pcd_exit
)