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
120static bool verbose = 0;
121static int major = PT_MAJOR;
122static char *name = PT_NAME;
123static int disable = 0;
124
125static int drive0[6] = { 0, 0, 0, -1, -1, -1 };
126static int drive1[6] = { 0, 0, 0, -1, -1, -1 };
127static int drive2[6] = { 0, 0, 0, -1, -1, -1 };
128static int drive3[6] = { 0, 0, 0, -1, -1, -1 };
129
130static 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
155module_param(verbose, bool, 0);
156module_param(major, int, 0);
157module_param(name, charp, 0);
158module_param_array(drive0, int, NULL, 0);
159module_param_array(drive1, int, NULL, 0);
160module_param_array(drive2, int, NULL, 0);
161module_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
194static DEFINE_MUTEX(pt_mutex);
195static int pt_open(struct inode *inode, struct file *file);
196static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
197static int pt_release(struct inode *inode, struct file *file);
198static ssize_t pt_read(struct file *filp, char __user *buf,
199		       size_t count, loff_t * ppos);
200static ssize_t pt_write(struct file *filp, const char __user *buf,
201			size_t count, loff_t * ppos);
202static 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
216struct 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
230static int pt_identify(struct pt_unit *tape);
231
232static struct pt_unit pt[PT_UNITS];
233
234static char pt_scratch[512];	/* scratch block buffer */
235
236/* kernel glue structures */
237
238static 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 */
249static struct class *pt_class;
250
251static inline int status_reg(struct pi_adapter *pi)
252{
253	return pi_read_regr(pi, 1, 6);
254}
255
256static inline int read_reg(struct pi_adapter *pi, int reg)
257{
258	return pi_read_regr(pi, 0, reg);
259}
260
261static inline void write_reg(struct pi_adapter *pi, int reg, int val)
262{
263	pi_write_regr(pi, 0, reg, val);
264}
265
266static inline u8 DRIVE(struct pt_unit *tape)
267{
268	return 0xa0+0x10*tape->drive;
269}
270
271static 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
296static 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
328static 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
353static 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
374static 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
388static void pt_sleep(int cs)
389{
390	schedule_timeout_interruptible(cs);
391}
392
393static 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
424static 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
434static 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
441static 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
450static 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
483static 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
503static 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
517static 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
527static 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 */
587static 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
600static 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
651static 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
691out:
692	atomic_inc(&tape->available);
693	mutex_unlock(&pt_mutex);
694	return err;
695}
696
697static 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
734static int
735pt_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
757static 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
854static 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
954static 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
993out_chrdev:
994	unregister_chrdev(major, "pt");
995out:
996	return err;
997}
998
999static 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
1014MODULE_LICENSE("GPL");
1015module_init(pt_init)
1016module_exit(pt_exit)
1017