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 void do_pcd_read_drq(void);
187 static blk_status_t pcd_queue_rq(struct blk_mq_hw_ctx *hctx,
188 const struct blk_mq_queue_data *bd);
189 static void do_pcd_read(void);
192 struct pi_adapter pia; /* interface to paride layer */
193 struct pi_adapter *pi;
194 int drive; /* master/slave */
195 int last_sense; /* result of last request sense */
196 int changed; /* media change seen */
197 int present; /* does this unit exist ? */
198 char *name; /* pcd0, pcd1, etc */
199 struct cdrom_device_info info; /* uniform cdrom interface */
200 struct gendisk *disk;
201 struct blk_mq_tag_set tag_set;
202 struct list_head rq_list;
205 static struct pcd_unit pcd[PCD_UNITS];
207 static char pcd_scratch[64];
208 static char pcd_buffer[2048]; /* raw block buffer */
209 static int pcd_bufblk = -1; /* block in buffer, in CD units,
210 -1 for nothing there. See also
214 /* the variables below are used mainly in the I/O request engine, which
215 processes only one request at a time.
218 static struct pcd_unit *pcd_current; /* current request's drive */
219 static struct request *pcd_req;
220 static int pcd_retries; /* retries on current request */
221 static int pcd_busy; /* request being processed ? */
222 static int pcd_sector; /* address of next requested sector */
223 static int pcd_count; /* number of blocks still to do */
224 static char *pcd_buf; /* buffer for request in progress */
225 static void *par_drv; /* reference of parport driver */
227 /* kernel glue structures */
229 static int pcd_block_open(struct block_device *bdev, fmode_t mode)
231 struct pcd_unit *cd = bdev->bd_disk->private_data;
234 bdev_check_media_change(bdev);
236 mutex_lock(&pcd_mutex);
237 ret = cdrom_open(&cd->info, bdev, mode);
238 mutex_unlock(&pcd_mutex);
243 static void pcd_block_release(struct gendisk *disk, fmode_t mode)
245 struct pcd_unit *cd = disk->private_data;
246 mutex_lock(&pcd_mutex);
247 cdrom_release(&cd->info, mode);
248 mutex_unlock(&pcd_mutex);
251 static int pcd_block_ioctl(struct block_device *bdev, fmode_t mode,
252 unsigned cmd, unsigned long arg)
254 struct pcd_unit *cd = bdev->bd_disk->private_data;
257 mutex_lock(&pcd_mutex);
258 ret = cdrom_ioctl(&cd->info, bdev, mode, cmd, arg);
259 mutex_unlock(&pcd_mutex);
264 static unsigned int pcd_block_check_events(struct gendisk *disk,
265 unsigned int clearing)
267 struct pcd_unit *cd = disk->private_data;
268 return cdrom_check_events(&cd->info, clearing);
271 static const struct block_device_operations pcd_bdops = {
272 .owner = THIS_MODULE,
273 .open = pcd_block_open,
274 .release = pcd_block_release,
275 .ioctl = pcd_block_ioctl,
277 .compat_ioctl = blkdev_compat_ptr_ioctl,
279 .check_events = pcd_block_check_events,
282 static const struct cdrom_device_ops pcd_dops = {
284 .release = pcd_release,
285 .drive_status = pcd_drive_status,
286 .check_events = pcd_check_events,
287 .tray_move = pcd_tray_move,
288 .lock_door = pcd_lock_door,
289 .get_mcn = pcd_get_mcn,
290 .reset = pcd_drive_reset,
291 .audio_ioctl = pcd_audio_ioctl,
292 .generic_packet = pcd_packet,
293 .capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK |
294 CDC_MCN | CDC_MEDIA_CHANGED | CDC_RESET |
295 CDC_PLAY_AUDIO | CDC_GENERIC_PACKET | CDC_CD_R |
299 static const struct blk_mq_ops pcd_mq_ops = {
300 .queue_rq = pcd_queue_rq,
303 static int pcd_open(struct cdrom_device_info *cdi, int purpose)
305 struct pcd_unit *cd = cdi->handle;
311 static void pcd_release(struct cdrom_device_info *cdi)
315 static inline int status_reg(struct pcd_unit *cd)
317 return pi_read_regr(cd->pi, 1, 6);
320 static inline int read_reg(struct pcd_unit *cd, int reg)
322 return pi_read_regr(cd->pi, 0, reg);
325 static inline void write_reg(struct pcd_unit *cd, int reg, int val)
327 pi_write_regr(cd->pi, 0, reg, val);
330 static int pcd_wait(struct pcd_unit *cd, int go, int stop, char *fun, char *msg)
335 while ((((r = status_reg(cd)) & go) || (stop && (!(r & stop))))
339 if ((r & (IDE_ERR & stop)) || (j > PCD_SPIN)) {
346 printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"
347 " loop=%d phase=%d\n",
348 cd->name, fun, msg, r, s, e, j, p);
354 static int pcd_command(struct pcd_unit *cd, char *cmd, int dlen, char *fun)
358 write_reg(cd, 6, 0xa0 + 0x10 * cd->drive);
360 if (pcd_wait(cd, IDE_BUSY | IDE_DRQ, 0, fun, "before command")) {
361 pi_disconnect(cd->pi);
365 write_reg(cd, 4, dlen % 256);
366 write_reg(cd, 5, dlen / 256);
367 write_reg(cd, 7, 0xa0); /* ATAPI packet command */
369 if (pcd_wait(cd, IDE_BUSY, IDE_DRQ, fun, "command DRQ")) {
370 pi_disconnect(cd->pi);
374 if (read_reg(cd, 2) != 1) {
375 printk("%s: %s: command phase error\n", cd->name, fun);
376 pi_disconnect(cd->pi);
380 pi_write_block(cd->pi, cmd, 12);
385 static int pcd_completion(struct pcd_unit *cd, char *buf, char *fun)
387 int r, d, p, n, k, j;
393 if (!pcd_wait(cd, IDE_BUSY, IDE_DRQ | IDE_READY | IDE_ERR,
394 fun, "completion")) {
396 while (read_reg(cd, 7) & IDE_DRQ) {
397 d = read_reg(cd, 4) + 256 * read_reg(cd, 5);
398 n = (d + 3) & 0xfffc;
399 p = read_reg(cd, 2) & 3;
401 if ((p == 2) && (n > 0) && (j == 0)) {
402 pi_read_block(cd->pi, buf, n);
404 printk("%s: %s: Read %d bytes\n",
411 ("%s: %s: Unexpected phase %d, d=%d, k=%d\n",
412 cd->name, fun, p, d, k);
415 "%s: WARNING: ATAPI phase errors\n",
420 printk("%s: Stuck DRQ\n", cd->name);
424 (cd, IDE_BUSY, IDE_DRQ | IDE_READY | IDE_ERR, fun,
432 pi_disconnect(cd->pi);
437 static void pcd_req_sense(struct pcd_unit *cd, char *fun)
439 char rs_cmd[12] = { 0x03, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
443 r = pcd_command(cd, rs_cmd, 16, "Request sense");
446 pcd_completion(cd, buf, "Request sense");
452 printk("%s: %s: Sense key: %x, ASC: %x, ASQ: %x\n",
453 cd->name, fun, buf[2] & 0xf, buf[12], buf[13]);
456 c | ((buf[12] & 0xff) << 8) | ((buf[13] & 0xff) << 16);
458 if ((c == 2) || (c == 6))
462 static int pcd_atapi(struct pcd_unit *cd, char *cmd, int dlen, char *buf, char *fun)
466 r = pcd_command(cd, cmd, dlen, fun);
469 r = pcd_completion(cd, buf, fun);
471 pcd_req_sense(cd, fun);
476 static int pcd_packet(struct cdrom_device_info *cdi, struct packet_command *cgc)
478 return pcd_atapi(cdi->handle, cgc->cmd, cgc->buflen, cgc->buffer,
482 #define DBMSG(msg) ((verbose>1)?(msg):NULL)
484 static unsigned int pcd_check_events(struct cdrom_device_info *cdi,
485 unsigned int clearing, int slot_nr)
487 struct pcd_unit *cd = cdi->handle;
488 int res = cd->changed;
491 return res ? DISK_EVENT_MEDIA_CHANGE : 0;
494 static int pcd_lock_door(struct cdrom_device_info *cdi, int lock)
496 char un_cmd[12] = { 0x1e, 0, 0, 0, lock, 0, 0, 0, 0, 0, 0, 0 };
498 return pcd_atapi(cdi->handle, un_cmd, 0, pcd_scratch,
499 lock ? "lock door" : "unlock door");
502 static int pcd_tray_move(struct cdrom_device_info *cdi, int position)
504 char ej_cmd[12] = { 0x1b, 0, 0, 0, 3 - position, 0, 0, 0, 0, 0, 0, 0 };
506 return pcd_atapi(cdi->handle, ej_cmd, 0, pcd_scratch,
507 position ? "eject" : "close tray");
510 static void pcd_sleep(int cs)
512 schedule_timeout_interruptible(cs);
515 static int pcd_reset(struct pcd_unit *cd)
518 int expect[5] = { 1, 1, 1, 0x14, 0xeb };
521 write_reg(cd, 6, 0xa0 + 0x10 * cd->drive);
524 pcd_sleep(20 * HZ / 1000); /* delay a bit */
527 while ((k++ < PCD_RESET_TMO) && (status_reg(cd) & IDE_BUSY))
531 for (i = 0; i < 5; i++)
532 flg &= (read_reg(cd, i + 1) == expect[i]);
535 printk("%s: Reset (%d) signature = ", cd->name, k);
536 for (i = 0; i < 5; i++)
537 printk("%3x", read_reg(cd, i + 1));
539 printk(" (incorrect)");
543 pi_disconnect(cd->pi);
547 static int pcd_drive_reset(struct cdrom_device_info *cdi)
549 return pcd_reset(cdi->handle);
552 static int pcd_ready_wait(struct pcd_unit *cd, int tmo)
554 char tr_cmd[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
560 pcd_atapi(cd, tr_cmd, 0, NULL, DBMSG("test unit ready"));
564 if (!(((p & 0xffff) == 0x0402) || ((p & 0xff) == 6)))
569 return 0x000020; /* timeout */
572 static int pcd_drive_status(struct cdrom_device_info *cdi, int slot_nr)
574 char rc_cmd[12] = { 0x25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
575 struct pcd_unit *cd = cdi->handle;
577 if (pcd_ready_wait(cd, PCD_READY_TMO))
578 return CDS_DRIVE_NOT_READY;
579 if (pcd_atapi(cd, rc_cmd, 8, pcd_scratch, DBMSG("check media")))
584 static int pcd_identify(struct pcd_unit *cd)
586 char id_cmd[12] = { 0x12, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
592 s = pcd_atapi(cd, id_cmd, 36, pcd_buffer, "identify");
596 if ((pcd_buffer[0] & 0x1f) != 5) {
598 printk("%s: %s is not a CD-ROM\n",
599 cd->name, cd->drive ? "Slave" : "Master");
602 memcpy(id, pcd_buffer + 16, 16);
605 while ((k >= 0) && (id[k] <= 0x20)) {
610 printk("%s: %s: %s\n", cd->name, cd->drive ? "Slave" : "Master", id);
616 * returns 0, with id set if drive is detected, otherwise an error code.
618 static int pcd_probe(struct pcd_unit *cd, int ms)
621 for (cd->drive = 0; cd->drive <= 1; cd->drive++)
622 if (!pcd_reset(cd) && !pcd_identify(cd))
626 if (!pcd_reset(cd) && !pcd_identify(cd))
632 static int pcd_probe_capabilities(struct pcd_unit *cd)
634 char cmd[12] = { 0x5a, 1 << 3, 0x2a, 0, 0, 0, 0, 18, 0, 0, 0, 0 };
638 ret = pcd_atapi(cd, cmd, 18, buffer, "mode sense capabilities");
642 /* we should now have the cap page */
643 if ((buffer[11] & 1) == 0)
644 cd->info.mask |= CDC_CD_R;
645 if ((buffer[11] & 2) == 0)
646 cd->info.mask |= CDC_CD_RW;
647 if ((buffer[12] & 1) == 0)
648 cd->info.mask |= CDC_PLAY_AUDIO;
649 if ((buffer[14] & 1) == 0)
650 cd->info.mask |= CDC_LOCK;
651 if ((buffer[14] & 8) == 0)
652 cd->info.mask |= CDC_OPEN_TRAY;
653 if ((buffer[14] >> 6) == 0)
654 cd->info.mask |= CDC_CLOSE_TRAY;
659 /* I/O request processing */
660 static int pcd_queue;
662 static int set_next_request(void)
665 int old_pos = pcd_queue;
668 cd = &pcd[pcd_queue];
669 if (++pcd_queue == PCD_UNITS)
671 if (cd->present && !list_empty(&cd->rq_list)) {
672 pcd_req = list_first_entry(&cd->rq_list, struct request,
674 list_del_init(&pcd_req->queuelist);
675 blk_mq_start_request(pcd_req);
678 } while (pcd_queue != old_pos);
680 return pcd_req != NULL;
683 static void pcd_request(void)
690 if (!pcd_req && !set_next_request())
693 cd = pcd_req->q->disk->private_data;
694 if (cd != pcd_current)
697 pcd_sector = blk_rq_pos(pcd_req);
698 pcd_count = blk_rq_cur_sectors(pcd_req);
699 pcd_buf = bio_data(pcd_req->bio);
701 ps_set_intr(do_pcd_read, NULL, 0, nice);
704 static blk_status_t pcd_queue_rq(struct blk_mq_hw_ctx *hctx,
705 const struct blk_mq_queue_data *bd)
707 struct pcd_unit *cd = hctx->queue->queuedata;
709 if (rq_data_dir(bd->rq) != READ) {
710 blk_mq_start_request(bd->rq);
711 return BLK_STS_IOERR;
714 spin_lock_irq(&pcd_lock);
715 list_add_tail(&bd->rq->queuelist, &cd->rq_list);
717 spin_unlock_irq(&pcd_lock);
722 static inline void next_request(blk_status_t err)
724 unsigned long saved_flags;
726 spin_lock_irqsave(&pcd_lock, saved_flags);
727 if (!blk_update_request(pcd_req, err, blk_rq_cur_bytes(pcd_req))) {
728 __blk_mq_end_request(pcd_req, err);
733 spin_unlock_irqrestore(&pcd_lock, saved_flags);
736 static int pcd_ready(void)
738 return (((status_reg(pcd_current) & (IDE_BUSY | IDE_DRQ)) == IDE_DRQ));
741 static void pcd_transfer(void)
744 while (pcd_count && (pcd_sector / 4 == pcd_bufblk)) {
745 int o = (pcd_sector % 4) * 512;
746 memcpy(pcd_buf, pcd_buffer + o, 512);
753 static void pcd_start(void)
756 char rd_cmd[12] = { 0xa8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 };
758 pcd_bufblk = pcd_sector / 4;
760 for (i = 0; i < 4; i++) {
761 rd_cmd[5 - i] = b & 0xff;
765 if (pcd_command(pcd_current, rd_cmd, 2048, "read block")) {
767 next_request(BLK_STS_IOERR);
773 ps_set_intr(do_pcd_read_drq, pcd_ready, PCD_TMO, nice);
776 static void do_pcd_read(void)
786 pi_do_claimed(pcd_current->pi, pcd_start);
789 static void do_pcd_read_drq(void)
791 unsigned long saved_flags;
793 if (pcd_completion(pcd_current, pcd_buffer, "read block")) {
794 if (pcd_retries < PCD_RETRIES) {
797 pi_do_claimed(pcd_current->pi, pcd_start);
801 next_request(BLK_STS_IOERR);
806 spin_lock_irqsave(&pcd_lock, saved_flags);
808 spin_unlock_irqrestore(&pcd_lock, saved_flags);
811 /* the audio_ioctl stuff is adapted from sr_ioctl.c */
813 static int pcd_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
815 struct pcd_unit *cd = cdi->handle;
819 case CDROMREADTOCHDR:
823 { GPCMD_READ_TOC_PMA_ATIP, 0, 0, 0, 0, 0, 0, 0, 12,
825 struct cdrom_tochdr *tochdr =
826 (struct cdrom_tochdr *) arg;
830 r = pcd_atapi(cd, cmd, 12, buffer, "read toc header");
832 tochdr->cdth_trk0 = buffer[2];
833 tochdr->cdth_trk1 = buffer[3];
838 case CDROMREADTOCENTRY:
842 { GPCMD_READ_TOC_PMA_ATIP, 0, 0, 0, 0, 0, 0, 0, 12,
845 struct cdrom_tocentry *tocentry =
846 (struct cdrom_tocentry *) arg;
847 unsigned char buffer[32];
851 (tocentry->cdte_format == CDROM_MSF ? 0x02 : 0);
852 cmd[6] = tocentry->cdte_track;
854 r = pcd_atapi(cd, cmd, 12, buffer, "read toc entry");
856 tocentry->cdte_ctrl = buffer[5] & 0xf;
857 tocentry->cdte_adr = buffer[5] >> 4;
858 tocentry->cdte_datamode =
859 (tocentry->cdte_ctrl & 0x04) ? 1 : 0;
860 if (tocentry->cdte_format == CDROM_MSF) {
861 tocentry->cdte_addr.msf.minute = buffer[9];
862 tocentry->cdte_addr.msf.second = buffer[10];
863 tocentry->cdte_addr.msf.frame = buffer[11];
865 tocentry->cdte_addr.lba =
866 (((((buffer[8] << 8) + buffer[9]) << 8)
867 + buffer[10]) << 8) + buffer[11];
878 static int pcd_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
881 { GPCMD_READ_SUBCHANNEL, 0, 0x40, 2, 0, 0, 0, 0, 24, 0, 0, 0 };
884 if (pcd_atapi(cdi->handle, cmd, 24, buffer, "get mcn"))
887 memcpy(mcn->medium_catalog_number, buffer + 9, 13);
888 mcn->medium_catalog_number[13] = 0;
893 static int pcd_init_unit(struct pcd_unit *cd, bool autoprobe, int port,
894 int mode, int unit, int protocol, int delay, int ms)
896 struct gendisk *disk;
899 ret = blk_mq_alloc_sq_tag_set(&cd->tag_set, &pcd_mq_ops, 1,
900 BLK_MQ_F_SHOULD_MERGE);
904 disk = blk_mq_alloc_disk(&cd->tag_set, cd);
907 goto out_free_tag_set;
910 INIT_LIST_HEAD(&cd->rq_list);
911 blk_queue_bounce_limit(disk->queue, BLK_BOUNCE_HIGH);
917 cd->drive = (*drives[cd - pcd])[D_SLV];
919 cd->name = &cd->info.name[0];
920 snprintf(cd->name, sizeof(cd->info.name), "%s%d", name, unit);
921 cd->info.ops = &pcd_dops;
922 cd->info.handle = cd;
924 cd->info.capacity = 1;
927 disk->first_minor = unit;
929 strcpy(disk->disk_name, cd->name); /* umm... */
930 disk->fops = &pcd_bdops;
931 disk->flags |= GENHD_FL_NO_PART;
932 disk->events = DISK_EVENT_MEDIA_CHANGE;
933 disk->event_flags = DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE;
935 if (!pi_init(cd->pi, autoprobe, port, mode, unit, protocol, delay,
936 pcd_buffer, PI_PCD, verbose, cd->name)) {
940 ret = pcd_probe(cd, ms);
945 pcd_probe_capabilities(cd);
946 ret = register_cdrom(cd->disk, &cd->info);
949 ret = add_disk(cd->disk);
951 goto out_unreg_cdrom;
955 unregister_cdrom(&cd->info);
959 blk_cleanup_disk(cd->disk);
961 blk_mq_free_tag_set(&cd->tag_set);
965 static int __init pcd_init(void)
972 if (register_blkdev(major, name))
975 pr_info("%s: %s version %s, major %d, nice %d\n",
976 name, name, PCD_VERSION, major, nice);
978 par_drv = pi_register_driver(name);
980 pr_err("failed to register %s driver\n", name);
981 goto out_unregister_blkdev;
984 for (unit = 0; unit < PCD_UNITS; unit++) {
985 if ((*drives[unit])[D_PRT])
989 if (pcd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */
990 if (!pcd_init_unit(pcd, 1, -1, -1, -1, -1, -1, -1))
993 for (unit = 0; unit < PCD_UNITS; unit++) {
994 struct pcd_unit *cd = &pcd[unit];
995 int *conf = *drives[unit];
999 if (!pcd_init_unit(cd, 0, conf[D_PRT], conf[D_MOD],
1000 conf[D_UNI], conf[D_PRO], conf[D_DLY],
1007 pr_info("%s: No CD-ROM drive found\n", name);
1008 goto out_unregister_pi_driver;
1013 out_unregister_pi_driver:
1014 pi_unregister_driver(par_drv);
1015 out_unregister_blkdev:
1016 unregister_blkdev(major, name);
1020 static void __exit pcd_exit(void)
1022 struct pcd_unit *cd;
1025 for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
1029 unregister_cdrom(&cd->info);
1030 del_gendisk(cd->disk);
1032 blk_cleanup_disk(cd->disk);
1034 blk_mq_free_tag_set(&cd->tag_set);
1036 pi_unregister_driver(par_drv);
1037 unregister_blkdev(major, name);
1040 MODULE_LICENSE("GPL");
1041 module_init(pcd_init)
1042 module_exit(pcd_exit)