treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / drivers / block / paride / pcd.c
blob117cfc8cd05a4c509876d137bf7fb3e2bd272382
1 /*
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:
18 drive2
19 drive3 <prt>,<pro>,<uni>,<mod>,<slv>,<dly>
21 Where,
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.
35 (0 if not given)
37 <mod> this can be -1 to choose the best mode, or one
38 of the mode numbers supported by the adapter.
39 (-1 if not given)
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
44 first drive found.
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
56 name as well.
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).
61 (default "pcd")
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
67 output. (default 0)
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:
76 pcd.drive0
77 pcd.drive1
78 pcd.drive2
79 pcd.drive3
80 pcd.nice
82 In addition, you can use the parameter pcd.disable to disable
83 the driver entirely.
87 /* Changes:
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"
104 #define PCD_MAJOR 46
105 #define PCD_NAME "pcd"
106 #define PCD_UNITS 4
108 /* Here are things one can override from the insmod command.
109 Most are autoprobed by paride unless set here. Verbose is off
110 by default.
114 static int verbose = 0;
115 static int major = PCD_MAJOR;
116 static char *name = PCD_NAME;
117 static int nice = 0;
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);
156 #include "paride.h"
157 #include "pseudo.h"
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)
167 #define IDE_ERR 0x01
168 #define IDE_DRQ 0x08
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);
193 struct pcd_unit {
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
213 pd_unit.
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;
234 int ret;
236 check_disk_change(bdev);
238 mutex_lock(&pcd_mutex);
239 ret = cdrom_open(&cd->info, bdev, mode);
240 mutex_unlock(&pcd_mutex);
242 return ret;
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;
257 int ret;
259 mutex_lock(&pcd_mutex);
260 ret = cdrom_ioctl(&cd->info, bdev, mode, cmd, arg);
261 mutex_unlock(&pcd_mutex);
263 return ret;
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,
278 #ifdef CONFIG_COMPAT
279 .ioctl = blkdev_compat_ptr_ioctl,
280 #endif
281 .check_events = pcd_block_check_events,
284 static const struct cdrom_device_ops pcd_dops = {
285 .open = pcd_open,
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 |
298 CDC_CD_RW,
301 static const struct blk_mq_ops pcd_mq_ops = {
302 .queue_rq = pcd_queue_rq,
305 static void pcd_init_units(void)
307 struct pcd_unit *cd;
308 int unit;
310 pcd_drive_count = 0;
311 for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
312 struct gendisk *disk = alloc_disk(1);
314 if (!disk)
315 continue;
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)) {
320 disk->queue = NULL;
321 put_disk(disk);
322 continue;
325 INIT_LIST_HEAD(&cd->rq_list);
326 disk->queue->queuedata = cd;
327 blk_queue_bounce_limit(disk->queue, BLK_BOUNCE_HIGH);
328 cd->disk = disk;
329 cd->pi = &cd->pia;
330 cd->present = 0;
331 cd->last_sense = 0;
332 cd->changed = 1;
333 cd->drive = (*drives[unit])[D_SLV];
334 if ((*drives[unit])[D_PRT])
335 pcd_drive_count++;
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;
341 cd->info.speed = 0;
342 cd->info.capacity = 1;
343 cd->info.mask = 0;
344 disk->major = major;
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;
356 if (!cd->present)
357 return -ENODEV;
358 return 0;
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)
382 int j, r, e, s, p;
384 j = 0;
385 while ((((r = status_reg(cd)) & go) || (stop && (!(r & stop))))
386 && (j++ < PCD_SPIN))
387 udelay(PCD_DELAY);
389 if ((r & (IDE_ERR & stop)) || (j > PCD_SPIN)) {
390 s = read_reg(cd, 7);
391 e = read_reg(cd, 1);
392 p = read_reg(cd, 2);
393 if (j > PCD_SPIN)
394 e |= 0x100;
395 if (fun)
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);
399 return (s << 8) + r;
401 return 0;
404 static int pcd_command(struct pcd_unit *cd, char *cmd, int dlen, char *fun)
406 pi_connect(cd->pi);
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);
412 return -1;
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);
421 return -1;
424 if (read_reg(cd, 2) != 1) {
425 printk("%s: %s: command phase error\n", cd->name, fun);
426 pi_disconnect(cd->pi);
427 return -1;
430 pi_write_block(cd->pi, cmd, 12);
432 return 0;
435 static int pcd_completion(struct pcd_unit *cd, char *buf, char *fun)
437 int r, d, p, n, k, j;
439 r = -1;
440 k = 0;
441 j = 0;
443 if (!pcd_wait(cd, IDE_BUSY, IDE_DRQ | IDE_READY | IDE_ERR,
444 fun, "completion")) {
445 r = 0;
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);
453 if (verbose > 1)
454 printk("%s: %s: Read %d bytes\n",
455 cd->name, fun, n);
456 r = 0;
457 j++;
458 } else {
459 if (verbose > 1)
460 printk
461 ("%s: %s: Unexpected phase %d, d=%d, k=%d\n",
462 cd->name, fun, p, d, k);
463 if (verbose < 2)
464 printk_once(
465 "%s: WARNING: ATAPI phase errors\n",
466 cd->name);
467 mdelay(1);
469 if (k++ > PCD_TMO) {
470 printk("%s: Stuck DRQ\n", cd->name);
471 break;
473 if (pcd_wait
474 (cd, IDE_BUSY, IDE_DRQ | IDE_READY | IDE_ERR, fun,
475 "completion")) {
476 r = -1;
477 break;
482 pi_disconnect(cd->pi);
484 return r;
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 };
490 char buf[16];
491 int r, c;
493 r = pcd_command(cd, rs_cmd, 16, "Request sense");
494 mdelay(1);
495 if (!r)
496 pcd_completion(cd, buf, "Request sense");
498 cd->last_sense = -1;
499 c = 2;
500 if (!r) {
501 if (fun)
502 printk("%s: %s: Sense key: %x, ASC: %x, ASQ: %x\n",
503 cd->name, fun, buf[2] & 0xf, buf[12], buf[13]);
504 c = buf[2] & 0xf;
505 cd->last_sense =
506 c | ((buf[12] & 0xff) << 8) | ((buf[13] & 0xff) << 16);
508 if ((c == 2) || (c == 6))
509 cd->changed = 1;
512 static int pcd_atapi(struct pcd_unit *cd, char *cmd, int dlen, char *buf, char *fun)
514 int r;
516 r = pcd_command(cd, cmd, dlen, fun);
517 mdelay(1);
518 if (!r)
519 r = pcd_completion(cd, buf, fun);
520 if (r)
521 pcd_req_sense(cd, fun);
523 return r;
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,
529 "generic packet");
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;
539 if (res)
540 cd->changed = 0;
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)
567 int i, k, flg;
568 int expect[5] = { 1, 1, 1, 0x14, 0xeb };
570 pi_connect(cd->pi);
571 write_reg(cd, 6, 0xa0 + 0x10 * cd->drive);
572 write_reg(cd, 7, 8);
574 pcd_sleep(20 * HZ / 1000); /* delay a bit */
576 k = 0;
577 while ((k++ < PCD_RESET_TMO) && (status_reg(cd) & IDE_BUSY))
578 pcd_sleep(HZ / 10);
580 flg = 1;
581 for (i = 0; i < 5; i++)
582 flg &= (read_reg(cd, i + 1) == expect[i]);
584 if (verbose) {
585 printk("%s: Reset (%d) signature = ", cd->name, k);
586 for (i = 0; i < 5; i++)
587 printk("%3x", read_reg(cd, i + 1));
588 if (!flg)
589 printk(" (incorrect)");
590 printk("\n");
593 pi_disconnect(cd->pi);
594 return flg - 1;
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 };
605 int k, p;
607 k = 0;
608 while (k < tmo) {
609 cd->last_sense = 0;
610 pcd_atapi(cd, tr_cmd, 0, NULL, DBMSG("test unit ready"));
611 p = cd->last_sense;
612 if (!p)
613 return 0;
614 if (!(((p & 0xffff) == 0x0402) || ((p & 0xff) == 6)))
615 return p;
616 k++;
617 pcd_sleep(HZ);
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")))
630 return CDS_NO_DISC;
631 return CDS_DISC_OK;
634 static int pcd_identify(struct pcd_unit *cd, char *id)
636 int k, s;
637 char id_cmd[12] = { 0x12, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
639 pcd_bufblk = -1;
641 s = pcd_atapi(cd, id_cmd, 36, pcd_buffer, "identify");
643 if (s)
644 return -1;
645 if ((pcd_buffer[0] & 0x1f) != 5) {
646 if (verbose)
647 printk("%s: %s is not a CD-ROM\n",
648 cd->name, cd->drive ? "Slave" : "Master");
649 return -1;
651 memcpy(id, pcd_buffer + 16, 16);
652 id[16] = 0;
653 k = 16;
654 while ((k >= 0) && (id[k] <= 0x20)) {
655 id[k] = 0;
656 k--;
659 printk("%s: %s: %s\n", cd->name, cd->drive ? "Slave" : "Master", id);
661 return 0;
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)
670 if (ms == -1) {
671 for (cd->drive = 0; cd->drive <= 1; cd->drive++)
672 if (!pcd_reset(cd) && !pcd_identify(cd, id))
673 return 0;
674 } else {
675 cd->drive = ms;
676 if (!pcd_reset(cd) && !pcd_identify(cd, id))
677 return 0;
679 return -1;
682 static void pcd_probe_capabilities(void)
684 int unit, r;
685 char buffer[32];
686 char cmd[12] = { 0x5a, 1 << 3, 0x2a, 0, 0, 0, 0, 18, 0, 0, 0, 0 };
687 struct pcd_unit *cd;
689 for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
690 if (!cd->present)
691 continue;
692 r = pcd_atapi(cd, cmd, 18, buffer, "mode sense capabilities");
693 if (r)
694 continue;
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)
713 char id[18];
714 int k, unit;
715 struct pcd_unit *cd;
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);
721 if (!par_drv) {
722 pr_err("failed to register %s driver\n", name);
723 return -1;
726 k = 0;
727 if (pcd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */
728 cd = pcd;
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)) {
732 cd->present = 1;
733 k++;
734 } else
735 pi_release(cd->pi);
737 } else {
738 for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
739 int *conf = *drives[unit];
740 if (!conf[D_PRT])
741 continue;
742 if (!cd->disk)
743 continue;
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))
747 continue;
748 if (!pcd_probe(cd, conf[D_SLV], id)) {
749 cd->present = 1;
750 k++;
751 } else
752 pi_release(cd->pi);
755 if (k)
756 return 0;
758 printk("%s: No CD-ROM drive found\n", name);
759 for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
760 if (!cd->disk)
761 continue;
762 blk_cleanup_queue(cd->disk->queue);
763 cd->disk->queue = NULL;
764 blk_mq_free_tag_set(&cd->tag_set);
765 put_disk(cd->disk);
767 pi_unregister_driver(par_drv);
768 return -1;
771 /* I/O request processing */
772 static int pcd_queue;
774 static int set_next_request(void)
776 struct pcd_unit *cd;
777 int old_pos = pcd_queue;
779 do {
780 cd = &pcd[pcd_queue];
781 if (++pcd_queue == PCD_UNITS)
782 pcd_queue = 0;
783 if (cd->present && !list_empty(&cd->rq_list)) {
784 pcd_req = list_first_entry(&cd->rq_list, struct request,
785 queuelist);
786 list_del_init(&pcd_req->queuelist);
787 blk_mq_start_request(pcd_req);
788 break;
790 } while (pcd_queue != old_pos);
792 return pcd_req != NULL;
795 static void pcd_request(void)
797 struct pcd_unit *cd;
799 if (pcd_busy)
800 return;
802 if (!pcd_req && !set_next_request())
803 return;
805 cd = pcd_req->rq_disk->private_data;
806 if (cd != pcd_current)
807 pcd_bufblk = -1;
808 pcd_current = cd;
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);
812 pcd_busy = 1;
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);
828 pcd_request();
829 spin_unlock_irq(&pcd_lock);
831 return BLK_STS_OK;
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);
841 pcd_req = NULL;
843 pcd_busy = 0;
844 pcd_request();
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);
859 pcd_count--;
860 pcd_buf += 512;
861 pcd_sector++;
865 static void pcd_start(void)
867 int b, i;
868 char rd_cmd[12] = { 0xa8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 };
870 pcd_bufblk = pcd_sector / 4;
871 b = pcd_bufblk;
872 for (i = 0; i < 4; i++) {
873 rd_cmd[5 - i] = b & 0xff;
874 b = b >> 8;
877 if (pcd_command(pcd_current, rd_cmd, 2048, "read block")) {
878 pcd_bufblk = -1;
879 next_request(BLK_STS_IOERR);
880 return;
883 mdelay(1);
885 ps_set_intr(do_pcd_read_drq, pcd_ready, PCD_TMO, nice);
888 static void do_pcd_read(void)
890 pcd_busy = 1;
891 pcd_retries = 0;
892 pcd_transfer();
893 if (!pcd_count) {
894 next_request(0);
895 return;
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) {
907 mdelay(1);
908 pcd_retries++;
909 pi_do_claimed(pcd_current->pi, pcd_start);
910 return;
912 pcd_bufblk = -1;
913 next_request(BLK_STS_IOERR);
914 return;
917 do_pcd_read();
918 spin_lock_irqsave(&pcd_lock, saved_flags);
919 pcd_request();
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;
929 switch (cmd) {
931 case CDROMREADTOCHDR:
934 char cmd[12] =
935 { GPCMD_READ_TOC_PMA_ATIP, 0, 0, 0, 0, 0, 0, 0, 12,
936 0, 0, 0 };
937 struct cdrom_tochdr *tochdr =
938 (struct cdrom_tochdr *) arg;
939 char buffer[32];
940 int r;
942 r = pcd_atapi(cd, cmd, 12, buffer, "read toc header");
944 tochdr->cdth_trk0 = buffer[2];
945 tochdr->cdth_trk1 = buffer[3];
947 return r ? -EIO : 0;
950 case CDROMREADTOCENTRY:
953 char cmd[12] =
954 { GPCMD_READ_TOC_PMA_ATIP, 0, 0, 0, 0, 0, 0, 0, 12,
955 0, 0, 0 };
957 struct cdrom_tocentry *tocentry =
958 (struct cdrom_tocentry *) arg;
959 unsigned char buffer[32];
960 int r;
962 cmd[1] =
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];
976 } else
977 tocentry->cdte_addr.lba =
978 (((((buffer[8] << 8) + buffer[9]) << 8)
979 + buffer[10]) << 8) + buffer[11];
981 return r ? -EIO : 0;
984 default:
986 return -ENOSYS;
990 static int pcd_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
992 char cmd[12] =
993 { GPCMD_READ_SUBCHANNEL, 0, 0x40, 2, 0, 0, 0, 0, 24, 0, 0, 0 };
994 char buffer[32];
996 if (pcd_atapi(cdi->handle, cmd, 24, buffer, "get mcn"))
997 return -EIO;
999 memcpy(mcn->medium_catalog_number, buffer + 9, 13);
1000 mcn->medium_catalog_number[13] = 0;
1002 return 0;
1005 static int __init pcd_init(void)
1007 struct pcd_unit *cd;
1008 int unit;
1010 if (disable)
1011 return -EINVAL;
1013 pcd_init_units();
1015 if (pcd_detect())
1016 return -ENODEV;
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++) {
1023 if (!cd->disk)
1024 continue;
1026 blk_cleanup_queue(cd->disk->queue);
1027 blk_mq_free_tag_set(&cd->tag_set);
1028 put_disk(cd->disk);
1030 return -EBUSY;
1033 for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
1034 if (cd->present) {
1035 register_cdrom(&cd->info);
1036 cd->disk->private_data = cd;
1037 add_disk(cd->disk);
1041 return 0;
1044 static void __exit pcd_exit(void)
1046 struct pcd_unit *cd;
1047 int unit;
1049 for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
1050 if (!cd->disk)
1051 continue;
1053 if (cd->present) {
1054 del_gendisk(cd->disk);
1055 pi_release(cd->pi);
1056 unregister_cdrom(&cd->info);
1058 blk_cleanup_queue(cd->disk->queue);
1059 blk_mq_free_tag_set(&cd->tag_set);
1060 put_disk(cd->disk);
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)