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