linux/drivers/block/paride/pf.c
<<
>>
Prefs
   1/* 
   2        pf.c    (c) 1997-8  Grant R. Guenther <grant@torque.net>
   3                            Under the terms of the GNU General Public License.
   4
   5        This is the high-level driver for parallel port ATAPI disk
   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 disk drive, but if their individual parameters are
  10        specified, the driver can handle up to 4 drives.
  11
  12        The behaviour of the pf 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-7 integers as follows:
  18            drive2
  19            drive3      <prt>,<pro>,<uni>,<mod>,<slv>,<lun>,<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 CDroms 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                <lun>   Some ATAPI devices support multiple LUNs.
  47                        One example is the ATAPI PD/CD drive from
  48                        Matshita/Panasonic.  This device has a 
  49                        CD drive on LUN 0 and a PD drive on LUN 1.
  50                        By default, the driver will search for the
  51                        first LUN with a supported device.  Set 
  52                        this parameter to force it to use a specific
  53                        LUN.  (default -1)
  54
  55                <dly>   some parallel ports require the driver to 
  56                        go more slowly.  -1 sets a default value that
  57                        should work with the chosen protocol.  Otherwise,
  58                        set this to a small integer, the larger it is
  59                        the slower the port i/o.  In some cases, setting
  60                        this to zero will speed up the device. (default -1)
  61
  62            major       You may use this parameter to overide the
  63                        default major number (47) that this driver
  64                        will use.  Be sure to change the device
  65                        name as well.
  66
  67            name        This parameter is a character string that
  68                        contains the name the kernel will use for this
  69                        device (in /proc output, for instance).
  70                        (default "pf").
  71
  72            cluster     The driver will attempt to aggregate requests
  73                        for adjacent blocks into larger multi-block
  74                        clusters.  The maximum cluster size (in 512
  75                        byte sectors) is set with this parameter.
  76                        (default 64)
  77
  78            verbose     This parameter controls the amount of logging
  79                        that the driver will do.  Set it to 0 for
  80                        normal operation, 1 to see autoprobe progress
  81                        messages, or 2 to see additional debugging
  82                        output.  (default 0)
  83 
  84            nice        This parameter controls the driver's use of
  85                        idle CPU time, at the expense of some speed.
  86
  87        If this driver is built into the kernel, you can use the
  88        following command line parameters, with the same values
  89        as the corresponding module parameters listed above:
  90
  91            pf.drive0
  92            pf.drive1
  93            pf.drive2
  94            pf.drive3
  95            pf.cluster
  96            pf.nice
  97
  98        In addition, you can use the parameter pf.disable to disable
  99        the driver entirely.
 100
 101*/
 102
 103/* Changes:
 104
 105        1.01    GRG 1998.05.03  Changes for SMP.  Eliminate sti().
 106                                Fix for drives that don't clear STAT_ERR
 107                                until after next CDB delivered.
 108                                Small change in pf_completion to round
 109                                up transfer size.
 110        1.02    GRG 1998.06.16  Eliminated an Ugh
 111        1.03    GRG 1998.08.16  Use HZ in loop timings, extra debugging
 112        1.04    GRG 1998.09.24  Added jumbo support
 113
 114*/
 115
 116#define PF_VERSION      "1.04"
 117#define PF_MAJOR        47
 118#define PF_NAME         "pf"
 119#define PF_UNITS        4
 120
 121#include <linux/types.h>
 122
 123/* Here are things one can override from the insmod command.
 124   Most are autoprobed by paride unless set here.  Verbose is off
 125   by default.
 126
 127*/
 128
 129static bool verbose = 0;
 130static int major = PF_MAJOR;
 131static char *name = PF_NAME;
 132static int cluster = 64;
 133static int nice = 0;
 134static int disable = 0;
 135
 136static int drive0[7] = { 0, 0, 0, -1, -1, -1, -1 };
 137static int drive1[7] = { 0, 0, 0, -1, -1, -1, -1 };
 138static int drive2[7] = { 0, 0, 0, -1, -1, -1, -1 };
 139static int drive3[7] = { 0, 0, 0, -1, -1, -1, -1 };
 140
 141static int (*drives[4])[7] = {&drive0, &drive1, &drive2, &drive3};
 142static int pf_drive_count;
 143
 144enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_LUN, D_DLY};
 145
 146/* end of parameters */
 147
 148#include <linux/module.h>
 149#include <linux/init.h>
 150#include <linux/fs.h>
 151#include <linux/delay.h>
 152#include <linux/hdreg.h>
 153#include <linux/cdrom.h>
 154#include <linux/spinlock.h>
 155#include <linux/blkdev.h>
 156#include <linux/blkpg.h>
 157#include <linux/mutex.h>
 158#include <asm/uaccess.h>
 159
 160static DEFINE_MUTEX(pf_mutex);
 161static DEFINE_SPINLOCK(pf_spin_lock);
 162
 163module_param(verbose, bool, 0644);
 164module_param(major, int, 0);
 165module_param(name, charp, 0);
 166module_param(cluster, int, 0);
 167module_param(nice, int, 0);
 168module_param_array(drive0, int, NULL, 0);
 169module_param_array(drive1, int, NULL, 0);
 170module_param_array(drive2, int, NULL, 0);
 171module_param_array(drive3, int, NULL, 0);
 172
 173#include "paride.h"
 174#include "pseudo.h"
 175
 176/* constants for faking geometry numbers */
 177
 178#define PF_FD_MAX       8192    /* use FD geometry under this size */
 179#define PF_FD_HDS       2
 180#define PF_FD_SPT       18
 181#define PF_HD_HDS       64
 182#define PF_HD_SPT       32
 183
 184#define PF_MAX_RETRIES  5
 185#define PF_TMO          800     /* interrupt timeout in jiffies */
 186#define PF_SPIN_DEL     50      /* spin delay in micro-seconds  */
 187
 188#define PF_SPIN         (1000000*PF_TMO)/(HZ*PF_SPIN_DEL)
 189
 190#define STAT_ERR        0x00001
 191#define STAT_INDEX      0x00002
 192#define STAT_ECC        0x00004
 193#define STAT_DRQ        0x00008
 194#define STAT_SEEK       0x00010
 195#define STAT_WRERR      0x00020
 196#define STAT_READY      0x00040
 197#define STAT_BUSY       0x00080
 198
 199#define ATAPI_REQ_SENSE         0x03
 200#define ATAPI_LOCK              0x1e
 201#define ATAPI_DOOR              0x1b
 202#define ATAPI_MODE_SENSE        0x5a
 203#define ATAPI_CAPACITY          0x25
 204#define ATAPI_IDENTIFY          0x12
 205#define ATAPI_READ_10           0x28
 206#define ATAPI_WRITE_10          0x2a
 207
 208static int pf_open(struct block_device *bdev, fmode_t mode);
 209static void do_pf_request(struct request_queue * q);
 210static int pf_ioctl(struct block_device *bdev, fmode_t mode,
 211                    unsigned int cmd, unsigned long arg);
 212static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo);
 213
 214static void pf_release(struct gendisk *disk, fmode_t mode);
 215
 216static int pf_detect(void);
 217static void do_pf_read(void);
 218static void do_pf_read_start(void);
 219static void do_pf_write(void);
 220static void do_pf_write_start(void);
 221static void do_pf_read_drq(void);
 222static void do_pf_write_done(void);
 223
 224#define PF_NM           0
 225#define PF_RO           1
 226#define PF_RW           2
 227
 228#define PF_NAMELEN      8
 229
 230struct pf_unit {
 231        struct pi_adapter pia;  /* interface to paride layer */
 232        struct pi_adapter *pi;
 233        int removable;          /* removable media device  ?  */
 234        int media_status;       /* media present ?  WP ? */
 235        int drive;              /* drive */
 236        int lun;
 237        int access;             /* count of active opens ... */
 238        int present;            /* device present ? */
 239        char name[PF_NAMELEN];  /* pf0, pf1, ... */
 240        struct gendisk *disk;
 241};
 242
 243static struct pf_unit units[PF_UNITS];
 244
 245static int pf_identify(struct pf_unit *pf);
 246static void pf_lock(struct pf_unit *pf, int func);
 247static void pf_eject(struct pf_unit *pf);
 248static unsigned int pf_check_events(struct gendisk *disk,
 249                                    unsigned int clearing);
 250
 251static char pf_scratch[512];    /* scratch block buffer */
 252
 253/* the variables below are used mainly in the I/O request engine, which
 254   processes only one request at a time.
 255*/
 256
 257static int pf_retries = 0;      /* i/o error retry count */
 258static int pf_busy = 0;         /* request being processed ? */
 259static struct request *pf_req;  /* current request */
 260static int pf_block;            /* address of next requested block */
 261static int pf_count;            /* number of blocks still to do */
 262static int pf_run;              /* sectors in current cluster */
 263static int pf_cmd;              /* current command READ/WRITE */
 264static struct pf_unit *pf_current;/* unit of current request */
 265static int pf_mask;             /* stopper for pseudo-int */
 266static char *pf_buf;            /* buffer for request in progress */
 267
 268/* kernel glue structures */
 269
 270static const struct block_device_operations pf_fops = {
 271        .owner          = THIS_MODULE,
 272        .open           = pf_open,
 273        .release        = pf_release,
 274        .ioctl          = pf_ioctl,
 275        .getgeo         = pf_getgeo,
 276        .check_events   = pf_check_events,
 277};
 278
 279static void __init pf_init_units(void)
 280{
 281        struct pf_unit *pf;
 282        int unit;
 283
 284        pf_drive_count = 0;
 285        for (unit = 0, pf = units; unit < PF_UNITS; unit++, pf++) {
 286                struct gendisk *disk = alloc_disk(1);
 287                if (!disk)
 288                        continue;
 289                pf->disk = disk;
 290                pf->pi = &pf->pia;
 291                pf->media_status = PF_NM;
 292                pf->drive = (*drives[unit])[D_SLV];
 293                pf->lun = (*drives[unit])[D_LUN];
 294                snprintf(pf->name, PF_NAMELEN, "%s%d", name, unit);
 295                disk->major = major;
 296                disk->first_minor = unit;
 297                strcpy(disk->disk_name, pf->name);
 298                disk->fops = &pf_fops;
 299                if (!(*drives[unit])[D_PRT])
 300                        pf_drive_count++;
 301        }
 302}
 303
 304static int pf_open(struct block_device *bdev, fmode_t mode)
 305{
 306        struct pf_unit *pf = bdev->bd_disk->private_data;
 307        int ret;
 308
 309        mutex_lock(&pf_mutex);
 310        pf_identify(pf);
 311
 312        ret = -ENODEV;
 313        if (pf->media_status == PF_NM)
 314                goto out;
 315
 316        ret = -EROFS;
 317        if ((pf->media_status == PF_RO) && (mode & FMODE_WRITE))
 318                goto out;
 319
 320        ret = 0;
 321        pf->access++;
 322        if (pf->removable)
 323                pf_lock(pf, 1);
 324out:
 325        mutex_unlock(&pf_mutex);
 326        return ret;
 327}
 328
 329static int pf_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 330{
 331        struct pf_unit *pf = bdev->bd_disk->private_data;
 332        sector_t capacity = get_capacity(pf->disk);
 333
 334        if (capacity < PF_FD_MAX) {
 335                geo->cylinders = sector_div(capacity, PF_FD_HDS * PF_FD_SPT);
 336                geo->heads = PF_FD_HDS;
 337                geo->sectors = PF_FD_SPT;
 338        } else {
 339                geo->cylinders = sector_div(capacity, PF_HD_HDS * PF_HD_SPT);
 340                geo->heads = PF_HD_HDS;
 341                geo->sectors = PF_HD_SPT;
 342        }
 343
 344        return 0;
 345}
 346
 347static int pf_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
 348{
 349        struct pf_unit *pf = bdev->bd_disk->private_data;
 350
 351        if (cmd != CDROMEJECT)
 352                return -EINVAL;
 353
 354        if (pf->access != 1)
 355                return -EBUSY;
 356        mutex_lock(&pf_mutex);
 357        pf_eject(pf);
 358        mutex_unlock(&pf_mutex);
 359
 360        return 0;
 361}
 362
 363static void pf_release(struct gendisk *disk, fmode_t mode)
 364{
 365        struct pf_unit *pf = disk->private_data;
 366
 367        mutex_lock(&pf_mutex);
 368        if (pf->access <= 0) {
 369                mutex_unlock(&pf_mutex);
 370                WARN_ON(1);
 371                return;
 372        }
 373
 374        pf->access--;
 375
 376        if (!pf->access && pf->removable)
 377                pf_lock(pf, 0);
 378
 379        mutex_unlock(&pf_mutex);
 380}
 381
 382static unsigned int pf_check_events(struct gendisk *disk, unsigned int clearing)
 383{
 384        return DISK_EVENT_MEDIA_CHANGE;
 385}
 386
 387static inline int status_reg(struct pf_unit *pf)
 388{
 389        return pi_read_regr(pf->pi, 1, 6);
 390}
 391
 392static inline int read_reg(struct pf_unit *pf, int reg)
 393{
 394        return pi_read_regr(pf->pi, 0, reg);
 395}
 396
 397static inline void write_reg(struct pf_unit *pf, int reg, int val)
 398{
 399        pi_write_regr(pf->pi, 0, reg, val);
 400}
 401
 402static int pf_wait(struct pf_unit *pf, int go, int stop, char *fun, char *msg)
 403{
 404        int j, r, e, s, p;
 405
 406        j = 0;
 407        while ((((r = status_reg(pf)) & go) || (stop && (!(r & stop))))
 408               && (j++ < PF_SPIN))
 409                udelay(PF_SPIN_DEL);
 410
 411        if ((r & (STAT_ERR & stop)) || (j > PF_SPIN)) {
 412                s = read_reg(pf, 7);
 413                e = read_reg(pf, 1);
 414                p = read_reg(pf, 2);
 415                if (j > PF_SPIN)
 416                        e |= 0x100;
 417                if (fun)
 418                        printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"
 419                               " loop=%d phase=%d\n",
 420                               pf->name, fun, msg, r, s, e, j, p);
 421                return (e << 8) + s;
 422        }
 423        return 0;
 424}
 425
 426static int pf_command(struct pf_unit *pf, char *cmd, int dlen, char *fun)
 427{
 428        pi_connect(pf->pi);
 429
 430        write_reg(pf, 6, 0xa0+0x10*pf->drive);
 431
 432        if (pf_wait(pf, STAT_BUSY | STAT_DRQ, 0, fun, "before command")) {
 433                pi_disconnect(pf->pi);
 434                return -1;
 435        }
 436
 437        write_reg(pf, 4, dlen % 256);
 438        write_reg(pf, 5, dlen / 256);
 439        write_reg(pf, 7, 0xa0); /* ATAPI packet command */
 440
 441        if (pf_wait(pf, STAT_BUSY, STAT_DRQ, fun, "command DRQ")) {
 442                pi_disconnect(pf->pi);
 443                return -1;
 444        }
 445
 446        if (read_reg(pf, 2) != 1) {
 447                printk("%s: %s: command phase error\n", pf->name, fun);
 448                pi_disconnect(pf->pi);
 449                return -1;
 450        }
 451
 452        pi_write_block(pf->pi, cmd, 12);
 453
 454        return 0;
 455}
 456
 457static int pf_completion(struct pf_unit *pf, char *buf, char *fun)
 458{
 459        int r, s, n;
 460
 461        r = pf_wait(pf, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
 462                    fun, "completion");
 463
 464        if ((read_reg(pf, 2) & 2) && (read_reg(pf, 7) & STAT_DRQ)) {
 465                n = (((read_reg(pf, 4) + 256 * read_reg(pf, 5)) +
 466                      3) & 0xfffc);
 467                pi_read_block(pf->pi, buf, n);
 468        }
 469
 470        s = pf_wait(pf, STAT_BUSY, STAT_READY | STAT_ERR, fun, "data done");
 471
 472        pi_disconnect(pf->pi);
 473
 474        return (r ? r : s);
 475}
 476
 477static void pf_req_sense(struct pf_unit *pf, int quiet)
 478{
 479        char rs_cmd[12] =
 480            { ATAPI_REQ_SENSE, pf->lun << 5, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
 481        char buf[16];
 482        int r;
 483
 484        r = pf_command(pf, rs_cmd, 16, "Request sense");
 485        mdelay(1);
 486        if (!r)
 487                pf_completion(pf, buf, "Request sense");
 488
 489        if ((!r) && (!quiet))
 490                printk("%s: Sense key: %x, ASC: %x, ASQ: %x\n",
 491                       pf->name, buf[2] & 0xf, buf[12], buf[13]);
 492}
 493
 494static int pf_atapi(struct pf_unit *pf, char *cmd, int dlen, char *buf, char *fun)
 495{
 496        int r;
 497
 498        r = pf_command(pf, cmd, dlen, fun);
 499        mdelay(1);
 500        if (!r)
 501                r = pf_completion(pf, buf, fun);
 502        if (r)
 503                pf_req_sense(pf, !fun);
 504
 505        return r;
 506}
 507
 508static void pf_lock(struct pf_unit *pf, int func)
 509{
 510        char lo_cmd[12] = { ATAPI_LOCK, pf->lun << 5, 0, 0, func, 0, 0, 0, 0, 0, 0, 0 };
 511
 512        pf_atapi(pf, lo_cmd, 0, pf_scratch, func ? "lock" : "unlock");
 513}
 514
 515static void pf_eject(struct pf_unit *pf)
 516{
 517        char ej_cmd[12] = { ATAPI_DOOR, pf->lun << 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 };
 518
 519        pf_lock(pf, 0);
 520        pf_atapi(pf, ej_cmd, 0, pf_scratch, "eject");
 521}
 522
 523#define PF_RESET_TMO   30       /* in tenths of a second */
 524
 525static void pf_sleep(int cs)
 526{
 527        schedule_timeout_interruptible(cs);
 528}
 529
 530/* the ATAPI standard actually specifies the contents of all 7 registers
 531   after a reset, but the specification is ambiguous concerning the last
 532   two bytes, and different drives interpret the standard differently.
 533 */
 534
 535static int pf_reset(struct pf_unit *pf)
 536{
 537        int i, k, flg;
 538        int expect[5] = { 1, 1, 1, 0x14, 0xeb };
 539
 540        pi_connect(pf->pi);
 541        write_reg(pf, 6, 0xa0+0x10*pf->drive);
 542        write_reg(pf, 7, 8);
 543
 544        pf_sleep(20 * HZ / 1000);
 545
 546        k = 0;
 547        while ((k++ < PF_RESET_TMO) && (status_reg(pf) & STAT_BUSY))
 548                pf_sleep(HZ / 10);
 549
 550        flg = 1;
 551        for (i = 0; i < 5; i++)
 552                flg &= (read_reg(pf, i + 1) == expect[i]);
 553
 554        if (verbose) {
 555                printk("%s: Reset (%d) signature = ", pf->name, k);
 556                for (i = 0; i < 5; i++)
 557                        printk("%3x", read_reg(pf, i + 1));
 558                if (!flg)
 559                        printk(" (incorrect)");
 560                printk("\n");
 561        }
 562
 563        pi_disconnect(pf->pi);
 564        return flg - 1;
 565}
 566
 567static void pf_mode_sense(struct pf_unit *pf)
 568{
 569        char ms_cmd[12] =
 570            { ATAPI_MODE_SENSE, pf->lun << 5, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0 };
 571        char buf[8];
 572
 573        pf_atapi(pf, ms_cmd, 8, buf, "mode sense");
 574        pf->media_status = PF_RW;
 575        if (buf[3] & 0x80)
 576                pf->media_status = PF_RO;
 577}
 578
 579static void xs(char *buf, char *targ, int offs, int len)
 580{
 581        int j, k, l;
 582
 583        j = 0;
 584        l = 0;
 585        for (k = 0; k < len; k++)
 586                if ((buf[k + offs] != 0x20) || (buf[k + offs] != l))
 587                        l = targ[j++] = buf[k + offs];
 588        if (l == 0x20)
 589                j--;
 590        targ[j] = 0;
 591}
 592
 593static int xl(char *buf, int offs)
 594{
 595        int v, k;
 596
 597        v = 0;
 598        for (k = 0; k < 4; k++)
 599                v = v * 256 + (buf[k + offs] & 0xff);
 600        return v;
 601}
 602
 603static void pf_get_capacity(struct pf_unit *pf)
 604{
 605        char rc_cmd[12] = { ATAPI_CAPACITY, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 606        char buf[8];
 607        int bs;
 608
 609        if (pf_atapi(pf, rc_cmd, 8, buf, "get capacity")) {
 610                pf->media_status = PF_NM;
 611                return;
 612        }
 613        set_capacity(pf->disk, xl(buf, 0) + 1);
 614        bs = xl(buf, 4);
 615        if (bs != 512) {
 616                set_capacity(pf->disk, 0);
 617                if (verbose)
 618                        printk("%s: Drive %d, LUN %d,"
 619                               " unsupported block size %d\n",
 620                               pf->name, pf->drive, pf->lun, bs);
 621        }
 622}
 623
 624static int pf_identify(struct pf_unit *pf)
 625{
 626        int dt, s;
 627        char *ms[2] = { "master", "slave" };
 628        char mf[10], id[18];
 629        char id_cmd[12] =
 630            { ATAPI_IDENTIFY, pf->lun << 5, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
 631        char buf[36];
 632
 633        s = pf_atapi(pf, id_cmd, 36, buf, "identify");
 634        if (s)
 635                return -1;
 636
 637        dt = buf[0] & 0x1f;
 638        if ((dt != 0) && (dt != 7)) {
 639                if (verbose)
 640                        printk("%s: Drive %d, LUN %d, unsupported type %d\n",
 641                               pf->name, pf->drive, pf->lun, dt);
 642                return -1;
 643        }
 644
 645        xs(buf, mf, 8, 8);
 646        xs(buf, id, 16, 16);
 647
 648        pf->removable = (buf[1] & 0x80);
 649
 650        pf_mode_sense(pf);
 651        pf_mode_sense(pf);
 652        pf_mode_sense(pf);
 653
 654        pf_get_capacity(pf);
 655
 656        printk("%s: %s %s, %s LUN %d, type %d",
 657               pf->name, mf, id, ms[pf->drive], pf->lun, dt);
 658        if (pf->removable)
 659                printk(", removable");
 660        if (pf->media_status == PF_NM)
 661                printk(", no media\n");
 662        else {
 663                if (pf->media_status == PF_RO)
 664                        printk(", RO");
 665                printk(", %llu blocks\n",
 666                        (unsigned long long)get_capacity(pf->disk));
 667        }
 668        return 0;
 669}
 670
 671/*      returns  0, with id set if drive is detected
 672                -1, if drive detection failed
 673*/
 674static int pf_probe(struct pf_unit *pf)
 675{
 676        if (pf->drive == -1) {
 677                for (pf->drive = 0; pf->drive <= 1; pf->drive++)
 678                        if (!pf_reset(pf)) {
 679                                if (pf->lun != -1)
 680                                        return pf_identify(pf);
 681                                else
 682                                        for (pf->lun = 0; pf->lun < 8; pf->lun++)
 683                                                if (!pf_identify(pf))
 684                                                        return 0;
 685                        }
 686        } else {
 687                if (pf_reset(pf))
 688                        return -1;
 689                if (pf->lun != -1)
 690                        return pf_identify(pf);
 691                for (pf->lun = 0; pf->lun < 8; pf->lun++)
 692                        if (!pf_identify(pf))
 693                                return 0;
 694        }
 695        return -1;
 696}
 697
 698static int pf_detect(void)
 699{
 700        struct pf_unit *pf = units;
 701        int k, unit;
 702
 703        printk("%s: %s version %s, major %d, cluster %d, nice %d\n",
 704               name, name, PF_VERSION, major, cluster, nice);
 705
 706        k = 0;
 707        if (pf_drive_count == 0) {
 708                if (pi_init(pf->pi, 1, -1, -1, -1, -1, -1, pf_scratch, PI_PF,
 709                            verbose, pf->name)) {
 710                        if (!pf_probe(pf) && pf->disk) {
 711                                pf->present = 1;
 712                                k++;
 713                        } else
 714                                pi_release(pf->pi);
 715                }
 716
 717        } else
 718                for (unit = 0; unit < PF_UNITS; unit++, pf++) {
 719                        int *conf = *drives[unit];
 720                        if (!conf[D_PRT])
 721                                continue;
 722                        if (pi_init(pf->pi, 0, conf[D_PRT], conf[D_MOD],
 723                                    conf[D_UNI], conf[D_PRO], conf[D_DLY],
 724                                    pf_scratch, PI_PF, verbose, pf->name)) {
 725                                if (pf->disk && !pf_probe(pf)) {
 726                                        pf->present = 1;
 727                                        k++;
 728                                } else
 729                                        pi_release(pf->pi);
 730                        }
 731                }
 732        if (k)
 733                return 0;
 734
 735        printk("%s: No ATAPI disk detected\n", name);
 736        for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++)
 737                put_disk(pf->disk);
 738        return -1;
 739}
 740
 741/* The i/o request engine */
 742
 743static int pf_start(struct pf_unit *pf, int cmd, int b, int c)
 744{
 745        int i;
 746        char io_cmd[12] = { cmd, pf->lun << 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 747
 748        for (i = 0; i < 4; i++) {
 749                io_cmd[5 - i] = b & 0xff;
 750                b = b >> 8;
 751        }
 752
 753        io_cmd[8] = c & 0xff;
 754        io_cmd[7] = (c >> 8) & 0xff;
 755
 756        i = pf_command(pf, io_cmd, c * 512, "start i/o");
 757
 758        mdelay(1);
 759
 760        return i;
 761}
 762
 763static int pf_ready(void)
 764{
 765        return (((status_reg(pf_current) & (STAT_BUSY | pf_mask)) == pf_mask));
 766}
 767
 768static struct request_queue *pf_queue;
 769
 770static void pf_end_request(int err)
 771{
 772        if (pf_req && !__blk_end_request_cur(pf_req, err))
 773                pf_req = NULL;
 774}
 775
 776static void do_pf_request(struct request_queue * q)
 777{
 778        if (pf_busy)
 779                return;
 780repeat:
 781        if (!pf_req) {
 782                pf_req = blk_fetch_request(q);
 783                if (!pf_req)
 784                        return;
 785        }
 786
 787        pf_current = pf_req->rq_disk->private_data;
 788        pf_block = blk_rq_pos(pf_req);
 789        pf_run = blk_rq_sectors(pf_req);
 790        pf_count = blk_rq_cur_sectors(pf_req);
 791
 792        if (pf_block + pf_count > get_capacity(pf_req->rq_disk)) {
 793                pf_end_request(-EIO);
 794                goto repeat;
 795        }
 796
 797        pf_cmd = rq_data_dir(pf_req);
 798        pf_buf = pf_req->buffer;
 799        pf_retries = 0;
 800
 801        pf_busy = 1;
 802        if (pf_cmd == READ)
 803                pi_do_claimed(pf_current->pi, do_pf_read);
 804        else if (pf_cmd == WRITE)
 805                pi_do_claimed(pf_current->pi, do_pf_write);
 806        else {
 807                pf_busy = 0;
 808                pf_end_request(-EIO);
 809                goto repeat;
 810        }
 811}
 812
 813static int pf_next_buf(void)
 814{
 815        unsigned long saved_flags;
 816
 817        pf_count--;
 818        pf_run--;
 819        pf_buf += 512;
 820        pf_block++;
 821        if (!pf_run)
 822                return 1;
 823        if (!pf_count) {
 824                spin_lock_irqsave(&pf_spin_lock, saved_flags);
 825                pf_end_request(0);
 826                spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
 827                if (!pf_req)
 828                        return 1;
 829                pf_count = blk_rq_cur_sectors(pf_req);
 830                pf_buf = pf_req->buffer;
 831        }
 832        return 0;
 833}
 834
 835static inline void next_request(int err)
 836{
 837        unsigned long saved_flags;
 838
 839        spin_lock_irqsave(&pf_spin_lock, saved_flags);
 840        pf_end_request(err);
 841        pf_busy = 0;
 842        do_pf_request(pf_queue);
 843        spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
 844}
 845
 846/* detach from the calling context - in case the spinlock is held */
 847static void do_pf_read(void)
 848{
 849        ps_set_intr(do_pf_read_start, NULL, 0, nice);
 850}
 851
 852static void do_pf_read_start(void)
 853{
 854        pf_busy = 1;
 855
 856        if (pf_start(pf_current, ATAPI_READ_10, pf_block, pf_run)) {
 857                pi_disconnect(pf_current->pi);
 858                if (pf_retries < PF_MAX_RETRIES) {
 859                        pf_retries++;
 860                        pi_do_claimed(pf_current->pi, do_pf_read_start);
 861                        return;
 862                }
 863                next_request(-EIO);
 864                return;
 865        }
 866        pf_mask = STAT_DRQ;
 867        ps_set_intr(do_pf_read_drq, pf_ready, PF_TMO, nice);
 868}
 869
 870static void do_pf_read_drq(void)
 871{
 872        while (1) {
 873                if (pf_wait(pf_current, STAT_BUSY, STAT_DRQ | STAT_ERR,
 874                            "read block", "completion") & STAT_ERR) {
 875                        pi_disconnect(pf_current->pi);
 876                        if (pf_retries < PF_MAX_RETRIES) {
 877                                pf_req_sense(pf_current, 0);
 878                                pf_retries++;
 879                                pi_do_claimed(pf_current->pi, do_pf_read_start);
 880                                return;
 881                        }
 882                        next_request(-EIO);
 883                        return;
 884                }
 885                pi_read_block(pf_current->pi, pf_buf, 512);
 886                if (pf_next_buf())
 887                        break;
 888        }
 889        pi_disconnect(pf_current->pi);
 890        next_request(0);
 891}
 892
 893static void do_pf_write(void)
 894{
 895        ps_set_intr(do_pf_write_start, NULL, 0, nice);
 896}
 897
 898static void do_pf_write_start(void)
 899{
 900        pf_busy = 1;
 901
 902        if (pf_start(pf_current, ATAPI_WRITE_10, pf_block, pf_run)) {
 903                pi_disconnect(pf_current->pi);
 904                if (pf_retries < PF_MAX_RETRIES) {
 905                        pf_retries++;
 906                        pi_do_claimed(pf_current->pi, do_pf_write_start);
 907                        return;
 908                }
 909                next_request(-EIO);
 910                return;
 911        }
 912
 913        while (1) {
 914                if (pf_wait(pf_current, STAT_BUSY, STAT_DRQ | STAT_ERR,
 915                            "write block", "data wait") & STAT_ERR) {
 916                        pi_disconnect(pf_current->pi);
 917                        if (pf_retries < PF_MAX_RETRIES) {
 918                                pf_retries++;
 919                                pi_do_claimed(pf_current->pi, do_pf_write_start);
 920                                return;
 921                        }
 922                        next_request(-EIO);
 923                        return;
 924                }
 925                pi_write_block(pf_current->pi, pf_buf, 512);
 926                if (pf_next_buf())
 927                        break;
 928        }
 929        pf_mask = 0;
 930        ps_set_intr(do_pf_write_done, pf_ready, PF_TMO, nice);
 931}
 932
 933static void do_pf_write_done(void)
 934{
 935        if (pf_wait(pf_current, STAT_BUSY, 0, "write block", "done") & STAT_ERR) {
 936                pi_disconnect(pf_current->pi);
 937                if (pf_retries < PF_MAX_RETRIES) {
 938                        pf_retries++;
 939                        pi_do_claimed(pf_current->pi, do_pf_write_start);
 940                        return;
 941                }
 942                next_request(-EIO);
 943                return;
 944        }
 945        pi_disconnect(pf_current->pi);
 946        next_request(0);
 947}
 948
 949static int __init pf_init(void)
 950{                               /* preliminary initialisation */
 951        struct pf_unit *pf;
 952        int unit;
 953
 954        if (disable)
 955                return -EINVAL;
 956
 957        pf_init_units();
 958
 959        if (pf_detect())
 960                return -ENODEV;
 961        pf_busy = 0;
 962
 963        if (register_blkdev(major, name)) {
 964                for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++)
 965                        put_disk(pf->disk);
 966                return -EBUSY;
 967        }
 968        pf_queue = blk_init_queue(do_pf_request, &pf_spin_lock);
 969        if (!pf_queue) {
 970                unregister_blkdev(major, name);
 971                for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++)
 972                        put_disk(pf->disk);
 973                return -ENOMEM;
 974        }
 975
 976        blk_queue_max_segments(pf_queue, cluster);
 977
 978        for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
 979                struct gendisk *disk = pf->disk;
 980
 981                if (!pf->present)
 982                        continue;
 983                disk->private_data = pf;
 984                disk->queue = pf_queue;
 985                add_disk(disk);
 986        }
 987        return 0;
 988}
 989
 990static void __exit pf_exit(void)
 991{
 992        struct pf_unit *pf;
 993        int unit;
 994        unregister_blkdev(major, name);
 995        for (pf = units, unit = 0; unit < PF_UNITS; pf++, unit++) {
 996                if (!pf->present)
 997                        continue;
 998                del_gendisk(pf->disk);
 999                put_disk(pf->disk);
1000                pi_release(pf->pi);
1001        }
1002        blk_cleanup_queue(pf_queue);
1003}
1004
1005MODULE_LICENSE("GPL");
1006module_init(pf_init)
1007module_exit(pf_exit)
1008