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:
30 drive3 <prt>,<pro>,<uni>,<mod>,<slv>,<dly>
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.
48 <mod> this can be -1 to choose the best mode, or one
49 of the mode numbers supported by the adapter.
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
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
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).
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
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:
89 In addition, you can use the parameter pt.disable to disable
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.
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,
103 1.04 GRG 1998.09.24 Repair minor coding error, added jumbo support
107 #define PT_VERSION "1.04"
112 /* Here are things one can override from the insmod command.
113 Most are autoprobed by paride unless set here. Verbose is on
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};
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/devfs_fs_kernel.h>
145 #include <linux/delay.h>
146 #include <linux/slab.h>
147 #include <linux/mtio.h>
149 #include <asm/uaccess.h>
155 static STT pt_stt[5] = {
156 {"drive0", 6, drive0},
157 {"drive1", 6, drive1},
158 {"drive2", 6, drive2},
159 {"drive3", 6, drive3},
160 {"disable", 1, &disable}
164 pt_setup(char *str, int *ints)
166 generic_setup(pt_stt, 5, str);
171 MODULE_PARM(verbose, "i");
172 MODULE_PARM(major, "i");
173 MODULE_PARM(name, "s");
174 MODULE_PARM(drive0, "1-6i");
175 MODULE_PARM(drive1, "1-6i");
176 MODULE_PARM(drive2, "1-6i");
177 MODULE_PARM(drive3, "1-6i");
181 #define PT_MAX_RETRIES 5
182 #define PT_TMO 3000 /* interrupt timeout in jiffies */
183 #define PT_SPIN_DEL 50 /* spin delay in micro-seconds */
184 #define PT_RESET_TMO 30 /* 30 seconds */
185 #define PT_READY_TMO 60 /* 60 seconds */
186 #define PT_REWIND_TMO 1200 /* 20 minutes */
188 #define PT_SPIN ((1000000/(HZ*PT_SPIN_DEL))*PT_TMO)
190 #define STAT_ERR 0x00001
191 #define STAT_INDEX 0x00002
192 #define STAT_ECC 0x00004
193 #define STAT_DRQ 0x00008
194 #define STAT_SEEK 0x00010
195 #define STAT_WRERR 0x00020
196 #define STAT_READY 0x00040
197 #define STAT_BUSY 0x00080
198 #define STAT_SENSE 0x1f000
200 #define ATAPI_TEST_READY 0x00
201 #define ATAPI_REWIND 0x01
202 #define ATAPI_REQ_SENSE 0x03
203 #define ATAPI_READ_6 0x08
204 #define ATAPI_WRITE_6 0x0a
205 #define ATAPI_WFM 0x10
206 #define ATAPI_IDENTIFY 0x12
207 #define ATAPI_MODE_SENSE 0x1a
208 #define ATAPI_LOG_SENSE 0x4d
210 static int pt_open(struct inode *inode, struct file *file);
211 static int pt_ioctl(struct inode *inode, struct file *file,
212 unsigned int cmd, unsigned long arg);
213 static int pt_release(struct inode *inode, struct file *file);
214 static ssize_t pt_read(struct file *filp, char *buf,
215 size_t count, loff_t * ppos);
216 static ssize_t pt_write(struct file *filp, const char *buf,
217 size_t count, loff_t * ppos);
218 static int pt_detect(void);
220 /* bits in tape->flags */
223 #define PT_WRITE_OK 2
226 #define PT_READING 16
230 #define PT_BUFSIZE 16384
233 struct pi_adapter pia; /* interface to paride layer */
234 struct pi_adapter *pi;
235 int flags; /* various state flags */
236 int last_sense; /* result of last request sense */
237 int drive; /* drive */
238 atomic_t available; /* 1 if access is available 0 otherwise */
239 int bs; /* block size */
240 int capacity; /* Size of tape in KB */
241 int present; /* device present ? */
243 char name[PT_NAMELEN]; /* pf0, pf1, ... */
246 static int pt_identify(struct pt_unit *tape);
248 struct pt_unit pt[PT_UNITS];
250 static char pt_scratch[512]; /* scratch block buffer */
252 /* kernel glue structures */
254 static struct file_operations pt_fops = {
255 .owner = THIS_MODULE,
260 .release = pt_release,
263 static inline int status_reg(struct pi_adapter *pi)
265 return pi_read_regr(pi, 1, 6);
268 static inline int read_reg(struct pi_adapter *pi, int reg)
270 return pi_read_regr(pi, 0, reg);
273 static inline void write_reg(struct pi_adapter *pi, int reg, int val)
275 pi_write_regr(pi, 0, reg, val);
278 static inline u8 DRIVE(struct pt_unit *tape)
280 return 0xa0+0x10*tape->drive;
283 static int pt_wait(struct pt_unit *tape, int go, int stop, char *fun, char *msg)
286 struct pi_adapter *pi = tape->pi;
289 while ((((r = status_reg(pi)) & go) || (stop && (!(r & stop))))
293 if ((r & (STAT_ERR & stop)) || (j >= PT_SPIN)) {
300 printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"
301 " loop=%d phase=%d\n",
302 tape->name, fun, msg, r, s, e, j, p);
308 static int pt_command(struct pt_unit *tape, char *cmd, int dlen, char *fun)
310 struct pi_adapter *pi = tape->pi;
313 write_reg(pi, 6, DRIVE(tape));
315 if (pt_wait(tape, STAT_BUSY | STAT_DRQ, 0, fun, "before command")) {
320 write_reg(pi, 4, dlen % 256);
321 write_reg(pi, 5, dlen / 256);
322 write_reg(pi, 7, 0xa0); /* ATAPI packet command */
324 if (pt_wait(tape, STAT_BUSY, STAT_DRQ, fun, "command DRQ")) {
329 if (read_reg(pi, 2) != 1) {
330 printk("%s: %s: command phase error\n", tape->name, fun);
335 pi_write_block(pi, cmd, 12);
340 static int pt_completion(struct pt_unit *tape, char *buf, char *fun)
342 struct pi_adapter *pi = tape->pi;
345 r = pt_wait(tape, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
348 if (read_reg(pi, 7) & STAT_DRQ) {
349 n = (((read_reg(pi, 4) + 256 * read_reg(pi, 5)) +
351 p = read_reg(pi, 2) & 3;
353 pi_write_block(pi, buf, n);
355 pi_read_block(pi, buf, n);
358 s = pt_wait(tape, STAT_BUSY, STAT_READY | STAT_ERR, fun, "data done");
365 static void pt_req_sense(struct pt_unit *tape, int quiet)
367 char rs_cmd[12] = { ATAPI_REQ_SENSE, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
371 r = pt_command(tape, rs_cmd, 16, "Request sense");
374 pt_completion(tape, buf, "Request sense");
376 tape->last_sense = -1;
379 printk("%s: Sense key: %x, ASC: %x, ASQ: %x\n",
380 tape->name, buf[2] & 0xf, buf[12], buf[13]);
381 tape->last_sense = (buf[2] & 0xf) | ((buf[12] & 0xff) << 8)
382 | ((buf[13] & 0xff) << 16);
386 static int pt_atapi(struct pt_unit *tape, char *cmd, int dlen, char *buf, char *fun)
390 r = pt_command(tape, cmd, dlen, fun);
393 r = pt_completion(tape, buf, fun);
395 pt_req_sense(tape, !fun);
400 static void pt_sleep(int cs)
402 current->state = TASK_INTERRUPTIBLE;
403 schedule_timeout(cs);
406 static int pt_poll_dsc(struct pt_unit *tape, int pause, int tmo, char *msg)
408 struct pi_adapter *pi = tape->pi;
418 write_reg(pi, 6, DRIVE(tape));
422 if (s & (STAT_ERR | STAT_SEEK))
425 if ((k >= tmo) || (s & STAT_ERR)) {
427 printk("%s: %s DSC timeout\n", tape->name, msg);
429 printk("%s: %s stat=0x%x err=0x%x\n", tape->name, msg, s,
431 pt_req_sense(tape, 0);
437 static void pt_media_access_cmd(struct pt_unit *tape, int tmo, char *cmd, char *fun)
439 if (pt_command(tape, cmd, 0, fun)) {
440 pt_req_sense(tape, 0);
443 pi_disconnect(tape->pi);
444 pt_poll_dsc(tape, HZ, tmo, fun);
447 static void pt_rewind(struct pt_unit *tape)
449 char rw_cmd[12] = { ATAPI_REWIND, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
451 pt_media_access_cmd(tape, PT_REWIND_TMO, rw_cmd, "rewind");
454 static void pt_write_fm(struct pt_unit *tape)
456 char wm_cmd[12] = { ATAPI_WFM, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 };
458 pt_media_access_cmd(tape, PT_TMO, wm_cmd, "write filemark");
461 #define DBMSG(msg) ((verbose>1)?(msg):NULL)
463 static int pt_reset(struct pt_unit *tape)
465 struct pi_adapter *pi = tape->pi;
467 int expect[5] = { 1, 1, 1, 0x14, 0xeb };
470 write_reg(pi, 6, DRIVE(tape));
473 pt_sleep(20 * HZ / 1000);
476 while ((k++ < PT_RESET_TMO) && (status_reg(pi) & STAT_BUSY))
480 for (i = 0; i < 5; i++)
481 flg &= (read_reg(pi, i + 1) == expect[i]);
484 printk("%s: Reset (%d) signature = ", tape->name, k);
485 for (i = 0; i < 5; i++)
486 printk("%3x", read_reg(pi, i + 1));
488 printk(" (incorrect)");
496 static int pt_ready_wait(struct pt_unit *tape, int tmo)
498 char tr_cmd[12] = { ATAPI_TEST_READY, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
503 tape->last_sense = 0;
504 pt_atapi(tape, tr_cmd, 0, NULL, DBMSG("test unit ready"));
505 p = tape->last_sense;
508 if (!(((p & 0xffff) == 0x0402) || ((p & 0xff) == 6)))
513 return 0x000020; /* timeout */
516 static void xs(char *buf, char *targ, int offs, int len)
522 for (k = 0; k < len; k++)
523 if ((buf[k + offs] != 0x20) || (buf[k + offs] != l))
524 l = targ[j++] = buf[k + offs];
530 static int xn(char *buf, int offs, int size)
535 for (k = 0; k < size; k++)
536 v = v * 256 + (buf[k + offs] & 0xff);
540 static int pt_identify(struct pt_unit *tape)
543 char *ms[2] = { "master", "slave" };
545 char id_cmd[12] = { ATAPI_IDENTIFY, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
547 { ATAPI_MODE_SENSE, 0, 0x2a, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
549 { ATAPI_LOG_SENSE, 0, 0x71, 0, 0, 0, 0, 0, 36, 0, 0, 0 };
552 s = pt_atapi(tape, id_cmd, 36, buf, "identify");
559 printk("%s: Drive %d, unsupported type %d\n",
560 tape->name, tape->drive, dt);
571 if (!pt_ready_wait(tape, PT_READY_TMO))
572 tape->flags |= PT_MEDIA;
574 if (!pt_atapi(tape, ms_cmd, 36, buf, "mode sense")) {
575 if (!(buf[2] & 0x80))
576 tape->flags |= PT_WRITE_OK;
577 tape->bs = xn(buf, 10, 2);
580 if (!pt_atapi(tape, ls_cmd, 36, buf, "log sense"))
581 tape->capacity = xn(buf, 24, 4);
583 printk("%s: %s %s, %s", tape->name, mf, id, ms[tape->drive]);
584 if (!(tape->flags & PT_MEDIA))
585 printk(", no media\n");
587 if (!(tape->flags & PT_WRITE_OK))
589 printk(", blocksize %d, %d MB\n", tape->bs, tape->capacity / 1024);
597 * returns 0, with id set if drive is detected
598 * -1, if drive detection failed
600 static int pt_probe(struct pt_unit *tape)
602 if (tape->drive == -1) {
603 for (tape->drive = 0; tape->drive <= 1; tape->drive++)
605 return pt_identify(tape);
608 return pt_identify(tape);
613 static int pt_detect(void)
615 struct pt_unit *tape;
616 int specified = 0, found = 0;
619 printk("%s: %s version %s, major %d\n", name, name, PT_VERSION, major);
622 for (unit = 0; unit < PT_UNITS; unit++) {
623 struct pt_unit *tape = &pt[unit];
624 tape->pi = &tape->pia;
625 atomic_set(&tape->available, 1);
627 tape->last_sense = 0;
630 tape->drive = DU[D_SLV];
631 snprintf(tape->name, PT_NAMELEN, "%s%d", name, unit);
635 if (pi_init(tape->pi, 0, DU[D_PRT], DU[D_MOD], DU[D_UNI],
636 DU[D_PRO], DU[D_DLY], pt_scratch, PI_PT,
637 verbose, tape->name)) {
638 if (!pt_probe(tape)) {
642 pi_release(tape->pi);
645 if (specified == 0) {
647 if (pi_init(tape->pi, 1, -1, -1, -1, -1, -1, pt_scratch,
648 PI_PT, verbose, tape->name)) {
649 if (!pt_probe(tape)) {
653 pi_release(tape->pi);
660 printk("%s: No ATAPI tape drive detected\n", name);
664 static int pt_open(struct inode *inode, struct file *file)
666 int unit = iminor(inode) & 0x7F;
667 struct pt_unit *tape = pt + unit;
670 if (unit >= PT_UNITS || (!tape->present))
674 if (!atomic_dec_and_test(&tape->available))
680 if (!tape->flags & PT_MEDIA)
684 if ((!tape->flags & PT_WRITE_OK) && (file->f_mode & 2))
687 if (!(iminor(inode) & 128))
688 tape->flags |= PT_REWIND;
691 tape->bufptr = kmalloc(PT_BUFSIZE, GFP_KERNEL);
692 if (tape->bufptr == NULL) {
693 printk("%s: buffer allocation failed\n", tape->name);
697 file->private_data = tape;
701 atomic_inc(&tape->available);
705 static int pt_ioctl(struct inode *inode, struct file *file,
706 unsigned int cmd, unsigned long arg)
708 struct pt_unit *tape = file->private_data;
713 if (copy_from_user((char *) &mtop, (char *) arg,
714 sizeof (struct mtop)))
717 switch (mtop.mt_op) {
728 printk("%s: Unimplemented mt_op %d\n", tape->name,
734 printk("%s: Unimplemented ioctl 0x%x\n", tape->name, cmd);
741 pt_release(struct inode *inode, struct file *file)
743 struct pt_unit *tape = file->private_data;
745 if (atomic_read(&tape->available) > 1)
748 if (tape->flags & PT_WRITING)
751 if (tape->flags & PT_REWIND)
757 atomic_inc(&tape->available);
763 static ssize_t pt_read(struct file *filp, char *buf, size_t count, loff_t * ppos)
765 struct pt_unit *tape = filp->private_data;
766 struct pi_adapter *pi = tape->pi;
767 char rd_cmd[12] = { ATAPI_READ_6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
768 int k, n, r, p, s, t, b;
770 if (!(tape->flags & (PT_READING | PT_WRITING))) {
771 tape->flags |= PT_READING;
772 if (pt_atapi(tape, rd_cmd, 0, NULL, "start read-ahead"))
774 } else if (tape->flags & PT_WRITING)
777 if (tape->flags & PT_EOF)
784 if (!pt_poll_dsc(tape, HZ / 100, PT_TMO, "read"))
789 n = 32768; /* max per command */
790 b = (n - 1 + tape->bs) / tape->bs;
791 n = b * tape->bs; /* rounded up to even block */
795 r = pt_command(tape, rd_cmd, n, "read");
800 pt_req_sense(tape, 0);
806 r = pt_wait(tape, STAT_BUSY,
807 STAT_DRQ | STAT_ERR | STAT_READY,
808 DBMSG("read DRQ"), "");
810 if (r & STAT_SENSE) {
812 pt_req_sense(tape, 0);
817 tape->flags |= PT_EOF;
824 n = (read_reg(pi, 4) + 256 * read_reg(pi, 5));
825 p = (read_reg(pi, 2) & 3);
828 printk("%s: Phase error on read: %d\n", tape->name,
837 pi_read_block(pi, tape->bufptr, k);
842 if (copy_to_user(buf + t, tape->bufptr, b)) {
852 if (tape->flags & PT_EOF)
860 static ssize_t pt_write(struct file *filp, const char *buf, size_t count, loff_t * ppos)
862 struct pt_unit *tape = filp->private_data;
863 struct pi_adapter *pi = tape->pi;
864 char wr_cmd[12] = { ATAPI_WRITE_6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
865 int k, n, r, p, s, t, b;
867 if (!(tape->flags & PT_WRITE_OK))
870 if (!(tape->flags & (PT_READING | PT_WRITING))) {
871 tape->flags |= PT_WRITING;
873 (tape, wr_cmd, 0, NULL, "start buffer-available mode"))
875 } else if (tape->flags & PT_READING)
878 if (tape->flags & PT_EOF)
885 if (!pt_poll_dsc(tape, HZ / 100, PT_TMO, "write"))
890 n = 32768; /* max per command */
891 b = (n - 1 + tape->bs) / tape->bs;
892 n = b * tape->bs; /* rounded up to even block */
896 r = pt_command(tape, wr_cmd, n, "write");
900 if (r) { /* error delivering command only */
901 pt_req_sense(tape, 0);
907 r = pt_wait(tape, STAT_BUSY,
908 STAT_DRQ | STAT_ERR | STAT_READY,
909 DBMSG("write DRQ"), NULL);
911 if (r & STAT_SENSE) {
913 pt_req_sense(tape, 0);
918 tape->flags |= PT_EOF;
925 n = (read_reg(pi, 4) + 256 * read_reg(pi, 5));
926 p = (read_reg(pi, 2) & 3);
929 printk("%s: Phase error on write: %d \n",
941 if (copy_from_user(tape->bufptr, buf + t, b)) {
945 pi_write_block(pi, tape->bufptr, k);
953 if (tape->flags & PT_EOF)
960 static int __init pt_init(void)
970 if (register_chrdev(major, name, &pt_fops)) {
971 printk("pt_init: unable to get major number %d\n", major);
972 for (unit = 0; unit < PT_UNITS; unit++)
973 if (pt[unit].present)
974 pi_release(pt[unit].pi);
979 for (unit = 0; unit < PT_UNITS; unit++)
980 if (pt[unit].present) {
981 devfs_mk_cdev(MKDEV(major, unit),
982 S_IFCHR | S_IRUSR | S_IWUSR,
984 devfs_mk_cdev(MKDEV(major, unit + 128),
985 S_IFCHR | S_IRUSR | S_IWUSR,
991 static void __exit pt_exit(void)
994 for (unit = 0; unit < PT_UNITS; unit++)
995 if (pt[unit].present) {
996 devfs_remove("pt/%d", unit);
997 devfs_remove("pt/%dn", unit);
1000 unregister_chrdev(major, name);
1001 for (unit = 0; unit < PT_UNITS; unit++)
1002 if (pt[unit].present)
1003 pi_release(pt[unit].pi);
1006 MODULE_LICENSE("GPL");
1007 module_init(pt_init)
1008 module_exit(pt_exit)