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