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