1/*
2	pg.c    (c) 1998  Grant R. Guenther <grant@torque.net>
3			  Under the terms of the GNU General Public License.
4
5	The pg driver provides a simple character device interface for
6	sending ATAPI commands to a device.  With the exception of the
7	ATAPI reset operation, all operations are performed by a pair
8	of read and write operations to the appropriate /dev/pgN device.
9	A write operation delivers a command and any outbound data in
10	a single buffer.  Normally, the write will succeed unless the
11	device is offline or malfunctioning, or there is already another
12	command pending.  If the write succeeds, it should be followed
13	immediately by a read operation, to obtain any returned data and
14	status information.  A read will fail if there is no operation
15	in progress.
16
17	As a special case, the device can be reset with a write operation,
18	and in this case, no following read is expected, or permitted.
19
20	There are no ioctl() operations.  Any single operation
21	may transfer at most PG_MAX_DATA bytes.  Note that the driver must
22	copy the data through an internal buffer.  In keeping with all
23	current ATAPI devices, command packets are assumed to be exactly
24	12 bytes in length.
25
26	To permit future changes to this interface, the headers in the
27	read and write buffers contain a single character "magic" flag.
28	Currently this flag must be the character "P".
29
30	By default, the driver will autoprobe for a single parallel
31	port ATAPI device, but if their individual parameters are
32	specified, the driver can handle up to 4 devices.
33
34	To use this device, you must have the following device
35	special files defined:
36
37		/dev/pg0 c 97 0
38		/dev/pg1 c 97 1
39		/dev/pg2 c 97 2
40		/dev/pg3 c 97 3
41
42	(You'll need to change the 97 to something else if you use
43	the 'major' parameter to install the driver on a different
44	major number.)
45
46	The behaviour of the pg driver can be altered by setting
47	some parameters from the insmod command line.  The following
48	parameters are adjustable:
49
50	    drive0      These four arguments can be arrays of
51	    drive1      1-6 integers as follows:
52	    drive2
53	    drive3      <prt>,<pro>,<uni>,<mod>,<slv>,<dly>
54
55			Where,
56
57		<prt>   is the base of the parallel port address for
58			the corresponding drive.  (required)
59
60		<pro>   is the protocol number for the adapter that
61			supports this drive.  These numbers are
62			logged by 'paride' when the protocol modules
63			are initialised.  (0 if not given)
64
65		<uni>   for those adapters that support chained
66			devices, this is the unit selector for the
67			chain of devices on the given port.  It should
68			be zero for devices that don't support chaining.
69			(0 if not given)
70
71		<mod>   this can be -1 to choose the best mode, or one
72			of the mode numbers supported by the adapter.
73			(-1 if not given)
74
75		<slv>   ATAPI devices can be jumpered to master or slave.
76			Set this to 0 to choose the master drive, 1 to
77			choose the slave, -1 (the default) to choose the
78			first drive found.
79
80		<dly>   some parallel ports require the driver to
81			go more slowly.  -1 sets a default value that
82			should work with the chosen protocol.  Otherwise,
83			set this to a small integer, the larger it is
84			the slower the port i/o.  In some cases, setting
85			this to zero will speed up the device. (default -1)
86
87	    major	You may use this parameter to overide the
88			default major number (97) that this driver
89			will use.  Be sure to change the device
90			name as well.
91
92	    name	This parameter is a character string that
93			contains the name the kernel will use for this
94			device (in /proc output, for instance).
95			(default "pg").
96
97	    verbose     This parameter controls the amount of logging
98			that is done by the driver.  Set it to 0 for
99			quiet operation, to 1 to enable progress
100			messages while the driver probes for devices,
101			or to 2 for full debug logging.  (default 0)
102
103	If this driver is built into the kernel, you can use
104	the following command line parameters, with the same values
105	as the corresponding module parameters listed above:
106
107	    pg.drive0
108	    pg.drive1
109	    pg.drive2
110	    pg.drive3
111
112	In addition, you can use the parameter pg.disable to disable
113	the driver entirely.
114
115*/
116
117/* Changes:
118
119	1.01	GRG 1998.06.16	Bug fixes
120	1.02    GRG 1998.09.24  Added jumbo support
121
122*/
123
124#define PG_VERSION      "1.02"
125#define PG_MAJOR	97
126#define PG_NAME		"pg"
127#define PG_UNITS	4
128
129#ifndef PI_PG
130#define PI_PG	4
131#endif
132
133#include <linux/types.h>
134/* Here are things one can override from the insmod command.
135   Most are autoprobed by paride unless set here.  Verbose is 0
136   by default.
137
138*/
139
140static bool verbose = 0;
141static int major = PG_MAJOR;
142static char *name = PG_NAME;
143static int disable = 0;
144
145static int drive0[6] = { 0, 0, 0, -1, -1, -1 };
146static int drive1[6] = { 0, 0, 0, -1, -1, -1 };
147static int drive2[6] = { 0, 0, 0, -1, -1, -1 };
148static int drive3[6] = { 0, 0, 0, -1, -1, -1 };
149
150static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3};
151static int pg_drive_count;
152
153enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_DLY};
154
155/* end of parameters */
156
157#include <linux/module.h>
158#include <linux/init.h>
159#include <linux/fs.h>
160#include <linux/delay.h>
161#include <linux/slab.h>
162#include <linux/mtio.h>
163#include <linux/pg.h>
164#include <linux/device.h>
165#include <linux/sched.h>	/* current, TASK_* */
166#include <linux/mutex.h>
167#include <linux/jiffies.h>
168
169#include <asm/uaccess.h>
170
171module_param(verbose, bool, 0644);
172module_param(major, int, 0);
173module_param(name, charp, 0);
174module_param_array(drive0, int, NULL, 0);
175module_param_array(drive1, int, NULL, 0);
176module_param_array(drive2, int, NULL, 0);
177module_param_array(drive3, int, NULL, 0);
178
179#include "paride.h"
180
181#define PG_SPIN_DEL     50	/* spin delay in micro-seconds  */
182#define PG_SPIN         200
183#define PG_TMO		HZ
184#define PG_RESET_TMO	10*HZ
185
186#define STAT_ERR        0x01
187#define STAT_INDEX      0x02
188#define STAT_ECC        0x04
189#define STAT_DRQ        0x08
190#define STAT_SEEK       0x10
191#define STAT_WRERR      0x20
192#define STAT_READY      0x40
193#define STAT_BUSY       0x80
194
195#define ATAPI_IDENTIFY		0x12
196
197static DEFINE_MUTEX(pg_mutex);
198static int pg_open(struct inode *inode, struct file *file);
199static int pg_release(struct inode *inode, struct file *file);
200static ssize_t pg_read(struct file *filp, char __user *buf,
201		       size_t count, loff_t * ppos);
202static ssize_t pg_write(struct file *filp, const char __user *buf,
203			size_t count, loff_t * ppos);
204static int pg_detect(void);
205
206#define PG_NAMELEN      8
207
208struct pg {
209	struct pi_adapter pia;	/* interface to paride layer */
210	struct pi_adapter *pi;
211	int busy;		/* write done, read expected */
212	int start;		/* jiffies at command start */
213	int dlen;		/* transfer size requested */
214	unsigned long timeout;	/* timeout requested */
215	int status;		/* last sense key */
216	int drive;		/* drive */
217	unsigned long access;	/* count of active opens ... */
218	int present;		/* device present ? */
219	char *bufptr;
220	char name[PG_NAMELEN];	/* pg0, pg1, ... */
221};
222
223static struct pg devices[PG_UNITS];
224
225static int pg_identify(struct pg *dev, int log);
226
227static char pg_scratch[512];	/* scratch block buffer */
228
229static struct class *pg_class;
230
231/* kernel glue structures */
232
233static const struct file_operations pg_fops = {
234	.owner = THIS_MODULE,
235	.read = pg_read,
236	.write = pg_write,
237	.open = pg_open,
238	.release = pg_release,
239	.llseek = noop_llseek,
240};
241
242static void pg_init_units(void)
243{
244	int unit;
245
246	pg_drive_count = 0;
247	for (unit = 0; unit < PG_UNITS; unit++) {
248		int *parm = *drives[unit];
249		struct pg *dev = &devices[unit];
250		dev->pi = &dev->pia;
251		clear_bit(0, &dev->access);
252		dev->busy = 0;
253		dev->present = 0;
254		dev->bufptr = NULL;
255		dev->drive = parm[D_SLV];
256		snprintf(dev->name, PG_NAMELEN, "%s%c", name, 'a'+unit);
257		if (parm[D_PRT])
258			pg_drive_count++;
259	}
260}
261
262static inline int status_reg(struct pg *dev)
263{
264	return pi_read_regr(dev->pi, 1, 6);
265}
266
267static inline int read_reg(struct pg *dev, int reg)
268{
269	return pi_read_regr(dev->pi, 0, reg);
270}
271
272static inline void write_reg(struct pg *dev, int reg, int val)
273{
274	pi_write_regr(dev->pi, 0, reg, val);
275}
276
277static inline u8 DRIVE(struct pg *dev)
278{
279	return 0xa0+0x10*dev->drive;
280}
281
282static void pg_sleep(int cs)
283{
284	schedule_timeout_interruptible(cs);
285}
286
287static int pg_wait(struct pg *dev, int go, int stop, unsigned long tmo, char *msg)
288{
289	int j, r, e, s, p, to;
290
291	dev->status = 0;
292
293	j = 0;
294	while ((((r = status_reg(dev)) & go) || (stop && (!(r & stop))))
295	       && time_before(jiffies, tmo)) {
296		if (j++ < PG_SPIN)
297			udelay(PG_SPIN_DEL);
298		else
299			pg_sleep(1);
300	}
301
302	to = time_after_eq(jiffies, tmo);
303
304	if ((r & (STAT_ERR & stop)) || to) {
305		s = read_reg(dev, 7);
306		e = read_reg(dev, 1);
307		p = read_reg(dev, 2);
308		if (verbose > 1)
309			printk("%s: %s: stat=0x%x err=0x%x phase=%d%s\n",
310			       dev->name, msg, s, e, p, to ? " timeout" : "");
311		if (to)
312			e |= 0x100;
313		dev->status = (e >> 4) & 0xff;
314		return -1;
315	}
316	return 0;
317}
318
319static int pg_command(struct pg *dev, char *cmd, int dlen, unsigned long tmo)
320{
321	int k;
322
323	pi_connect(dev->pi);
324
325	write_reg(dev, 6, DRIVE(dev));
326
327	if (pg_wait(dev, STAT_BUSY | STAT_DRQ, 0, tmo, "before command"))
328		goto fail;
329
330	write_reg(dev, 4, dlen % 256);
331	write_reg(dev, 5, dlen / 256);
332	write_reg(dev, 7, 0xa0);	/* ATAPI packet command */
333
334	if (pg_wait(dev, STAT_BUSY, STAT_DRQ, tmo, "command DRQ"))
335		goto fail;
336
337	if (read_reg(dev, 2) != 1) {
338		printk("%s: command phase error\n", dev->name);
339		goto fail;
340	}
341
342	pi_write_block(dev->pi, cmd, 12);
343
344	if (verbose > 1) {
345		printk("%s: Command sent, dlen=%d packet= ", dev->name, dlen);
346		for (k = 0; k < 12; k++)
347			printk("%02x ", cmd[k] & 0xff);
348		printk("\n");
349	}
350	return 0;
351fail:
352	pi_disconnect(dev->pi);
353	return -1;
354}
355
356static int pg_completion(struct pg *dev, char *buf, unsigned long tmo)
357{
358	int r, d, n, p;
359
360	r = pg_wait(dev, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
361		    tmo, "completion");
362
363	dev->dlen = 0;
364
365	while (read_reg(dev, 7) & STAT_DRQ) {
366		d = (read_reg(dev, 4) + 256 * read_reg(dev, 5));
367		n = ((d + 3) & 0xfffc);
368		p = read_reg(dev, 2) & 3;
369		if (p == 0)
370			pi_write_block(dev->pi, buf, n);
371		if (p == 2)
372			pi_read_block(dev->pi, buf, n);
373		if (verbose > 1)
374			printk("%s: %s %d bytes\n", dev->name,
375			       p ? "Read" : "Write", n);
376		dev->dlen += (1 - p) * d;
377		buf += d;
378		r = pg_wait(dev, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
379			    tmo, "completion");
380	}
381
382	pi_disconnect(dev->pi);
383
384	return r;
385}
386
387static int pg_reset(struct pg *dev)
388{
389	int i, k, err;
390	int expect[5] = { 1, 1, 1, 0x14, 0xeb };
391	int got[5];
392
393	pi_connect(dev->pi);
394	write_reg(dev, 6, DRIVE(dev));
395	write_reg(dev, 7, 8);
396
397	pg_sleep(20 * HZ / 1000);
398
399	k = 0;
400	while ((k++ < PG_RESET_TMO) && (status_reg(dev) & STAT_BUSY))
401		pg_sleep(1);
402
403	for (i = 0; i < 5; i++)
404		got[i] = read_reg(dev, i + 1);
405
406	err = memcmp(expect, got, sizeof(got)) ? -1 : 0;
407
408	if (verbose) {
409		printk("%s: Reset (%d) signature = ", dev->name, k);
410		for (i = 0; i < 5; i++)
411			printk("%3x", got[i]);
412		if (err)
413			printk(" (incorrect)");
414		printk("\n");
415	}
416
417	pi_disconnect(dev->pi);
418	return err;
419}
420
421static void xs(char *buf, char *targ, int len)
422{
423	char l = '\0';
424	int k;
425
426	for (k = 0; k < len; k++) {
427		char c = *buf++;
428		if (c != ' ' && c != l)
429			l = *targ++ = c;
430	}
431	if (l == ' ')
432		targ--;
433	*targ = '\0';
434}
435
436static int pg_identify(struct pg *dev, int log)
437{
438	int s;
439	char *ms[2] = { "master", "slave" };
440	char mf[10], id[18];
441	char id_cmd[12] = { ATAPI_IDENTIFY, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
442	char buf[36];
443
444	s = pg_command(dev, id_cmd, 36, jiffies + PG_TMO);
445	if (s)
446		return -1;
447	s = pg_completion(dev, buf, jiffies + PG_TMO);
448	if (s)
449		return -1;
450
451	if (log) {
452		xs(buf + 8, mf, 8);
453		xs(buf + 16, id, 16);
454		printk("%s: %s %s, %s\n", dev->name, mf, id, ms[dev->drive]);
455	}
456
457	return 0;
458}
459
460/*
461 * returns  0, with id set if drive is detected
462 *	   -1, if drive detection failed
463 */
464static int pg_probe(struct pg *dev)
465{
466	if (dev->drive == -1) {
467		for (dev->drive = 0; dev->drive <= 1; dev->drive++)
468			if (!pg_reset(dev))
469				return pg_identify(dev, 1);
470	} else {
471		if (!pg_reset(dev))
472			return pg_identify(dev, 1);
473	}
474	return -1;
475}
476
477static int pg_detect(void)
478{
479	struct pg *dev = &devices[0];
480	int k, unit;
481
482	printk("%s: %s version %s, major %d\n", name, name, PG_VERSION, major);
483
484	k = 0;
485	if (pg_drive_count == 0) {
486		if (pi_init(dev->pi, 1, -1, -1, -1, -1, -1, pg_scratch,
487			    PI_PG, verbose, dev->name)) {
488			if (!pg_probe(dev)) {
489				dev->present = 1;
490				k++;
491			} else
492				pi_release(dev->pi);
493		}
494
495	} else
496		for (unit = 0; unit < PG_UNITS; unit++, dev++) {
497			int *parm = *drives[unit];
498			if (!parm[D_PRT])
499				continue;
500			if (pi_init(dev->pi, 0, parm[D_PRT], parm[D_MOD],
501				    parm[D_UNI], parm[D_PRO], parm[D_DLY],
502				    pg_scratch, PI_PG, verbose, dev->name)) {
503				if (!pg_probe(dev)) {
504					dev->present = 1;
505					k++;
506				} else
507					pi_release(dev->pi);
508			}
509		}
510
511	if (k)
512		return 0;
513
514	printk("%s: No ATAPI device detected\n", name);
515	return -1;
516}
517
518static int pg_open(struct inode *inode, struct file *file)
519{
520	int unit = iminor(inode) & 0x7f;
521	struct pg *dev = &devices[unit];
522	int ret = 0;
523
524	mutex_lock(&pg_mutex);
525	if ((unit >= PG_UNITS) || (!dev->present)) {
526		ret = -ENODEV;
527		goto out;
528	}
529
530	if (test_and_set_bit(0, &dev->access)) {
531		ret = -EBUSY;
532		goto out;
533	}
534
535	if (dev->busy) {
536		pg_reset(dev);
537		dev->busy = 0;
538	}
539
540	pg_identify(dev, (verbose > 1));
541
542	dev->bufptr = kmalloc(PG_MAX_DATA, GFP_KERNEL);
543	if (dev->bufptr == NULL) {
544		clear_bit(0, &dev->access);
545		printk("%s: buffer allocation failed\n", dev->name);
546		ret = -ENOMEM;
547		goto out;
548	}
549
550	file->private_data = dev;
551
552out:
553	mutex_unlock(&pg_mutex);
554	return ret;
555}
556
557static int pg_release(struct inode *inode, struct file *file)
558{
559	struct pg *dev = file->private_data;
560
561	kfree(dev->bufptr);
562	dev->bufptr = NULL;
563	clear_bit(0, &dev->access);
564
565	return 0;
566}
567
568static ssize_t pg_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos)
569{
570	struct pg *dev = filp->private_data;
571	struct pg_write_hdr hdr;
572	int hs = sizeof (hdr);
573
574	if (dev->busy)
575		return -EBUSY;
576	if (count < hs)
577		return -EINVAL;
578
579	if (copy_from_user(&hdr, buf, hs))
580		return -EFAULT;
581
582	if (hdr.magic != PG_MAGIC)
583		return -EINVAL;
584	if (hdr.dlen > PG_MAX_DATA)
585		return -EINVAL;
586	if ((count - hs) > PG_MAX_DATA)
587		return -EINVAL;
588
589	if (hdr.func == PG_RESET) {
590		if (count != hs)
591			return -EINVAL;
592		if (pg_reset(dev))
593			return -EIO;
594		return count;
595	}
596
597	if (hdr.func != PG_COMMAND)
598		return -EINVAL;
599
600	dev->start = jiffies;
601	dev->timeout = hdr.timeout * HZ + HZ / 2 + jiffies;
602
603	if (pg_command(dev, hdr.packet, hdr.dlen, jiffies + PG_TMO)) {
604		if (dev->status & 0x10)
605			return -ETIME;
606		return -EIO;
607	}
608
609	dev->busy = 1;
610
611	if (copy_from_user(dev->bufptr, buf + hs, count - hs))
612		return -EFAULT;
613	return count;
614}
615
616static ssize_t pg_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
617{
618	struct pg *dev = filp->private_data;
619	struct pg_read_hdr hdr;
620	int hs = sizeof (hdr);
621	int copy;
622
623	if (!dev->busy)
624		return -EINVAL;
625	if (count < hs)
626		return -EINVAL;
627
628	dev->busy = 0;
629
630	if (pg_completion(dev, dev->bufptr, dev->timeout))
631		if (dev->status & 0x10)
632			return -ETIME;
633
634	memset(&hdr, 0, sizeof(hdr));
635	hdr.magic = PG_MAGIC;
636	hdr.dlen = dev->dlen;
637	copy = 0;
638
639	if (hdr.dlen < 0) {
640		hdr.dlen = -1 * hdr.dlen;
641		copy = hdr.dlen;
642		if (copy > (count - hs))
643			copy = count - hs;
644	}
645
646	hdr.duration = (jiffies - dev->start + HZ / 2) / HZ;
647	hdr.scsi = dev->status & 0x0f;
648
649	if (copy_to_user(buf, &hdr, hs))
650		return -EFAULT;
651	if (copy > 0)
652		if (copy_to_user(buf + hs, dev->bufptr, copy))
653			return -EFAULT;
654	return copy + hs;
655}
656
657static int __init pg_init(void)
658{
659	int unit;
660	int err;
661
662	if (disable){
663		err = -EINVAL;
664		goto out;
665	}
666
667	pg_init_units();
668
669	if (pg_detect()) {
670		err = -ENODEV;
671		goto out;
672	}
673
674	err = register_chrdev(major, name, &pg_fops);
675	if (err < 0) {
676		printk("pg_init: unable to get major number %d\n", major);
677		for (unit = 0; unit < PG_UNITS; unit++) {
678			struct pg *dev = &devices[unit];
679			if (dev->present)
680				pi_release(dev->pi);
681		}
682		goto out;
683	}
684	major = err;	/* In case the user specified `major=0' (dynamic) */
685	pg_class = class_create(THIS_MODULE, "pg");
686	if (IS_ERR(pg_class)) {
687		err = PTR_ERR(pg_class);
688		goto out_chrdev;
689	}
690	for (unit = 0; unit < PG_UNITS; unit++) {
691		struct pg *dev = &devices[unit];
692		if (dev->present)
693			device_create(pg_class, NULL, MKDEV(major, unit), NULL,
694				      "pg%u", unit);
695	}
696	err = 0;
697	goto out;
698
699out_chrdev:
700	unregister_chrdev(major, "pg");
701out:
702	return err;
703}
704
705static void __exit pg_exit(void)
706{
707	int unit;
708
709	for (unit = 0; unit < PG_UNITS; unit++) {
710		struct pg *dev = &devices[unit];
711		if (dev->present)
712			device_destroy(pg_class, MKDEV(major, unit));
713	}
714	class_destroy(pg_class);
715	unregister_chrdev(major, name);
716
717	for (unit = 0; unit < PG_UNITS; unit++) {
718		struct pg *dev = &devices[unit];
719		if (dev->present)
720			pi_release(dev->pi);
721	}
722}
723
724MODULE_LICENSE("GPL");
725module_init(pg_init)
726module_exit(pg_exit)
727