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        check_disk_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 = alloc_disk(1);
 313
 314                if (!disk)
 315                        continue;
 316
 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;
 323                }
 324
 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++;
 336
 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;
 350        }
 351}
 352
 353static int pcd_open(struct cdrom_device_info *cdi, int purpose)
 354{
 355        struct pcd_unit *cd = cdi->handle;
 356        if (!cd->present)
 357                return -ENODEV;
 358        return 0;
 359}
 360
 361static void pcd_release(struct cdrom_device_info *cdi)
 362{
 363}
 364
 365static inline int status_reg(struct pcd_unit *cd)
 366{
 367        return pi_read_regr(cd->pi, 1, 6);
 368}
 369
 370static inline int read_reg(struct pcd_unit *cd, int reg)
 371{
 372        return pi_read_regr(cd->pi, 0, reg);
 373}
 374
 375static inline void write_reg(struct pcd_unit *cd, int reg, int val)
 376{
 377        pi_write_regr(cd->pi, 0, reg, val);
 378}
 379
 380static int pcd_wait(struct pcd_unit *cd, int go, int stop, char *fun, char *msg)
 381{
 382        int j, r, e, s, p;
 383
 384        j = 0;
 385        while ((((r = status_reg(cd)) & go) || (stop && (!(r & stop))))
 386               && (j++ < PCD_SPIN))
 387                udelay(PCD_DELAY);
 388
 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;
 400        }
 401        return 0;
 402}
 403
 404static int pcd_command(struct pcd_unit *cd, char *cmd, int dlen, char *fun)
 405{
 406        pi_connect(cd->pi);
 407
 408        write_reg(cd, 6, 0xa0 + 0x10 * cd->drive);
 409
 410        if (pcd_wait(cd, IDE_BUSY | IDE_DRQ, 0, fun, "before command")) {
 411                pi_disconnect(cd->pi);
 412                return -1;
 413        }
 414
 415        write_reg(cd, 4, dlen % 256);
 416        write_reg(cd, 5, dlen / 256);
 417        write_reg(cd, 7, 0xa0); /* ATAPI packet command */
 418
 419        if (pcd_wait(cd, IDE_BUSY, IDE_DRQ, fun, "command DRQ")) {
 420                pi_disconnect(cd->pi);
 421                return -1;
 422        }
 423
 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;
 428        }
 429
 430        pi_write_block(cd->pi, cmd, 12);
 431
 432        return 0;
 433}
 434
 435static int pcd_completion(struct pcd_unit *cd, char *buf, char *fun)
 436{
 437        int r, d, p, n, k, j;
 438
 439        r = -1;
 440        k = 0;
 441        j = 0;
 442
 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;
 450
 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);
 468                        }
 469                        if (k++ > PCD_TMO) {
 470                                printk("%s: Stuck DRQ\n", cd->name);
 471                                break;
 472                        }
 473                        if (pcd_wait
 474                            (cd, IDE_BUSY, IDE_DRQ | IDE_READY | IDE_ERR, fun,
 475                             "completion")) {
 476                                r = -1;
 477                                break;
 478                        }
 479                }
 480        }
 481
 482        pi_disconnect(cd->pi);
 483
 484        return r;
 485}
 486
 487static void pcd_req_sense(struct pcd_unit *cd, char *fun)
 488{
 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;
 492
 493        r = pcd_command(cd, rs_cmd, 16, "Request sense");
 494        mdelay(1);
 495        if (!r)
 496                pcd_completion(cd, buf, "Request sense");
 497
 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);
 507        }
 508        if ((c == 2) || (c == 6))
 509                cd->changed = 1;
 510}
 511
 512static int pcd_atapi(struct pcd_unit *cd, char *cmd, int dlen, char *buf, char *fun)
 513{
 514        int r;
 515
 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);
 522
 523        return r;
 524}
 525
 526static int pcd_packet(struct cdrom_device_info *cdi, struct packet_command *cgc)
 527{
 528        return pcd_atapi(cdi->handle, cgc->cmd, cgc->buflen, cgc->buffer,
 529                         "generic packet");
 530}
 531
 532#define DBMSG(msg)      ((verbose>1)?(msg):NULL)
 533
 534static unsigned int pcd_check_events(struct cdrom_device_info *cdi,
 535                                     unsigned int clearing, int slot_nr)
 536{
 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;
 542}
 543
 544static int pcd_lock_door(struct cdrom_device_info *cdi, int lock)
 545{
 546        char un_cmd[12] = { 0x1e, 0, 0, 0, lock, 0, 0, 0, 0, 0, 0, 0 };
 547
 548        return pcd_atapi(cdi->handle, un_cmd, 0, pcd_scratch,
 549                         lock ? "lock door" : "unlock door");
 550}
 551
 552static int pcd_tray_move(struct cdrom_device_info *cdi, int position)
 553{
 554        char ej_cmd[12] = { 0x1b, 0, 0, 0, 3 - position, 0, 0, 0, 0, 0, 0, 0 };
 555
 556        return pcd_atapi(cdi->handle, ej_cmd, 0, pcd_scratch,
 557                         position ? "eject" : "close tray");
 558}
 559
 560static void pcd_sleep(int cs)
 561{
 562        schedule_timeout_interruptible(cs);
 563}
 564
 565static int pcd_reset(struct pcd_unit *cd)
 566{
 567        int i, k, flg;
 568        int expect[5] = { 1, 1, 1, 0x14, 0xeb };
 569
 570        pi_connect(cd->pi);
 571        write_reg(cd, 6, 0xa0 + 0x10 * cd->drive);
 572        write_reg(cd, 7, 8);
 573
 574        pcd_sleep(20 * HZ / 1000);      /* delay a bit */
 575
 576        k = 0;
 577        while ((k++ < PCD_RESET_TMO) && (status_reg(cd) & IDE_BUSY))
 578                pcd_sleep(HZ / 10);
 579
 580        flg = 1;
 581        for (i = 0; i < 5; i++)
 582                flg &= (read_reg(cd, i + 1) == expect[i]);
 583
 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");
 591        }
 592
 593        pi_disconnect(cd->pi);
 594        return flg - 1;
 595}
 596
 597static int pcd_drive_reset(struct cdrom_device_info *cdi)
 598{
 599        return pcd_reset(cdi->handle);
 600}
 601
 602static int pcd_ready_wait(struct pcd_unit *cd, int tmo)
 603{
 604        char tr_cmd[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 605        int k, p;
 606
 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);
 618        }
 619        return 0x000020;        /* timeout */
 620}
 621
 622static int pcd_drive_status(struct cdrom_device_info *cdi, int slot_nr)
 623{
 624        char rc_cmd[12] = { 0x25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 625        struct pcd_unit *cd = cdi->handle;
 626
 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;
 632}
 633
 634static int pcd_identify(struct pcd_unit *cd, char *id)
 635{
 636        int k, s;
 637        char id_cmd[12] = { 0x12, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
 638
 639        pcd_bufblk = -1;
 640
 641        s = pcd_atapi(cd, id_cmd, 36, pcd_buffer, "identify");
 642
 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;
 650        }
 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--;
 657        }
 658
 659        printk("%s: %s: %s\n", cd->name, cd->drive ? "Slave" : "Master", id);
 660
 661        return 0;
 662}
 663
 664/*
 665 * returns  0, with id set if drive is detected
 666 *          -1, if drive detection failed
 667 */
 668static int pcd_probe(struct pcd_unit *cd, int ms, char *id)
 669{
 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;
 678        }
 679        return -1;
 680}
 681
 682static void pcd_probe_capabilities(void)
 683{
 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;
 688
 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;
 708        }
 709}
 710
 711static int pcd_detect(void)
 712{
 713        char id[18];
 714        int k, unit;
 715        struct pcd_unit *cd;
 716
 717        printk("%s: %s version %s, major %d, nice %d\n",
 718               name, name, PCD_VERSION, major, nice);
 719
 720        par_drv = pi_register_driver(name);
 721        if (!par_drv) {
 722                pr_err("failed to register %s driver\n", name);
 723                return -1;
 724        }
 725
 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);
 736                }
 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);
 753                }
 754        }
 755        if (k)
 756                return 0;
 757
 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);
 766        }
 767        pi_unregister_driver(par_drv);
 768        return -1;
 769}
 770
 771/* I/O request processing */
 772static int pcd_queue;
 773
 774static int set_next_request(void)
 775{
 776        struct pcd_unit *cd;
 777        int old_pos = pcd_queue;
 778
 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;
 789                }
 790        } while (pcd_queue != old_pos);
 791
 792        return pcd_req != NULL;
 793}
 794
 795static void pcd_request(void)
 796{
 797        struct pcd_unit *cd;
 798
 799        if (pcd_busy)
 800                return;
 801
 802        if (!pcd_req && !set_next_request())
 803                return;
 804
 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);
 814}
 815
 816static blk_status_t pcd_queue_rq(struct blk_mq_hw_ctx *hctx,
 817                                 const struct blk_mq_queue_data *bd)
 818{
 819        struct pcd_unit *cd = hctx->queue->queuedata;
 820
 821        if (rq_data_dir(bd->rq) != READ) {
 822                blk_mq_start_request(bd->rq);
 823                return BLK_STS_IOERR;
 824        }
 825
 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);
 830
 831        return BLK_STS_OK;
 832}
 833
 834static inline void next_request(blk_status_t err)
 835{
 836        unsigned long saved_flags;
 837
 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;
 842        }
 843        pcd_busy = 0;
 844        pcd_request();
 845        spin_unlock_irqrestore(&pcd_lock, saved_flags);
 846}
 847
 848static int pcd_ready(void)
 849{
 850        return (((status_reg(pcd_current) & (IDE_BUSY | IDE_DRQ)) == IDE_DRQ));
 851}
 852
 853static void pcd_transfer(void)
 854{
 855
 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++;
 862        }
 863}
 864
 865static void pcd_start(void)
 866{
 867        int b, i;
 868        char rd_cmd[12] = { 0xa8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 };
 869
 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;
 875        }
 876
 877        if (pcd_command(pcd_current, rd_cmd, 2048, "read block")) {
 878                pcd_bufblk = -1;
 879                next_request(BLK_STS_IOERR);
 880                return;
 881        }
 882
 883        mdelay(1);
 884
 885        ps_set_intr(do_pcd_read_drq, pcd_ready, PCD_TMO, nice);
 886}
 887
 888static void do_pcd_read(void)
 889{
 890        pcd_busy = 1;
 891        pcd_retries = 0;
 892        pcd_transfer();
 893        if (!pcd_count) {
 894                next_request(0);
 895                return;
 896        }
 897
 898        pi_do_claimed(pcd_current->pi, pcd_start);
 899}
 900
 901static void do_pcd_read_drq(void)
 902{
 903        unsigned long saved_flags;
 904
 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;
 911                }
 912                pcd_bufblk = -1;
 913                next_request(BLK_STS_IOERR);
 914                return;
 915        }
 916
 917        do_pcd_read();
 918        spin_lock_irqsave(&pcd_lock, saved_flags);
 919        pcd_request();
 920        spin_unlock_irqrestore(&pcd_lock, saved_flags);
 921}
 922
 923/* the audio_ioctl stuff is adapted from sr_ioctl.c */
 924
 925static int pcd_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
 926{
 927        struct pcd_unit *cd = cdi->handle;
 928
 929        switch (cmd) {
 930
 931        case CDROMREADTOCHDR:
 932
 933                {
 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;
 941
 942                        r = pcd_atapi(cd, cmd, 12, buffer, "read toc header");
 943
 944                        tochdr->cdth_trk0 = buffer[2];
 945                        tochdr->cdth_trk1 = buffer[3];
 946
 947                        return r ? -EIO : 0;
 948                }
 949
 950        case CDROMREADTOCENTRY:
 951
 952                {
 953                        char cmd[12] =
 954                            { GPCMD_READ_TOC_PMA_ATIP, 0, 0, 0, 0, 0, 0, 0, 12,
 955                         0, 0, 0 };
 956
 957                        struct cdrom_tocentry *tocentry =
 958                            (struct cdrom_tocentry *) arg;
 959                        unsigned char buffer[32];
 960                        int r;
 961
 962                        cmd[1] =
 963                            (tocentry->cdte_format == CDROM_MSF ? 0x02 : 0);
 964                        cmd[6] = tocentry->cdte_track;
 965
 966                        r = pcd_atapi(cd, cmd, 12, buffer, "read toc entry");
 967
 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];
 980
 981                        return r ? -EIO : 0;
 982                }
 983
 984        default:
 985
 986                return -ENOSYS;
 987        }
 988}
 989
 990static int pcd_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
 991{
 992        char cmd[12] =
 993            { GPCMD_READ_SUBCHANNEL, 0, 0x40, 2, 0, 0, 0, 0, 24, 0, 0, 0 };
 994        char buffer[32];
 995
 996        if (pcd_atapi(cdi->handle, cmd, 24, buffer, "get mcn"))
 997                return -EIO;
 998
 999        memcpy(mcn->medium_catalog_number, buffer + 9, 13);
1000        mcn->medium_catalog_number[13] = 0;
1001
1002        return 0;
1003}
1004
1005static int __init pcd_init(void)
1006{
1007        struct pcd_unit *cd;
1008        int unit;
1009
1010        if (disable)
1011                return -EINVAL;
1012
1013        pcd_init_units();
1014
1015        if (pcd_detect())
1016                return -ENODEV;
1017
1018        /* get the atapi capabilities page */
1019        pcd_probe_capabilities();
1020
1021        if (register_blkdev(major, name)) {
1022                for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
1023                        if (!cd->disk)
1024                                continue;
1025
1026                        blk_cleanup_queue(cd->disk->queue);
1027                        blk_mq_free_tag_set(&cd->tag_set);
1028                        put_disk(cd->disk);
1029                }
1030                return -EBUSY;
1031        }
1032
1033        for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
1034                if (cd->present) {
1035                        register_cdrom(cd->disk, &cd->info);
1036                        cd->disk->private_data = cd;
1037                        add_disk(cd->disk);
1038                }
1039        }
1040
1041        return 0;
1042}
1043
1044static void __exit pcd_exit(void)
1045{
1046        struct pcd_unit *cd;
1047        int unit;
1048
1049        for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
1050                if (!cd->disk)
1051                        continue;
1052
1053                if (cd->present) {
1054                        del_gendisk(cd->disk);
1055                        pi_release(cd->pi);
1056                        unregister_cdrom(&cd->info);
1057                }
1058                blk_cleanup_queue(cd->disk->queue);
1059                blk_mq_free_tag_set(&cd->tag_set);
1060                put_disk(cd->disk);
1061        }
1062        unregister_blkdev(major, name);
1063        pi_unregister_driver(par_drv);
1064}
1065
1066MODULE_LICENSE("GPL");
1067module_init(pcd_init)
1068module_exit(pcd_exit)
1069