linux/drivers/block/paride/pcd.c
<<
>>
Prefs
   1/* 
   2        pcd.c   (c) 1997-8  Grant R. Guenther <grant@torque.net>
   3                            Under the terms of the GNU General Public License.
   4
   5        This is a high-level driver for parallel port ATAPI CD-ROM
   6        drives based on chips supported by the paride module.
   7
   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.
  11
  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:
  15
  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>
  20
  21                        Where,
  22
  23                <prt>   is the base of the parallel port address for
  24                        the corresponding drive.  (required)
  25
  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)
  30
  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)
  36
  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)
  40
  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.
  45
  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)
  52                        
  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.
  57
  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")
  62
  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)
  68  
  69            nice        This parameter controls the driver's use of
  70                        idle CPU time, at the expense of some speed.
  71 
  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:
  75
  76            pcd.drive0
  77            pcd.drive1
  78            pcd.drive2
  79            pcd.drive3
  80            pcd.nice
  81
  82        In addition, you can use the parameter pcd.disable to disable
  83        the driver entirely.
  84
  85*/
  86
  87/* Changes:
  88
  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
 100
 101*/
 102
 103#define PCD_VERSION     "1.07"
 104#define PCD_MAJOR       46
 105#define PCD_NAME        "pcd"
 106#define PCD_UNITS       4
 107
 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.
 111
 112*/
 113
 114static int verbose = 0;
 115static int major = PCD_MAJOR;
 116static char *name = PCD_NAME;
 117static int nice = 0;
 118static int disable = 0;
 119
 120static int drive0[6] = { 0, 0, 0, -1, -1, -1 };
 121static int drive1[6] = { 0, 0, 0, -1, -1, -1 };
 122static int drive2[6] = { 0, 0, 0, -1, -1, -1 };
 123static int drive3[6] = { 0, 0, 0, -1, -1, -1 };
 124
 125static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3};
 126static int pcd_drive_count;
 127
 128enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_DLY};
 129
 130/* end of parameters */
 131
 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>
 143
 144static DEFINE_MUTEX(pcd_mutex);
 145static DEFINE_SPINLOCK(pcd_lock);
 146
 147module_param(verbose, int, 0644);
 148module_param(major, int, 0);
 149module_param(name, charp, 0);
 150module_param(nice, int, 0);
 151module_param_array(drive0, int, NULL, 0);
 152module_param_array(drive1, int, NULL, 0);
 153module_param_array(drive2, int, NULL, 0);
 154module_param_array(drive3, int, NULL, 0);
 155
 156#include "paride.h"
 157#include "pseudo.h"
 158
 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 */
 164
 165#define PCD_SPIN        (1000000*PCD_TMO)/(HZ*PCD_DELAY)
 166
 167#define IDE_ERR         0x01
 168#define IDE_DRQ         0x08
 169#define IDE_READY       0x40
 170#define IDE_BUSY        0x80
 171
 172static int pcd_open(struct cdrom_device_info *cdi, int purpose);
 173static void pcd_release(struct cdrom_device_info *cdi);
 174static int pcd_drive_status(struct cdrom_device_info *cdi, int slot_nr);
 175static unsigned int pcd_check_events(struct cdrom_device_info *cdi,
 176                                     unsigned int clearing, int slot_nr);
 177static int pcd_tray_move(struct cdrom_device_info *cdi, int position);
 178static int pcd_lock_door(struct cdrom_device_info *cdi, int lock);
 179static int pcd_drive_reset(struct cdrom_device_info *cdi);
 180static int pcd_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn);
 181static int pcd_audio_ioctl(struct cdrom_device_info *cdi,
 182                           unsigned int cmd, void *arg);
 183static int pcd_packet(struct cdrom_device_info *cdi,
 184                      struct packet_command *cgc);
 185
 186static int pcd_detect(void);
 187static void pcd_probe_capabilities(void);
 188static void do_pcd_read_drq(void);
 189static blk_status_t pcd_queue_rq(struct blk_mq_hw_ctx *hctx,
 190                                 const struct blk_mq_queue_data *bd);
 191static void do_pcd_read(void);
 192
 193struct 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;
 205};
 206
 207static struct pcd_unit pcd[PCD_UNITS];
 208
 209static char pcd_scratch[64];
 210static char pcd_buffer[2048];   /* raw block buffer */
 211static int pcd_bufblk = -1;     /* block in buffer, in CD units,
 212                                   -1 for nothing there. See also
 213                                   pd_unit.
 214                                 */
 215
 216/* the variables below are used mainly in the I/O request engine, which
 217   processes only one request at a time.
 218*/
 219
 220static struct pcd_unit *pcd_current; /* current request's drive */
 221static struct request *pcd_req;
 222static int pcd_retries;         /* retries on current request */
 223static int pcd_busy;            /* request being processed ? */
 224static int pcd_sector;          /* address of next requested sector */
 225static int pcd_count;           /* number of blocks still to do */
 226static char *pcd_buf;           /* buffer for request in progress */
 227static void *par_drv;           /* reference of parport driver */
 228
 229/* kernel glue structures */
 230
 231static int pcd_block_open(struct block_device *bdev, fmode_t mode)
 232{
 233        struct pcd_unit *cd = bdev->bd_disk->private_data;
 234        int ret;
 235
 236        bdev_check_media_change(bdev);
 237
 238        mutex_lock(&pcd_mutex);
 239        ret = cdrom_open(&cd->info, bdev, mode);
 240        mutex_unlock(&pcd_mutex);
 241
 242        return ret;
 243}
 244
 245static void pcd_block_release(struct gendisk *disk, fmode_t mode)
 246{
 247        struct pcd_unit *cd = disk->private_data;
 248        mutex_lock(&pcd_mutex);
 249        cdrom_release(&cd->info, mode);
 250        mutex_unlock(&pcd_mutex);
 251}
 252
 253static int pcd_block_ioctl(struct block_device *bdev, fmode_t mode,
 254                                unsigned cmd, unsigned long arg)
 255{
 256        struct pcd_unit *cd = bdev->bd_disk->private_data;
 257        int ret;
 258
 259        mutex_lock(&pcd_mutex);
 260        ret = cdrom_ioctl(&cd->info, bdev, mode, cmd, arg);
 261        mutex_unlock(&pcd_mutex);
 262
 263        return ret;
 264}
 265
 266static unsigned int pcd_block_check_events(struct gendisk *disk,
 267                                           unsigned int clearing)
 268{
 269        struct pcd_unit *cd = disk->private_data;
 270        return cdrom_check_events(&cd->info, clearing);
 271}
 272
 273static 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        .compat_ioctl   = blkdev_compat_ptr_ioctl,
 280#endif
 281        .check_events   = pcd_block_check_events,
 282};
 283
 284static 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,
 299};
 300
 301static const struct blk_mq_ops pcd_mq_ops = {
 302        .queue_rq       = pcd_queue_rq,
 303};
 304
 305static void pcd_init_units(void)
 306{
 307        struct pcd_unit *cd;
 308        int unit;
 309
 310        pcd_drive_count = 0;
 311        for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
 312                struct gendisk *disk;
 313
 314                if (blk_mq_alloc_sq_tag_set(&cd->tag_set, &pcd_mq_ops, 1,
 315                                BLK_MQ_F_SHOULD_MERGE))
 316                        continue;
 317
 318                disk = blk_mq_alloc_disk(&cd->tag_set, cd);
 319                if (IS_ERR(disk)) {
 320                        blk_mq_free_tag_set(&cd->tag_set);
 321                        continue;
 322                }
 323
 324                INIT_LIST_HEAD(&cd->rq_list);
 325                blk_queue_bounce_limit(disk->queue, BLK_BOUNCE_HIGH);
 326                cd->disk = disk;
 327                cd->pi = &cd->pia;
 328                cd->present = 0;
 329                cd->last_sense = 0;
 330                cd->changed = 1;
 331                cd->drive = (*drives[unit])[D_SLV];
 332                if ((*drives[unit])[D_PRT])
 333                        pcd_drive_count++;
 334
 335                cd->name = &cd->info.name[0];
 336                snprintf(cd->name, sizeof(cd->info.name), "%s%d", name, unit);
 337                cd->info.ops = &pcd_dops;
 338                cd->info.handle = cd;
 339                cd->info.speed = 0;
 340                cd->info.capacity = 1;
 341                cd->info.mask = 0;
 342                disk->major = major;
 343                disk->first_minor = unit;
 344                disk->minors = 1;
 345                strcpy(disk->disk_name, cd->name);      /* umm... */
 346                disk->fops = &pcd_bdops;
 347                disk->flags = GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE;
 348                disk->events = DISK_EVENT_MEDIA_CHANGE;
 349        }
 350}
 351
 352static int pcd_open(struct cdrom_device_info *cdi, int purpose)
 353{
 354        struct pcd_unit *cd = cdi->handle;
 355        if (!cd->present)
 356                return -ENODEV;
 357        return 0;
 358}
 359
 360static void pcd_release(struct cdrom_device_info *cdi)
 361{
 362}
 363
 364static inline int status_reg(struct pcd_unit *cd)
 365{
 366        return pi_read_regr(cd->pi, 1, 6);
 367}
 368
 369static inline int read_reg(struct pcd_unit *cd, int reg)
 370{
 371        return pi_read_regr(cd->pi, 0, reg);
 372}
 373
 374static inline void write_reg(struct pcd_unit *cd, int reg, int val)
 375{
 376        pi_write_regr(cd->pi, 0, reg, val);
 377}
 378
 379static int pcd_wait(struct pcd_unit *cd, int go, int stop, char *fun, char *msg)
 380{
 381        int j, r, e, s, p;
 382
 383        j = 0;
 384        while ((((r = status_reg(cd)) & go) || (stop && (!(r & stop))))
 385               && (j++ < PCD_SPIN))
 386                udelay(PCD_DELAY);
 387
 388        if ((r & (IDE_ERR & stop)) || (j > PCD_SPIN)) {
 389                s = read_reg(cd, 7);
 390                e = read_reg(cd, 1);
 391                p = read_reg(cd, 2);
 392                if (j > PCD_SPIN)
 393                        e |= 0x100;
 394                if (fun)
 395                        printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"
 396                               " loop=%d phase=%d\n",
 397                               cd->name, fun, msg, r, s, e, j, p);
 398                return (s << 8) + r;
 399        }
 400        return 0;
 401}
 402
 403static int pcd_command(struct pcd_unit *cd, char *cmd, int dlen, char *fun)
 404{
 405        pi_connect(cd->pi);
 406
 407        write_reg(cd, 6, 0xa0 + 0x10 * cd->drive);
 408
 409        if (pcd_wait(cd, IDE_BUSY | IDE_DRQ, 0, fun, "before command")) {
 410                pi_disconnect(cd->pi);
 411                return -1;
 412        }
 413
 414        write_reg(cd, 4, dlen % 256);
 415        write_reg(cd, 5, dlen / 256);
 416        write_reg(cd, 7, 0xa0); /* ATAPI packet command */
 417
 418        if (pcd_wait(cd, IDE_BUSY, IDE_DRQ, fun, "command DRQ")) {
 419                pi_disconnect(cd->pi);
 420                return -1;
 421        }
 422
 423        if (read_reg(cd, 2) != 1) {
 424                printk("%s: %s: command phase error\n", cd->name, fun);
 425                pi_disconnect(cd->pi);
 426                return -1;
 427        }
 428
 429        pi_write_block(cd->pi, cmd, 12);
 430
 431        return 0;
 432}
 433
 434static int pcd_completion(struct pcd_unit *cd, char *buf, char *fun)
 435{
 436        int r, d, p, n, k, j;
 437
 438        r = -1;
 439        k = 0;
 440        j = 0;
 441
 442        if (!pcd_wait(cd, IDE_BUSY, IDE_DRQ | IDE_READY | IDE_ERR,
 443                      fun, "completion")) {
 444                r = 0;
 445                while (read_reg(cd, 7) & IDE_DRQ) {
 446                        d = read_reg(cd, 4) + 256 * read_reg(cd, 5);
 447                        n = (d + 3) & 0xfffc;
 448                        p = read_reg(cd, 2) & 3;
 449
 450                        if ((p == 2) && (n > 0) && (j == 0)) {
 451                                pi_read_block(cd->pi, buf, n);
 452                                if (verbose > 1)
 453                                        printk("%s: %s: Read %d bytes\n",
 454                                               cd->name, fun, n);
 455                                r = 0;
 456                                j++;
 457                        } else {
 458                                if (verbose > 1)
 459                                        printk
 460                                            ("%s: %s: Unexpected phase %d, d=%d, k=%d\n",
 461                                             cd->name, fun, p, d, k);
 462                                if (verbose < 2)
 463                                        printk_once(
 464                                            "%s: WARNING: ATAPI phase errors\n",
 465                                            cd->name);
 466                                mdelay(1);
 467                        }
 468                        if (k++ > PCD_TMO) {
 469                                printk("%s: Stuck DRQ\n", cd->name);
 470                                break;
 471                        }
 472                        if (pcd_wait
 473                            (cd, IDE_BUSY, IDE_DRQ | IDE_READY | IDE_ERR, fun,
 474                             "completion")) {
 475                                r = -1;
 476                                break;
 477                        }
 478                }
 479        }
 480
 481        pi_disconnect(cd->pi);
 482
 483        return r;
 484}
 485
 486static void pcd_req_sense(struct pcd_unit *cd, char *fun)
 487{
 488        char rs_cmd[12] = { 0x03, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
 489        char buf[16];
 490        int r, c;
 491
 492        r = pcd_command(cd, rs_cmd, 16, "Request sense");
 493        mdelay(1);
 494        if (!r)
 495                pcd_completion(cd, buf, "Request sense");
 496
 497        cd->last_sense = -1;
 498        c = 2;
 499        if (!r) {
 500                if (fun)
 501                        printk("%s: %s: Sense key: %x, ASC: %x, ASQ: %x\n",
 502                               cd->name, fun, buf[2] & 0xf, buf[12], buf[13]);
 503                c = buf[2] & 0xf;
 504                cd->last_sense =
 505                    c | ((buf[12] & 0xff) << 8) | ((buf[13] & 0xff) << 16);
 506        }
 507        if ((c == 2) || (c == 6))
 508                cd->changed = 1;
 509}
 510
 511static int pcd_atapi(struct pcd_unit *cd, char *cmd, int dlen, char *buf, char *fun)
 512{
 513        int r;
 514
 515        r = pcd_command(cd, cmd, dlen, fun);
 516        mdelay(1);
 517        if (!r)
 518                r = pcd_completion(cd, buf, fun);
 519        if (r)
 520                pcd_req_sense(cd, fun);
 521
 522        return r;
 523}
 524
 525static int pcd_packet(struct cdrom_device_info *cdi, struct packet_command *cgc)
 526{
 527        return pcd_atapi(cdi->handle, cgc->cmd, cgc->buflen, cgc->buffer,
 528                         "generic packet");
 529}
 530
 531#define DBMSG(msg)      ((verbose>1)?(msg):NULL)
 532
 533static unsigned int pcd_check_events(struct cdrom_device_info *cdi,
 534                                     unsigned int clearing, int slot_nr)
 535{
 536        struct pcd_unit *cd = cdi->handle;
 537        int res = cd->changed;
 538        if (res)
 539                cd->changed = 0;
 540        return res ? DISK_EVENT_MEDIA_CHANGE : 0;
 541}
 542
 543static int pcd_lock_door(struct cdrom_device_info *cdi, int lock)
 544{
 545        char un_cmd[12] = { 0x1e, 0, 0, 0, lock, 0, 0, 0, 0, 0, 0, 0 };
 546
 547        return pcd_atapi(cdi->handle, un_cmd, 0, pcd_scratch,
 548                         lock ? "lock door" : "unlock door");
 549}
 550
 551static int pcd_tray_move(struct cdrom_device_info *cdi, int position)
 552{
 553        char ej_cmd[12] = { 0x1b, 0, 0, 0, 3 - position, 0, 0, 0, 0, 0, 0, 0 };
 554
 555        return pcd_atapi(cdi->handle, ej_cmd, 0, pcd_scratch,
 556                         position ? "eject" : "close tray");
 557}
 558
 559static void pcd_sleep(int cs)
 560{
 561        schedule_timeout_interruptible(cs);
 562}
 563
 564static int pcd_reset(struct pcd_unit *cd)
 565{
 566        int i, k, flg;
 567        int expect[5] = { 1, 1, 1, 0x14, 0xeb };
 568
 569        pi_connect(cd->pi);
 570        write_reg(cd, 6, 0xa0 + 0x10 * cd->drive);
 571        write_reg(cd, 7, 8);
 572
 573        pcd_sleep(20 * HZ / 1000);      /* delay a bit */
 574
 575        k = 0;
 576        while ((k++ < PCD_RESET_TMO) && (status_reg(cd) & IDE_BUSY))
 577                pcd_sleep(HZ / 10);
 578
 579        flg = 1;
 580        for (i = 0; i < 5; i++)
 581                flg &= (read_reg(cd, i + 1) == expect[i]);
 582
 583        if (verbose) {
 584                printk("%s: Reset (%d) signature = ", cd->name, k);
 585                for (i = 0; i < 5; i++)
 586                        printk("%3x", read_reg(cd, i + 1));
 587                if (!flg)
 588                        printk(" (incorrect)");
 589                printk("\n");
 590        }
 591
 592        pi_disconnect(cd->pi);
 593        return flg - 1;
 594}
 595
 596static int pcd_drive_reset(struct cdrom_device_info *cdi)
 597{
 598        return pcd_reset(cdi->handle);
 599}
 600
 601static int pcd_ready_wait(struct pcd_unit *cd, int tmo)
 602{
 603        char tr_cmd[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 604        int k, p;
 605
 606        k = 0;
 607        while (k < tmo) {
 608                cd->last_sense = 0;
 609                pcd_atapi(cd, tr_cmd, 0, NULL, DBMSG("test unit ready"));
 610                p = cd->last_sense;
 611                if (!p)
 612                        return 0;
 613                if (!(((p & 0xffff) == 0x0402) || ((p & 0xff) == 6)))
 614                        return p;
 615                k++;
 616                pcd_sleep(HZ);
 617        }
 618        return 0x000020;        /* timeout */
 619}
 620
 621static int pcd_drive_status(struct cdrom_device_info *cdi, int slot_nr)
 622{
 623        char rc_cmd[12] = { 0x25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 624        struct pcd_unit *cd = cdi->handle;
 625
 626        if (pcd_ready_wait(cd, PCD_READY_TMO))
 627                return CDS_DRIVE_NOT_READY;
 628        if (pcd_atapi(cd, rc_cmd, 8, pcd_scratch, DBMSG("check media")))
 629                return CDS_NO_DISC;
 630        return CDS_DISC_OK;
 631}
 632
 633static int pcd_identify(struct pcd_unit *cd, char *id)
 634{
 635        int k, s;
 636        char id_cmd[12] = { 0x12, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
 637
 638        pcd_bufblk = -1;
 639
 640        s = pcd_atapi(cd, id_cmd, 36, pcd_buffer, "identify");
 641
 642        if (s)
 643                return -1;
 644        if ((pcd_buffer[0] & 0x1f) != 5) {
 645                if (verbose)
 646                        printk("%s: %s is not a CD-ROM\n",
 647                               cd->name, cd->drive ? "Slave" : "Master");
 648                return -1;
 649        }
 650        memcpy(id, pcd_buffer + 16, 16);
 651        id[16] = 0;
 652        k = 16;
 653        while ((k >= 0) && (id[k] <= 0x20)) {
 654                id[k] = 0;
 655                k--;
 656        }
 657
 658        printk("%s: %s: %s\n", cd->name, cd->drive ? "Slave" : "Master", id);
 659
 660        return 0;
 661}
 662
 663/*
 664 * returns  0, with id set if drive is detected
 665 *          -1, if drive detection failed
 666 */
 667static int pcd_probe(struct pcd_unit *cd, int ms, char *id)
 668{
 669        if (ms == -1) {
 670                for (cd->drive = 0; cd->drive <= 1; cd->drive++)
 671                        if (!pcd_reset(cd) && !pcd_identify(cd, id))
 672                                return 0;
 673        } else {
 674                cd->drive = ms;
 675                if (!pcd_reset(cd) && !pcd_identify(cd, id))
 676                        return 0;
 677        }
 678        return -1;
 679}
 680
 681static void pcd_probe_capabilities(void)
 682{
 683        int unit, r;
 684        char buffer[32];
 685        char cmd[12] = { 0x5a, 1 << 3, 0x2a, 0, 0, 0, 0, 18, 0, 0, 0, 0 };
 686        struct pcd_unit *cd;
 687
 688        for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
 689                if (!cd->present)
 690                        continue;
 691                r = pcd_atapi(cd, cmd, 18, buffer, "mode sense capabilities");
 692                if (r)
 693                        continue;
 694                /* we should now have the cap page */
 695                if ((buffer[11] & 1) == 0)
 696                        cd->info.mask |= CDC_CD_R;
 697                if ((buffer[11] & 2) == 0)
 698                        cd->info.mask |= CDC_CD_RW;
 699                if ((buffer[12] & 1) == 0)
 700                        cd->info.mask |= CDC_PLAY_AUDIO;
 701                if ((buffer[14] & 1) == 0)
 702                        cd->info.mask |= CDC_LOCK;
 703                if ((buffer[14] & 8) == 0)
 704                        cd->info.mask |= CDC_OPEN_TRAY;
 705                if ((buffer[14] >> 6) == 0)
 706                        cd->info.mask |= CDC_CLOSE_TRAY;
 707        }
 708}
 709
 710static int pcd_detect(void)
 711{
 712        char id[18];
 713        int k, unit;
 714        struct pcd_unit *cd;
 715
 716        printk("%s: %s version %s, major %d, nice %d\n",
 717               name, name, PCD_VERSION, major, nice);
 718
 719        par_drv = pi_register_driver(name);
 720        if (!par_drv) {
 721                pr_err("failed to register %s driver\n", name);
 722                return -1;
 723        }
 724
 725        k = 0;
 726        if (pcd_drive_count == 0) { /* nothing spec'd - so autoprobe for 1 */
 727                cd = pcd;
 728                if (cd->disk && pi_init(cd->pi, 1, -1, -1, -1, -1, -1,
 729                            pcd_buffer, PI_PCD, verbose, cd->name)) {
 730                        if (!pcd_probe(cd, -1, id)) {
 731                                cd->present = 1;
 732                                k++;
 733                        } else
 734                                pi_release(cd->pi);
 735                }
 736        } else {
 737                for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
 738                        int *conf = *drives[unit];
 739                        if (!conf[D_PRT])
 740                                continue;
 741                        if (!cd->disk)
 742                                continue;
 743                        if (!pi_init(cd->pi, 0, conf[D_PRT], conf[D_MOD],
 744                                     conf[D_UNI], conf[D_PRO], conf[D_DLY],
 745                                     pcd_buffer, PI_PCD, verbose, cd->name)) 
 746                                continue;
 747                        if (!pcd_probe(cd, conf[D_SLV], id)) {
 748                                cd->present = 1;
 749                                k++;
 750                        } else
 751                                pi_release(cd->pi);
 752                }
 753        }
 754        if (k)
 755                return 0;
 756
 757        printk("%s: No CD-ROM drive found\n", name);
 758        for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
 759                if (!cd->disk)
 760                        continue;
 761                blk_cleanup_disk(cd->disk);
 762                blk_mq_free_tag_set(&cd->tag_set);
 763        }
 764        pi_unregister_driver(par_drv);
 765        return -1;
 766}
 767
 768/* I/O request processing */
 769static int pcd_queue;
 770
 771static int set_next_request(void)
 772{
 773        struct pcd_unit *cd;
 774        int old_pos = pcd_queue;
 775
 776        do {
 777                cd = &pcd[pcd_queue];
 778                if (++pcd_queue == PCD_UNITS)
 779                        pcd_queue = 0;
 780                if (cd->present && !list_empty(&cd->rq_list)) {
 781                        pcd_req = list_first_entry(&cd->rq_list, struct request,
 782                                                        queuelist);
 783                        list_del_init(&pcd_req->queuelist);
 784                        blk_mq_start_request(pcd_req);
 785                        break;
 786                }
 787        } while (pcd_queue != old_pos);
 788
 789        return pcd_req != NULL;
 790}
 791
 792static void pcd_request(void)
 793{
 794        struct pcd_unit *cd;
 795
 796        if (pcd_busy)
 797                return;
 798
 799        if (!pcd_req && !set_next_request())
 800                return;
 801
 802        cd = pcd_req->rq_disk->private_data;
 803        if (cd != pcd_current)
 804                pcd_bufblk = -1;
 805        pcd_current = cd;
 806        pcd_sector = blk_rq_pos(pcd_req);
 807        pcd_count = blk_rq_cur_sectors(pcd_req);
 808        pcd_buf = bio_data(pcd_req->bio);
 809        pcd_busy = 1;
 810        ps_set_intr(do_pcd_read, NULL, 0, nice);
 811}
 812
 813static blk_status_t pcd_queue_rq(struct blk_mq_hw_ctx *hctx,
 814                                 const struct blk_mq_queue_data *bd)
 815{
 816        struct pcd_unit *cd = hctx->queue->queuedata;
 817
 818        if (rq_data_dir(bd->rq) != READ) {
 819                blk_mq_start_request(bd->rq);
 820                return BLK_STS_IOERR;
 821        }
 822
 823        spin_lock_irq(&pcd_lock);
 824        list_add_tail(&bd->rq->queuelist, &cd->rq_list);
 825        pcd_request();
 826        spin_unlock_irq(&pcd_lock);
 827
 828        return BLK_STS_OK;
 829}
 830
 831static inline void next_request(blk_status_t err)
 832{
 833        unsigned long saved_flags;
 834
 835        spin_lock_irqsave(&pcd_lock, saved_flags);
 836        if (!blk_update_request(pcd_req, err, blk_rq_cur_bytes(pcd_req))) {
 837                __blk_mq_end_request(pcd_req, err);
 838                pcd_req = NULL;
 839        }
 840        pcd_busy = 0;
 841        pcd_request();
 842        spin_unlock_irqrestore(&pcd_lock, saved_flags);
 843}
 844
 845static int pcd_ready(void)
 846{
 847        return (((status_reg(pcd_current) & (IDE_BUSY | IDE_DRQ)) == IDE_DRQ));
 848}
 849
 850static void pcd_transfer(void)
 851{
 852
 853        while (pcd_count && (pcd_sector / 4 == pcd_bufblk)) {
 854                int o = (pcd_sector % 4) * 512;
 855                memcpy(pcd_buf, pcd_buffer + o, 512);
 856                pcd_count--;
 857                pcd_buf += 512;
 858                pcd_sector++;
 859        }
 860}
 861
 862static void pcd_start(void)
 863{
 864        int b, i;
 865        char rd_cmd[12] = { 0xa8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 };
 866
 867        pcd_bufblk = pcd_sector / 4;
 868        b = pcd_bufblk;
 869        for (i = 0; i < 4; i++) {
 870                rd_cmd[5 - i] = b & 0xff;
 871                b = b >> 8;
 872        }
 873
 874        if (pcd_command(pcd_current, rd_cmd, 2048, "read block")) {
 875                pcd_bufblk = -1;
 876                next_request(BLK_STS_IOERR);
 877                return;
 878        }
 879
 880        mdelay(1);
 881
 882        ps_set_intr(do_pcd_read_drq, pcd_ready, PCD_TMO, nice);
 883}
 884
 885static void do_pcd_read(void)
 886{
 887        pcd_busy = 1;
 888        pcd_retries = 0;
 889        pcd_transfer();
 890        if (!pcd_count) {
 891                next_request(0);
 892                return;
 893        }
 894
 895        pi_do_claimed(pcd_current->pi, pcd_start);
 896}
 897
 898static void do_pcd_read_drq(void)
 899{
 900        unsigned long saved_flags;
 901
 902        if (pcd_completion(pcd_current, pcd_buffer, "read block")) {
 903                if (pcd_retries < PCD_RETRIES) {
 904                        mdelay(1);
 905                        pcd_retries++;
 906                        pi_do_claimed(pcd_current->pi, pcd_start);
 907                        return;
 908                }
 909                pcd_bufblk = -1;
 910                next_request(BLK_STS_IOERR);
 911                return;
 912        }
 913
 914        do_pcd_read();
 915        spin_lock_irqsave(&pcd_lock, saved_flags);
 916        pcd_request();
 917        spin_unlock_irqrestore(&pcd_lock, saved_flags);
 918}
 919
 920/* the audio_ioctl stuff is adapted from sr_ioctl.c */
 921
 922static int pcd_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
 923{
 924        struct pcd_unit *cd = cdi->handle;
 925
 926        switch (cmd) {
 927
 928        case CDROMREADTOCHDR:
 929
 930                {
 931                        char cmd[12] =
 932                            { GPCMD_READ_TOC_PMA_ATIP, 0, 0, 0, 0, 0, 0, 0, 12,
 933                         0, 0, 0 };
 934                        struct cdrom_tochdr *tochdr =
 935                            (struct cdrom_tochdr *) arg;
 936                        char buffer[32];
 937                        int r;
 938
 939                        r = pcd_atapi(cd, cmd, 12, buffer, "read toc header");
 940
 941                        tochdr->cdth_trk0 = buffer[2];
 942                        tochdr->cdth_trk1 = buffer[3];
 943
 944                        return r ? -EIO : 0;
 945                }
 946
 947        case CDROMREADTOCENTRY:
 948
 949                {
 950                        char cmd[12] =
 951                            { GPCMD_READ_TOC_PMA_ATIP, 0, 0, 0, 0, 0, 0, 0, 12,
 952                         0, 0, 0 };
 953
 954                        struct cdrom_tocentry *tocentry =
 955                            (struct cdrom_tocentry *) arg;
 956                        unsigned char buffer[32];
 957                        int r;
 958
 959                        cmd[1] =
 960                            (tocentry->cdte_format == CDROM_MSF ? 0x02 : 0);
 961                        cmd[6] = tocentry->cdte_track;
 962
 963                        r = pcd_atapi(cd, cmd, 12, buffer, "read toc entry");
 964
 965                        tocentry->cdte_ctrl = buffer[5] & 0xf;
 966                        tocentry->cdte_adr = buffer[5] >> 4;
 967                        tocentry->cdte_datamode =
 968                            (tocentry->cdte_ctrl & 0x04) ? 1 : 0;
 969                        if (tocentry->cdte_format == CDROM_MSF) {
 970                                tocentry->cdte_addr.msf.minute = buffer[9];
 971                                tocentry->cdte_addr.msf.second = buffer[10];
 972                                tocentry->cdte_addr.msf.frame = buffer[11];
 973                        } else
 974                                tocentry->cdte_addr.lba =
 975                                    (((((buffer[8] << 8) + buffer[9]) << 8)
 976                                      + buffer[10]) << 8) + buffer[11];
 977
 978                        return r ? -EIO : 0;
 979                }
 980
 981        default:
 982
 983                return -ENOSYS;
 984        }
 985}
 986
 987static int pcd_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
 988{
 989        char cmd[12] =
 990            { GPCMD_READ_SUBCHANNEL, 0, 0x40, 2, 0, 0, 0, 0, 24, 0, 0, 0 };
 991        char buffer[32];
 992
 993        if (pcd_atapi(cdi->handle, cmd, 24, buffer, "get mcn"))
 994                return -EIO;
 995
 996        memcpy(mcn->medium_catalog_number, buffer + 9, 13);
 997        mcn->medium_catalog_number[13] = 0;
 998
 999        return 0;
1000}
1001
1002static int __init pcd_init(void)
1003{
1004        struct pcd_unit *cd;
1005        int unit;
1006
1007        if (disable)
1008                return -EINVAL;
1009
1010        pcd_init_units();
1011
1012        if (pcd_detect())
1013                return -ENODEV;
1014
1015        /* get the atapi capabilities page */
1016        pcd_probe_capabilities();
1017
1018        if (register_blkdev(major, name)) {
1019                for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
1020                        if (!cd->disk)
1021                                continue;
1022
1023                        blk_cleanup_queue(cd->disk->queue);
1024                        blk_mq_free_tag_set(&cd->tag_set);
1025                        put_disk(cd->disk);
1026                }
1027                return -EBUSY;
1028        }
1029
1030        for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
1031                if (cd->present) {
1032                        register_cdrom(cd->disk, &cd->info);
1033                        cd->disk->private_data = cd;
1034                        add_disk(cd->disk);
1035                }
1036        }
1037
1038        return 0;
1039}
1040
1041static void __exit pcd_exit(void)
1042{
1043        struct pcd_unit *cd;
1044        int unit;
1045
1046        for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
1047                if (!cd->disk)
1048                        continue;
1049
1050                if (cd->present) {
1051                        del_gendisk(cd->disk);
1052                        pi_release(cd->pi);
1053                        unregister_cdrom(&cd->info);
1054                }
1055                blk_cleanup_queue(cd->disk->queue);
1056                blk_mq_free_tag_set(&cd->tag_set);
1057                put_disk(cd->disk);
1058        }
1059        unregister_blkdev(major, name);
1060        pi_unregister_driver(par_drv);
1061}
1062
1063MODULE_LICENSE("GPL");
1064module_init(pcd_init)
1065module_exit(pcd_exit)
1066