linux/drivers/block/paride/pt.c
<<
>>
Prefs
   1/* 
   2        pt.c    (c) 1998  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 tape
   6        drives based on chips supported by the paride module.
   7
   8        The driver implements both rewinding and non-rewinding
   9        devices, filemarks, and the rewind ioctl.  It allocates
  10        a small internal "bounce buffer" for each open device, but
  11        otherwise expects buffering and blocking to be done at the
  12        user level.  As with most block-structured tapes, short
  13        writes are padded to full tape blocks, so reading back a file
  14        may return more data than was actually written.
  15
  16        By default, the driver will autoprobe for a single parallel
  17        port ATAPI tape drive, but if their individual parameters are
  18        specified, the driver can handle up to 4 drives.
  19
  20        The rewinding devices are named /dev/pt0, /dev/pt1, ...
  21        while the non-rewinding devices are /dev/npt0, /dev/npt1, etc.
  22
  23        The behaviour of the pt driver can be altered by setting
  24        some parameters from the insmod command line.  The following
  25        parameters are adjustable:
  26
  27            drive0      These four arguments can be arrays of       
  28            drive1      1-6 integers as follows:
  29            drive2
  30            drive3      <prt>,<pro>,<uni>,<mod>,<slv>,<dly>
  31
  32                        Where,
  33
  34                <prt>   is the base of the parallel port address for
  35                        the corresponding drive.  (required)
  36
  37                <pro>   is the protocol number for the adapter that
  38                        supports this drive.  These numbers are
  39                        logged by 'paride' when the protocol modules
  40                        are initialised.  (0 if not given)
  41
  42                <uni>   for those adapters that support chained
  43                        devices, this is the unit selector for the
  44                        chain of devices on the given port.  It should
  45                        be zero for devices that don't support chaining.
  46                        (0 if not given)
  47
  48                <mod>   this can be -1 to choose the best mode, or one
  49                        of the mode numbers supported by the adapter.
  50                        (-1 if not given)
  51
  52                <slv>   ATAPI devices can be jumpered to master or slave.
  53                        Set this to 0 to choose the master drive, 1 to
  54                        choose the slave, -1 (the default) to choose the
  55                        first drive found.
  56
  57                <dly>   some parallel ports require the driver to 
  58                        go more slowly.  -1 sets a default value that
  59                        should work with the chosen protocol.  Otherwise,
  60                        set this to a small integer, the larger it is
  61                        the slower the port i/o.  In some cases, setting
  62                        this to zero will speed up the device. (default -1)
  63
  64            major       You may use this parameter to override the
  65                        default major number (96) that this driver
  66                        will use.  Be sure to change the device
  67                        name as well.
  68
  69            name        This parameter is a character string that
  70                        contains the name the kernel will use for this
  71                        device (in /proc output, for instance).
  72                        (default "pt").
  73
  74            verbose     This parameter controls the amount of logging
  75                        that the driver will do.  Set it to 0 for
  76                        normal operation, 1 to see autoprobe progress
  77                        messages, or 2 to see additional debugging
  78                        output.  (default 0)
  79 
  80        If this driver is built into the kernel, you can use 
  81        the following command line parameters, with the same values
  82        as the corresponding module parameters listed above:
  83
  84            pt.drive0
  85            pt.drive1
  86            pt.drive2
  87            pt.drive3
  88
  89        In addition, you can use the parameter pt.disable to disable
  90        the driver entirely.
  91
  92*/
  93
  94/*   Changes:
  95
  96        1.01    GRG 1998.05.06  Round up transfer size, fix ready_wait,
  97                                loosed interpretation of ATAPI standard
  98                                for clearing error status.
  99                                Eliminate sti();
 100        1.02    GRG 1998.06.16  Eliminate an Ugh.
 101        1.03    GRG 1998.08.15  Adjusted PT_TMO, use HZ in loop timing,
 102                                extra debugging
 103        1.04    GRG 1998.09.24  Repair minor coding error, added jumbo support
 104        
 105*/
 106
 107#define PT_VERSION      "1.04"
 108#define PT_MAJOR        96
 109#define PT_NAME         "pt"
 110#define PT_UNITS        4
 111
 112#include <linux/types.h>
 113
 114/* Here are things one can override from the insmod command.
 115   Most are autoprobed by paride unless set here.  Verbose is on
 116   by default.
 117
 118*/
 119
 120static int verbose = 0;
 121static int major = PT_MAJOR;
 122static char *name = PT_NAME;
 123static int disable = 0;
 124
 125static int drive0[6] = { 0, 0, 0, -1, -1, -1 };
 126static int drive1[6] = { 0, 0, 0, -1, -1, -1 };
 127static int drive2[6] = { 0, 0, 0, -1, -1, -1 };
 128static int drive3[6] = { 0, 0, 0, -1, -1, -1 };
 129
 130static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3};
 131
 132#define D_PRT   0
 133#define D_PRO   1
 134#define D_UNI   2
 135#define D_MOD   3
 136#define D_SLV   4
 137#define D_DLY   5
 138
 139#define DU              (*drives[unit])
 140
 141/* end of parameters */
 142
 143#include <linux/module.h>
 144#include <linux/init.h>
 145#include <linux/fs.h>
 146#include <linux/delay.h>
 147#include <linux/slab.h>
 148#include <linux/mtio.h>
 149#include <linux/device.h>
 150#include <linux/sched.h>        /* current, TASK_*, schedule_timeout() */
 151#include <linux/mutex.h>
 152
 153#include <linux/uaccess.h>
 154
 155module_param(verbose, int, 0);
 156module_param(major, int, 0);
 157module_param(name, charp, 0);
 158module_param_array(drive0, int, NULL, 0);
 159module_param_array(drive1, int, NULL, 0);
 160module_param_array(drive2, int, NULL, 0);
 161module_param_array(drive3, int, NULL, 0);
 162
 163#include "paride.h"
 164
 165#define PT_MAX_RETRIES  5
 166#define PT_TMO          3000    /* interrupt timeout in jiffies */
 167#define PT_SPIN_DEL     50      /* spin delay in micro-seconds  */
 168#define PT_RESET_TMO    30      /* 30 seconds */
 169#define PT_READY_TMO    60      /* 60 seconds */
 170#define PT_REWIND_TMO   1200    /* 20 minutes */
 171
 172#define PT_SPIN         ((1000000/(HZ*PT_SPIN_DEL))*PT_TMO)
 173
 174#define STAT_ERR        0x00001
 175#define STAT_INDEX      0x00002
 176#define STAT_ECC        0x00004
 177#define STAT_DRQ        0x00008
 178#define STAT_SEEK       0x00010
 179#define STAT_WRERR      0x00020
 180#define STAT_READY      0x00040
 181#define STAT_BUSY       0x00080
 182#define STAT_SENSE      0x1f000
 183
 184#define ATAPI_TEST_READY        0x00
 185#define ATAPI_REWIND            0x01
 186#define ATAPI_REQ_SENSE         0x03
 187#define ATAPI_READ_6            0x08
 188#define ATAPI_WRITE_6           0x0a
 189#define ATAPI_WFM               0x10
 190#define ATAPI_IDENTIFY          0x12
 191#define ATAPI_MODE_SENSE        0x1a
 192#define ATAPI_LOG_SENSE         0x4d
 193
 194static DEFINE_MUTEX(pt_mutex);
 195static int pt_open(struct inode *inode, struct file *file);
 196static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
 197static int pt_release(struct inode *inode, struct file *file);
 198static ssize_t pt_read(struct file *filp, char __user *buf,
 199                       size_t count, loff_t * ppos);
 200static ssize_t pt_write(struct file *filp, const char __user *buf,
 201                        size_t count, loff_t * ppos);
 202static int pt_detect(void);
 203
 204/* bits in tape->flags */
 205
 206#define PT_MEDIA        1
 207#define PT_WRITE_OK     2
 208#define PT_REWIND       4
 209#define PT_WRITING      8
 210#define PT_READING     16
 211#define PT_EOF         32
 212
 213#define PT_NAMELEN      8
 214#define PT_BUFSIZE  16384
 215
 216struct pt_unit {
 217        struct pi_adapter pia;  /* interface to paride layer */
 218        struct pi_adapter *pi;
 219        int flags;              /* various state flags */
 220        int last_sense;         /* result of last request sense */
 221        int drive;              /* drive */
 222        atomic_t available;     /* 1 if access is available 0 otherwise */
 223        int bs;                 /* block size */
 224        int capacity;           /* Size of tape in KB */
 225        int present;            /* device present ? */
 226        char *bufptr;
 227        char name[PT_NAMELEN];  /* pf0, pf1, ... */
 228};
 229
 230static int pt_identify(struct pt_unit *tape);
 231
 232static struct pt_unit pt[PT_UNITS];
 233
 234static char pt_scratch[512];    /* scratch block buffer */
 235static void *par_drv;           /* reference of parport driver */
 236
 237/* kernel glue structures */
 238
 239static const struct file_operations pt_fops = {
 240        .owner = THIS_MODULE,
 241        .read = pt_read,
 242        .write = pt_write,
 243        .unlocked_ioctl = pt_ioctl,
 244        .open = pt_open,
 245        .release = pt_release,
 246        .llseek = noop_llseek,
 247};
 248
 249/* sysfs class support */
 250static struct class *pt_class;
 251
 252static inline int status_reg(struct pi_adapter *pi)
 253{
 254        return pi_read_regr(pi, 1, 6);
 255}
 256
 257static inline int read_reg(struct pi_adapter *pi, int reg)
 258{
 259        return pi_read_regr(pi, 0, reg);
 260}
 261
 262static inline void write_reg(struct pi_adapter *pi, int reg, int val)
 263{
 264        pi_write_regr(pi, 0, reg, val);
 265}
 266
 267static inline u8 DRIVE(struct pt_unit *tape)
 268{
 269        return 0xa0+0x10*tape->drive;
 270}
 271
 272static int pt_wait(struct pt_unit *tape, int go, int stop, char *fun, char *msg)
 273{
 274        int j, r, e, s, p;
 275        struct pi_adapter *pi = tape->pi;
 276
 277        j = 0;
 278        while ((((r = status_reg(pi)) & go) || (stop && (!(r & stop))))
 279               && (j++ < PT_SPIN))
 280                udelay(PT_SPIN_DEL);
 281
 282        if ((r & (STAT_ERR & stop)) || (j > PT_SPIN)) {
 283                s = read_reg(pi, 7);
 284                e = read_reg(pi, 1);
 285                p = read_reg(pi, 2);
 286                if (j > PT_SPIN)
 287                        e |= 0x100;
 288                if (fun)
 289                        printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"
 290                               " loop=%d phase=%d\n",
 291                               tape->name, fun, msg, r, s, e, j, p);
 292                return (e << 8) + s;
 293        }
 294        return 0;
 295}
 296
 297static int pt_command(struct pt_unit *tape, char *cmd, int dlen, char *fun)
 298{
 299        struct pi_adapter *pi = tape->pi;
 300        pi_connect(pi);
 301
 302        write_reg(pi, 6, DRIVE(tape));
 303
 304        if (pt_wait(tape, STAT_BUSY | STAT_DRQ, 0, fun, "before command")) {
 305                pi_disconnect(pi);
 306                return -1;
 307        }
 308
 309        write_reg(pi, 4, dlen % 256);
 310        write_reg(pi, 5, dlen / 256);
 311        write_reg(pi, 7, 0xa0); /* ATAPI packet command */
 312
 313        if (pt_wait(tape, STAT_BUSY, STAT_DRQ, fun, "command DRQ")) {
 314                pi_disconnect(pi);
 315                return -1;
 316        }
 317
 318        if (read_reg(pi, 2) != 1) {
 319                printk("%s: %s: command phase error\n", tape->name, fun);
 320                pi_disconnect(pi);
 321                return -1;
 322        }
 323
 324        pi_write_block(pi, cmd, 12);
 325
 326        return 0;
 327}
 328
 329static int pt_completion(struct pt_unit *tape, char *buf, char *fun)
 330{
 331        struct pi_adapter *pi = tape->pi;
 332        int r, s, n, p;
 333
 334        r = pt_wait(tape, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
 335                    fun, "completion");
 336
 337        if (read_reg(pi, 7) & STAT_DRQ) {
 338                n = (((read_reg(pi, 4) + 256 * read_reg(pi, 5)) +
 339                      3) & 0xfffc);
 340                p = read_reg(pi, 2) & 3;
 341                if (p == 0)
 342                        pi_write_block(pi, buf, n);
 343                if (p == 2)
 344                        pi_read_block(pi, buf, n);
 345        }
 346
 347        s = pt_wait(tape, STAT_BUSY, STAT_READY | STAT_ERR, fun, "data done");
 348
 349        pi_disconnect(pi);
 350
 351        return (r ? r : s);
 352}
 353
 354static void pt_req_sense(struct pt_unit *tape, int quiet)
 355{
 356        char rs_cmd[12] = { ATAPI_REQ_SENSE, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
 357        char buf[16];
 358        int r;
 359
 360        r = pt_command(tape, rs_cmd, 16, "Request sense");
 361        mdelay(1);
 362        if (!r)
 363                pt_completion(tape, buf, "Request sense");
 364
 365        tape->last_sense = -1;
 366        if (!r) {
 367                if (!quiet)
 368                        printk("%s: Sense key: %x, ASC: %x, ASQ: %x\n",
 369                               tape->name, buf[2] & 0xf, buf[12], buf[13]);
 370                tape->last_sense = (buf[2] & 0xf) | ((buf[12] & 0xff) << 8)
 371                    | ((buf[13] & 0xff) << 16);
 372        }
 373}
 374
 375static int pt_atapi(struct pt_unit *tape, char *cmd, int dlen, char *buf, char *fun)
 376{
 377        int r;
 378
 379        r = pt_command(tape, cmd, dlen, fun);
 380        mdelay(1);
 381        if (!r)
 382                r = pt_completion(tape, buf, fun);
 383        if (r)
 384                pt_req_sense(tape, !fun);
 385
 386        return r;
 387}
 388
 389static void pt_sleep(int cs)
 390{
 391        schedule_timeout_interruptible(cs);
 392}
 393
 394static int pt_poll_dsc(struct pt_unit *tape, int pause, int tmo, char *msg)
 395{
 396        struct pi_adapter *pi = tape->pi;
 397        int k, e, s;
 398
 399        k = 0;
 400        e = 0;
 401        s = 0;
 402        while (k < tmo) {
 403                pt_sleep(pause);
 404                k++;
 405                pi_connect(pi);
 406                write_reg(pi, 6, DRIVE(tape));
 407                s = read_reg(pi, 7);
 408                e = read_reg(pi, 1);
 409                pi_disconnect(pi);
 410                if (s & (STAT_ERR | STAT_SEEK))
 411                        break;
 412        }
 413        if ((k >= tmo) || (s & STAT_ERR)) {
 414                if (k >= tmo)
 415                        printk("%s: %s DSC timeout\n", tape->name, msg);
 416                else
 417                        printk("%s: %s stat=0x%x err=0x%x\n", tape->name, msg, s,
 418                               e);
 419                pt_req_sense(tape, 0);
 420                return 0;
 421        }
 422        return 1;
 423}
 424
 425static void pt_media_access_cmd(struct pt_unit *tape, int tmo, char *cmd, char *fun)
 426{
 427        if (pt_command(tape, cmd, 0, fun)) {
 428                pt_req_sense(tape, 0);
 429                return;
 430        }
 431        pi_disconnect(tape->pi);
 432        pt_poll_dsc(tape, HZ, tmo, fun);
 433}
 434
 435static void pt_rewind(struct pt_unit *tape)
 436{
 437        char rw_cmd[12] = { ATAPI_REWIND, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 438
 439        pt_media_access_cmd(tape, PT_REWIND_TMO, rw_cmd, "rewind");
 440}
 441
 442static void pt_write_fm(struct pt_unit *tape)
 443{
 444        char wm_cmd[12] = { ATAPI_WFM, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 };
 445
 446        pt_media_access_cmd(tape, PT_TMO, wm_cmd, "write filemark");
 447}
 448
 449#define DBMSG(msg)      ((verbose>1)?(msg):NULL)
 450
 451static int pt_reset(struct pt_unit *tape)
 452{
 453        struct pi_adapter *pi = tape->pi;
 454        int i, k, flg;
 455        int expect[5] = { 1, 1, 1, 0x14, 0xeb };
 456
 457        pi_connect(pi);
 458        write_reg(pi, 6, DRIVE(tape));
 459        write_reg(pi, 7, 8);
 460
 461        pt_sleep(20 * HZ / 1000);
 462
 463        k = 0;
 464        while ((k++ < PT_RESET_TMO) && (status_reg(pi) & STAT_BUSY))
 465                pt_sleep(HZ / 10);
 466
 467        flg = 1;
 468        for (i = 0; i < 5; i++)
 469                flg &= (read_reg(pi, i + 1) == expect[i]);
 470
 471        if (verbose) {
 472                printk("%s: Reset (%d) signature = ", tape->name, k);
 473                for (i = 0; i < 5; i++)
 474                        printk("%3x", read_reg(pi, i + 1));
 475                if (!flg)
 476                        printk(" (incorrect)");
 477                printk("\n");
 478        }
 479
 480        pi_disconnect(pi);
 481        return flg - 1;
 482}
 483
 484static int pt_ready_wait(struct pt_unit *tape, int tmo)
 485{
 486        char tr_cmd[12] = { ATAPI_TEST_READY, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 487        int k, p;
 488
 489        k = 0;
 490        while (k < tmo) {
 491                tape->last_sense = 0;
 492                pt_atapi(tape, tr_cmd, 0, NULL, DBMSG("test unit ready"));
 493                p = tape->last_sense;
 494                if (!p)
 495                        return 0;
 496                if (!(((p & 0xffff) == 0x0402) || ((p & 0xff) == 6)))
 497                        return p;
 498                k++;
 499                pt_sleep(HZ);
 500        }
 501        return 0x000020;        /* timeout */
 502}
 503
 504static void xs(char *buf, char *targ, int offs, int len)
 505{
 506        int j, k, l;
 507
 508        j = 0;
 509        l = 0;
 510        for (k = 0; k < len; k++)
 511                if ((buf[k + offs] != 0x20) || (buf[k + offs] != l))
 512                        l = targ[j++] = buf[k + offs];
 513        if (l == 0x20)
 514                j--;
 515        targ[j] = 0;
 516}
 517
 518static int xn(char *buf, int offs, int size)
 519{
 520        int v, k;
 521
 522        v = 0;
 523        for (k = 0; k < size; k++)
 524                v = v * 256 + (buf[k + offs] & 0xff);
 525        return v;
 526}
 527
 528static int pt_identify(struct pt_unit *tape)
 529{
 530        int dt, s;
 531        char *ms[2] = { "master", "slave" };
 532        char mf[10], id[18];
 533        char id_cmd[12] = { ATAPI_IDENTIFY, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
 534        char ms_cmd[12] =
 535            { ATAPI_MODE_SENSE, 0, 0x2a, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
 536        char ls_cmd[12] =
 537            { ATAPI_LOG_SENSE, 0, 0x71, 0, 0, 0, 0, 0, 36, 0, 0, 0 };
 538        char buf[36];
 539
 540        s = pt_atapi(tape, id_cmd, 36, buf, "identify");
 541        if (s)
 542                return -1;
 543
 544        dt = buf[0] & 0x1f;
 545        if (dt != 1) {
 546                if (verbose)
 547                        printk("%s: Drive %d, unsupported type %d\n",
 548                               tape->name, tape->drive, dt);
 549                return -1;
 550        }
 551
 552        xs(buf, mf, 8, 8);
 553        xs(buf, id, 16, 16);
 554
 555        tape->flags = 0;
 556        tape->capacity = 0;
 557        tape->bs = 0;
 558
 559        if (!pt_ready_wait(tape, PT_READY_TMO))
 560                tape->flags |= PT_MEDIA;
 561
 562        if (!pt_atapi(tape, ms_cmd, 36, buf, "mode sense")) {
 563                if (!(buf[2] & 0x80))
 564                        tape->flags |= PT_WRITE_OK;
 565                tape->bs = xn(buf, 10, 2);
 566        }
 567
 568        if (!pt_atapi(tape, ls_cmd, 36, buf, "log sense"))
 569                tape->capacity = xn(buf, 24, 4);
 570
 571        printk("%s: %s %s, %s", tape->name, mf, id, ms[tape->drive]);
 572        if (!(tape->flags & PT_MEDIA))
 573                printk(", no media\n");
 574        else {
 575                if (!(tape->flags & PT_WRITE_OK))
 576                        printk(", RO");
 577                printk(", blocksize %d, %d MB\n", tape->bs, tape->capacity / 1024);
 578        }
 579
 580        return 0;
 581}
 582
 583
 584/*
 585 * returns  0, with id set if drive is detected
 586 *         -1, if drive detection failed
 587 */
 588static int pt_probe(struct pt_unit *tape)
 589{
 590        if (tape->drive == -1) {
 591                for (tape->drive = 0; tape->drive <= 1; tape->drive++)
 592                        if (!pt_reset(tape))
 593                                return pt_identify(tape);
 594        } else {
 595                if (!pt_reset(tape))
 596                        return pt_identify(tape);
 597        }
 598        return -1;
 599}
 600
 601static int pt_detect(void)
 602{
 603        struct pt_unit *tape;
 604        int specified = 0, found = 0;
 605        int unit;
 606
 607        printk("%s: %s version %s, major %d\n", name, name, PT_VERSION, major);
 608
 609        par_drv = pi_register_driver(name);
 610        if (!par_drv) {
 611                pr_err("failed to register %s driver\n", name);
 612                return -1;
 613        }
 614
 615        specified = 0;
 616        for (unit = 0; unit < PT_UNITS; unit++) {
 617                struct pt_unit *tape = &pt[unit];
 618                tape->pi = &tape->pia;
 619                atomic_set(&tape->available, 1);
 620                tape->flags = 0;
 621                tape->last_sense = 0;
 622                tape->present = 0;
 623                tape->bufptr = NULL;
 624                tape->drive = DU[D_SLV];
 625                snprintf(tape->name, PT_NAMELEN, "%s%d", name, unit);
 626                if (!DU[D_PRT])
 627                        continue;
 628                specified++;
 629                if (pi_init(tape->pi, 0, DU[D_PRT], DU[D_MOD], DU[D_UNI],
 630                     DU[D_PRO], DU[D_DLY], pt_scratch, PI_PT,
 631                     verbose, tape->name)) {
 632                        if (!pt_probe(tape)) {
 633                                tape->present = 1;
 634                                found++;
 635                        } else
 636                                pi_release(tape->pi);
 637                }
 638        }
 639        if (specified == 0) {
 640                tape = pt;
 641                if (pi_init(tape->pi, 1, -1, -1, -1, -1, -1, pt_scratch,
 642                            PI_PT, verbose, tape->name)) {
 643                        if (!pt_probe(tape)) {
 644                                tape->present = 1;
 645                                found++;
 646                        } else
 647                                pi_release(tape->pi);
 648                }
 649
 650        }
 651        if (found)
 652                return 0;
 653
 654        pi_unregister_driver(par_drv);
 655        printk("%s: No ATAPI tape drive detected\n", name);
 656        return -1;
 657}
 658
 659static int pt_open(struct inode *inode, struct file *file)
 660{
 661        int unit = iminor(inode) & 0x7F;
 662        struct pt_unit *tape = pt + unit;
 663        int err;
 664
 665        mutex_lock(&pt_mutex);
 666        if (unit >= PT_UNITS || (!tape->present)) {
 667                mutex_unlock(&pt_mutex);
 668                return -ENODEV;
 669        }
 670
 671        err = -EBUSY;
 672        if (!atomic_dec_and_test(&tape->available))
 673                goto out;
 674
 675        pt_identify(tape);
 676
 677        err = -ENODEV;
 678        if (!(tape->flags & PT_MEDIA))
 679                goto out;
 680
 681        err = -EROFS;
 682        if ((!(tape->flags & PT_WRITE_OK)) && (file->f_mode & FMODE_WRITE))
 683                goto out;
 684
 685        if (!(iminor(inode) & 128))
 686                tape->flags |= PT_REWIND;
 687
 688        err = -ENOMEM;
 689        tape->bufptr = kmalloc(PT_BUFSIZE, GFP_KERNEL);
 690        if (tape->bufptr == NULL) {
 691                printk("%s: buffer allocation failed\n", tape->name);
 692                goto out;
 693        }
 694
 695        file->private_data = tape;
 696        mutex_unlock(&pt_mutex);
 697        return 0;
 698
 699out:
 700        atomic_inc(&tape->available);
 701        mutex_unlock(&pt_mutex);
 702        return err;
 703}
 704
 705static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 706{
 707        struct pt_unit *tape = file->private_data;
 708        struct mtop __user *p = (void __user *)arg;
 709        struct mtop mtop;
 710
 711        switch (cmd) {
 712        case MTIOCTOP:
 713                if (copy_from_user(&mtop, p, sizeof(struct mtop)))
 714                        return -EFAULT;
 715
 716                switch (mtop.mt_op) {
 717
 718                case MTREW:
 719                        mutex_lock(&pt_mutex);
 720                        pt_rewind(tape);
 721                        mutex_unlock(&pt_mutex);
 722                        return 0;
 723
 724                case MTWEOF:
 725                        mutex_lock(&pt_mutex);
 726                        pt_write_fm(tape);
 727                        mutex_unlock(&pt_mutex);
 728                        return 0;
 729
 730                default:
 731                        /* FIXME: rate limit ?? */
 732                        printk(KERN_DEBUG "%s: Unimplemented mt_op %d\n", tape->name,
 733                               mtop.mt_op);
 734                        return -EINVAL;
 735                }
 736
 737        default:
 738                return -ENOTTY;
 739        }
 740}
 741
 742static int
 743pt_release(struct inode *inode, struct file *file)
 744{
 745        struct pt_unit *tape = file->private_data;
 746
 747        if (atomic_read(&tape->available) > 1)
 748                return -EINVAL;
 749
 750        if (tape->flags & PT_WRITING)
 751                pt_write_fm(tape);
 752
 753        if (tape->flags & PT_REWIND)
 754                pt_rewind(tape);
 755
 756        kfree(tape->bufptr);
 757        tape->bufptr = NULL;
 758
 759        atomic_inc(&tape->available);
 760
 761        return 0;
 762
 763}
 764
 765static ssize_t pt_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
 766{
 767        struct pt_unit *tape = filp->private_data;
 768        struct pi_adapter *pi = tape->pi;
 769        char rd_cmd[12] = { ATAPI_READ_6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 770        int k, n, r, p, s, t, b;
 771
 772        if (!(tape->flags & (PT_READING | PT_WRITING))) {
 773                tape->flags |= PT_READING;
 774                if (pt_atapi(tape, rd_cmd, 0, NULL, "start read-ahead"))
 775                        return -EIO;
 776        } else if (tape->flags & PT_WRITING)
 777                return -EIO;
 778
 779        if (tape->flags & PT_EOF)
 780                return 0;
 781
 782        t = 0;
 783
 784        while (count > 0) {
 785
 786                if (!pt_poll_dsc(tape, HZ / 100, PT_TMO, "read"))
 787                        return -EIO;
 788
 789                n = count;
 790                if (n > 32768)
 791                        n = 32768;      /* max per command */
 792                b = (n - 1 + tape->bs) / tape->bs;
 793                n = b * tape->bs;       /* rounded up to even block */
 794
 795                rd_cmd[4] = b;
 796
 797                r = pt_command(tape, rd_cmd, n, "read");
 798
 799                mdelay(1);
 800
 801                if (r) {
 802                        pt_req_sense(tape, 0);
 803                        return -EIO;
 804                }
 805
 806                while (1) {
 807
 808                        r = pt_wait(tape, STAT_BUSY,
 809                                    STAT_DRQ | STAT_ERR | STAT_READY,
 810                                    DBMSG("read DRQ"), "");
 811
 812                        if (r & STAT_SENSE) {
 813                                pi_disconnect(pi);
 814                                pt_req_sense(tape, 0);
 815                                return -EIO;
 816                        }
 817
 818                        if (r)
 819                                tape->flags |= PT_EOF;
 820
 821                        s = read_reg(pi, 7);
 822
 823                        if (!(s & STAT_DRQ))
 824                                break;
 825
 826                        n = (read_reg(pi, 4) + 256 * read_reg(pi, 5));
 827                        p = (read_reg(pi, 2) & 3);
 828                        if (p != 2) {
 829                                pi_disconnect(pi);
 830                                printk("%s: Phase error on read: %d\n", tape->name,
 831                                       p);
 832                                return -EIO;
 833                        }
 834
 835                        while (n > 0) {
 836                                k = n;
 837                                if (k > PT_BUFSIZE)
 838                                        k = PT_BUFSIZE;
 839                                pi_read_block(pi, tape->bufptr, k);
 840                                n -= k;
 841                                b = k;
 842                                if (b > count)
 843                                        b = count;
 844                                if (copy_to_user(buf + t, tape->bufptr, b)) {
 845                                        pi_disconnect(pi);
 846                                        return -EFAULT;
 847                                }
 848                                t += b;
 849                                count -= b;
 850                        }
 851
 852                }
 853                pi_disconnect(pi);
 854                if (tape->flags & PT_EOF)
 855                        break;
 856        }
 857
 858        return t;
 859
 860}
 861
 862static ssize_t pt_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
 863{
 864        struct pt_unit *tape = filp->private_data;
 865        struct pi_adapter *pi = tape->pi;
 866        char wr_cmd[12] = { ATAPI_WRITE_6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 867        int k, n, r, p, s, t, b;
 868
 869        if (!(tape->flags & PT_WRITE_OK))
 870                return -EROFS;
 871
 872        if (!(tape->flags & (PT_READING | PT_WRITING))) {
 873                tape->flags |= PT_WRITING;
 874                if (pt_atapi
 875                    (tape, wr_cmd, 0, NULL, "start buffer-available mode"))
 876                        return -EIO;
 877        } else if (tape->flags & PT_READING)
 878                return -EIO;
 879
 880        if (tape->flags & PT_EOF)
 881                return -ENOSPC;
 882
 883        t = 0;
 884
 885        while (count > 0) {
 886
 887                if (!pt_poll_dsc(tape, HZ / 100, PT_TMO, "write"))
 888                        return -EIO;
 889
 890                n = count;
 891                if (n > 32768)
 892                        n = 32768;      /* max per command */
 893                b = (n - 1 + tape->bs) / tape->bs;
 894                n = b * tape->bs;       /* rounded up to even block */
 895
 896                wr_cmd[4] = b;
 897
 898                r = pt_command(tape, wr_cmd, n, "write");
 899
 900                mdelay(1);
 901
 902                if (r) {        /* error delivering command only */
 903                        pt_req_sense(tape, 0);
 904                        return -EIO;
 905                }
 906
 907                while (1) {
 908
 909                        r = pt_wait(tape, STAT_BUSY,
 910                                    STAT_DRQ | STAT_ERR | STAT_READY,
 911                                    DBMSG("write DRQ"), NULL);
 912
 913                        if (r & STAT_SENSE) {
 914                                pi_disconnect(pi);
 915                                pt_req_sense(tape, 0);
 916                                return -EIO;
 917                        }
 918
 919                        if (r)
 920                                tape->flags |= PT_EOF;
 921
 922                        s = read_reg(pi, 7);
 923
 924                        if (!(s & STAT_DRQ))
 925                                break;
 926
 927                        n = (read_reg(pi, 4) + 256 * read_reg(pi, 5));
 928                        p = (read_reg(pi, 2) & 3);
 929                        if (p != 0) {
 930                                pi_disconnect(pi);
 931                                printk("%s: Phase error on write: %d \n",
 932                                       tape->name, p);
 933                                return -EIO;
 934                        }
 935
 936                        while (n > 0) {
 937                                k = n;
 938                                if (k > PT_BUFSIZE)
 939                                        k = PT_BUFSIZE;
 940                                b = k;
 941                                if (b > count)
 942                                        b = count;
 943                                if (copy_from_user(tape->bufptr, buf + t, b)) {
 944                                        pi_disconnect(pi);
 945                                        return -EFAULT;
 946                                }
 947                                pi_write_block(pi, tape->bufptr, k);
 948                                t += b;
 949                                count -= b;
 950                                n -= k;
 951                        }
 952
 953                }
 954                pi_disconnect(pi);
 955                if (tape->flags & PT_EOF)
 956                        break;
 957        }
 958
 959        return t;
 960}
 961
 962static int __init pt_init(void)
 963{
 964        int unit;
 965        int err;
 966
 967        if (disable) {
 968                err = -EINVAL;
 969                goto out;
 970        }
 971
 972        if (pt_detect()) {
 973                err = -ENODEV;
 974                goto out;
 975        }
 976
 977        err = register_chrdev(major, name, &pt_fops);
 978        if (err < 0) {
 979                printk("pt_init: unable to get major number %d\n", major);
 980                for (unit = 0; unit < PT_UNITS; unit++)
 981                        if (pt[unit].present)
 982                                pi_release(pt[unit].pi);
 983                goto out;
 984        }
 985        major = err;
 986        pt_class = class_create(THIS_MODULE, "pt");
 987        if (IS_ERR(pt_class)) {
 988                err = PTR_ERR(pt_class);
 989                goto out_chrdev;
 990        }
 991
 992        for (unit = 0; unit < PT_UNITS; unit++)
 993                if (pt[unit].present) {
 994                        device_create(pt_class, NULL, MKDEV(major, unit), NULL,
 995                                      "pt%d", unit);
 996                        device_create(pt_class, NULL, MKDEV(major, unit + 128),
 997                                      NULL, "pt%dn", unit);
 998                }
 999        goto out;
1000
1001out_chrdev:
1002        unregister_chrdev(major, "pt");
1003out:
1004        return err;
1005}
1006
1007static void __exit pt_exit(void)
1008{
1009        int unit;
1010        for (unit = 0; unit < PT_UNITS; unit++)
1011                if (pt[unit].present) {
1012                        device_destroy(pt_class, MKDEV(major, unit));
1013                        device_destroy(pt_class, MKDEV(major, unit + 128));
1014                }
1015        class_destroy(pt_class);
1016        unregister_chrdev(major, name);
1017        for (unit = 0; unit < PT_UNITS; unit++)
1018                if (pt[unit].present)
1019                        pi_release(pt[unit].pi);
1020}
1021
1022MODULE_LICENSE("GPL");
1023module_init(pt_init)
1024module_exit(pt_exit)
1025