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