paride: push ioctl down into driver
[linux-2.6/mini2440.git] / drivers / block / paride / pt.c
blob27455ee1e9da555f680c7a694cf5874e9198a31b
1 /*
2 pt.c (c) 1998 Grant R. Guenther <grant@torque.net>
3 Under the terms of the GNU General Public License.
5 This is the high-level driver for parallel port ATAPI tape
6 drives based on chips supported by the paride module.
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.
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.
20 The rewinding devices are named /dev/pt0, /dev/pt1, ...
21 while the non-rewinding devices are /dev/npt0, /dev/npt1, etc.
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:
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>
32 Where,
34 <prt> is the base of the parallel port address for
35 the corresponding drive. (required)
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)
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)
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)
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.
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)
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.
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").
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)
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:
84 pt.drive0
85 pt.drive1
86 pt.drive2
87 pt.drive3
89 In addition, you can use the parameter pt.disable to disable
90 the driver entirely.
94 /* Changes:
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
107 #define PT_VERSION "1.04"
108 #define PT_MAJOR 96
109 #define PT_NAME "pt"
110 #define PT_UNITS 4
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.
118 static int verbose = 0;
119 static int major = PT_MAJOR;
120 static char *name = PT_NAME;
121 static int disable = 0;
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 };
128 static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3};
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
137 #define DU (*drives[unit])
139 /* end of parameters */
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>
151 #include <asm/uaccess.h>
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);
161 #include "paride.h"
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 */
170 #define PT_SPIN ((1000000/(HZ*PT_SPIN_DEL))*PT_TMO)
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
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
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);
201 /* bits in tape->flags */
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
210 #define PT_NAMELEN 8
211 #define PT_BUFSIZE 16384
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, ... */
227 static int pt_identify(struct pt_unit *tape);
229 static struct pt_unit pt[PT_UNITS];
231 static char pt_scratch[512]; /* scratch block buffer */
233 /* kernel glue structures */
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,
244 /* sysfs class support */
245 static struct class *pt_class;
247 static inline int status_reg(struct pi_adapter *pi)
249 return pi_read_regr(pi, 1, 6);
252 static inline int read_reg(struct pi_adapter *pi, int reg)
254 return pi_read_regr(pi, 0, reg);
257 static inline void write_reg(struct pi_adapter *pi, int reg, int val)
259 pi_write_regr(pi, 0, reg, val);
262 static inline u8 DRIVE(struct pt_unit *tape)
264 return 0xa0+0x10*tape->drive;
267 static int pt_wait(struct pt_unit *tape, int go, int stop, char *fun, char *msg)
269 int j, r, e, s, p;
270 struct pi_adapter *pi = tape->pi;
272 j = 0;
273 while ((((r = status_reg(pi)) & go) || (stop && (!(r & stop))))
274 && (j++ < PT_SPIN))
275 udelay(PT_SPIN_DEL);
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;
289 return 0;
292 static int pt_command(struct pt_unit *tape, char *cmd, int dlen, char *fun)
294 struct pi_adapter *pi = tape->pi;
295 pi_connect(pi);
297 write_reg(pi, 6, DRIVE(tape));
299 if (pt_wait(tape, STAT_BUSY | STAT_DRQ, 0, fun, "before command")) {
300 pi_disconnect(pi);
301 return -1;
304 write_reg(pi, 4, dlen % 256);
305 write_reg(pi, 5, dlen / 256);
306 write_reg(pi, 7, 0xa0); /* ATAPI packet command */
308 if (pt_wait(tape, STAT_BUSY, STAT_DRQ, fun, "command DRQ")) {
309 pi_disconnect(pi);
310 return -1;
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;
319 pi_write_block(pi, cmd, 12);
321 return 0;
324 static int pt_completion(struct pt_unit *tape, char *buf, char *fun)
326 struct pi_adapter *pi = tape->pi;
327 int r, s, n, p;
329 r = pt_wait(tape, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
330 fun, "completion");
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);
342 s = pt_wait(tape, STAT_BUSY, STAT_READY | STAT_ERR, fun, "data done");
344 pi_disconnect(pi);
346 return (r ? r : s);
349 static void pt_req_sense(struct pt_unit *tape, int quiet)
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;
355 r = pt_command(tape, rs_cmd, 16, "Request sense");
356 mdelay(1);
357 if (!r)
358 pt_completion(tape, buf, "Request sense");
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);
370 static int pt_atapi(struct pt_unit *tape, char *cmd, int dlen, char *buf, char *fun)
372 int r;
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);
381 return r;
384 static void pt_sleep(int cs)
386 schedule_timeout_interruptible(cs);
389 static int pt_poll_dsc(struct pt_unit *tape, int pause, int tmo, char *msg)
391 struct pi_adapter *pi = tape->pi;
392 int k, e, s;
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;
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,
414 pt_req_sense(tape, 0);
415 return 0;
417 return 1;
420 static void pt_media_access_cmd(struct pt_unit *tape, int tmo, char *cmd, char *fun)
422 if (pt_command(tape, cmd, 0, fun)) {
423 pt_req_sense(tape, 0);
424 return;
426 pi_disconnect(tape->pi);
427 pt_poll_dsc(tape, HZ, tmo, fun);
430 static void pt_rewind(struct pt_unit *tape)
432 char rw_cmd[12] = { ATAPI_REWIND, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
434 pt_media_access_cmd(tape, PT_REWIND_TMO, rw_cmd, "rewind");
437 static void pt_write_fm(struct pt_unit *tape)
439 char wm_cmd[12] = { ATAPI_WFM, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 };
441 pt_media_access_cmd(tape, PT_TMO, wm_cmd, "write filemark");
444 #define DBMSG(msg) ((verbose>1)?(msg):NULL)
446 static int pt_reset(struct pt_unit *tape)
448 struct pi_adapter *pi = tape->pi;
449 int i, k, flg;
450 int expect[5] = { 1, 1, 1, 0x14, 0xeb };
452 pi_connect(pi);
453 write_reg(pi, 6, DRIVE(tape));
454 write_reg(pi, 7, 8);
456 pt_sleep(20 * HZ / 1000);
458 k = 0;
459 while ((k++ < PT_RESET_TMO) && (status_reg(pi) & STAT_BUSY))
460 pt_sleep(HZ / 10);
462 flg = 1;
463 for (i = 0; i < 5; i++)
464 flg &= (read_reg(pi, i + 1) == expect[i]);
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");
475 pi_disconnect(pi);
476 return flg - 1;
479 static int pt_ready_wait(struct pt_unit *tape, int tmo)
481 char tr_cmd[12] = { ATAPI_TEST_READY, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
482 int k, p;
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);
496 return 0x000020; /* timeout */
499 static void xs(char *buf, char *targ, int offs, int len)
501 int j, k, l;
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;
513 static int xn(char *buf, int offs, int size)
515 int v, k;
517 v = 0;
518 for (k = 0; k < size; k++)
519 v = v * 256 + (buf[k + offs] & 0xff);
520 return v;
523 static int pt_identify(struct pt_unit *tape)
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];
535 s = pt_atapi(tape, id_cmd, 36, buf, "identify");
536 if (s)
537 return -1;
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;
547 xs(buf, mf, 8, 8);
548 xs(buf, id, 16, 16);
550 tape->flags = 0;
551 tape->capacity = 0;
552 tape->bs = 0;
554 if (!pt_ready_wait(tape, PT_READY_TMO))
555 tape->flags |= PT_MEDIA;
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);
563 if (!pt_atapi(tape, ls_cmd, 36, buf, "log sense"))
564 tape->capacity = xn(buf, 24, 4);
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);
575 return 0;
580 * returns 0, with id set if drive is detected
581 * -1, if drive detection failed
583 static int pt_probe(struct pt_unit *tape)
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);
593 return -1;
596 static int pt_detect(void)
598 struct pt_unit *tape;
599 int specified = 0, found = 0;
600 int unit;
602 printk("%s: %s version %s, major %d\n", name, name, PT_VERSION, major);
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);
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);
640 if (found)
641 return 0;
643 printk("%s: No ATAPI tape drive detected\n", name);
644 return -1;
647 static int pt_open(struct inode *inode, struct file *file)
649 int unit = iminor(inode) & 0x7F;
650 struct pt_unit *tape = pt + unit;
651 int err;
653 if (unit >= PT_UNITS || (!tape->present))
654 return -ENODEV;
656 err = -EBUSY;
657 if (!atomic_dec_and_test(&tape->available))
658 goto out;
660 pt_identify(tape);
662 err = -ENODEV;
663 if (!(tape->flags & PT_MEDIA))
664 goto out;
666 err = -EROFS;
667 if ((!(tape->flags & PT_WRITE_OK)) && (file->f_mode & 2))
668 goto out;
670 if (!(iminor(inode) & 128))
671 tape->flags |= PT_REWIND;
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;
680 file->private_data = tape;
681 return 0;
683 out:
684 atomic_inc(&tape->available);
685 return err;
688 static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
690 struct pt_unit *tape = file->private_data;
691 struct mtop __user *p = (void __user *)arg;
692 struct mtop mtop;
694 switch (cmd) {
695 case MTIOCTOP:
696 if (copy_from_user(&mtop, p, sizeof(struct mtop)))
697 return -EFAULT;
699 switch (mtop.mt_op) {
701 case MTREW:
702 lock_kernel();
703 pt_rewind(tape);
704 unlock_kernel();
705 return 0;
707 case MTWEOF:
708 lock_kernel();
709 pt_write_fm(tape);
710 unlock_kernel();
711 return 0;
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;
720 default:
721 return -ENOTTY;
725 static int
726 pt_release(struct inode *inode, struct file *file)
728 struct pt_unit *tape = file->private_data;
730 if (atomic_read(&tape->available) > 1)
731 return -EINVAL;
733 if (tape->flags & PT_WRITING)
734 pt_write_fm(tape);
736 if (tape->flags & PT_REWIND)
737 pt_rewind(tape);
739 kfree(tape->bufptr);
740 tape->bufptr = NULL;
742 atomic_inc(&tape->available);
744 return 0;
748 static ssize_t pt_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
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;
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;
762 if (tape->flags & PT_EOF)
763 return 0;
765 t = 0;
767 while (count > 0) {
769 if (!pt_poll_dsc(tape, HZ / 100, PT_TMO, "read"))
770 return -EIO;
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 */
778 rd_cmd[4] = b;
780 r = pt_command(tape, rd_cmd, n, "read");
782 mdelay(1);
784 if (r) {
785 pt_req_sense(tape, 0);
786 return -EIO;
789 while (1) {
791 r = pt_wait(tape, STAT_BUSY,
792 STAT_DRQ | STAT_ERR | STAT_READY,
793 DBMSG("read DRQ"), "");
795 if (r & STAT_SENSE) {
796 pi_disconnect(pi);
797 pt_req_sense(tape, 0);
798 return -EIO;
801 if (r)
802 tape->flags |= PT_EOF;
804 s = read_reg(pi, 7);
806 if (!(s & STAT_DRQ))
807 break;
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,
815 return -EIO;
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;
831 t += b;
832 count -= b;
836 pi_disconnect(pi);
837 if (tape->flags & PT_EOF)
838 break;
841 return t;
845 static ssize_t pt_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
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;
852 if (!(tape->flags & PT_WRITE_OK))
853 return -EROFS;
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;
863 if (tape->flags & PT_EOF)
864 return -ENOSPC;
866 t = 0;
868 while (count > 0) {
870 if (!pt_poll_dsc(tape, HZ / 100, PT_TMO, "write"))
871 return -EIO;
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 */
879 wr_cmd[4] = b;
881 r = pt_command(tape, wr_cmd, n, "write");
883 mdelay(1);
885 if (r) { /* error delivering command only */
886 pt_req_sense(tape, 0);
887 return -EIO;
890 while (1) {
892 r = pt_wait(tape, STAT_BUSY,
893 STAT_DRQ | STAT_ERR | STAT_READY,
894 DBMSG("write DRQ"), NULL);
896 if (r & STAT_SENSE) {
897 pi_disconnect(pi);
898 pt_req_sense(tape, 0);
899 return -EIO;
902 if (r)
903 tape->flags |= PT_EOF;
905 s = read_reg(pi, 7);
907 if (!(s & STAT_DRQ))
908 break;
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;
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;
930 pi_write_block(pi, tape->bufptr, k);
931 t += b;
932 count -= b;
933 n -= k;
937 pi_disconnect(pi);
938 if (tape->flags & PT_EOF)
939 break;
942 return t;
945 static int __init pt_init(void)
947 int unit;
948 int err;
950 if (disable) {
951 err = -EINVAL;
952 goto out;
955 if (pt_detect()) {
956 err = -ENODEV;
957 goto out;
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;
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;
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);
982 goto out;
984 out_chrdev:
985 unregister_chrdev(major, "pt");
986 out:
987 return err;
990 static void __exit pt_exit(void)
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));
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);
1005 MODULE_LICENSE("GPL");
1006 module_init(pt_init)
1007 module_exit(pt_exit)