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/* Here are things one can override from the insmod command.
134   Most are autoprobed by paride unless set here.  Verbose is 0
135   by default.
136
137*/
138
139static int verbose = 0;
140static int major = PG_MAJOR;
141static char *name = PG_NAME;
142static int disable = 0;
143
144static int drive0[6] = { 0, 0, 0, -1, -1, -1 };
145static int drive1[6] = { 0, 0, 0, -1, -1, -1 };
146static int drive2[6] = { 0, 0, 0, -1, -1, -1 };
147static int drive3[6] = { 0, 0, 0, -1, -1, -1 };
148
149static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3};
150static int pg_drive_count;
151
152enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_DLY};
153
154/* end of parameters */
155
156#include <linux/module.h>
157#include <linux/init.h>
158#include <linux/fs.h>
159#include <linux/delay.h>
160#include <linux/slab.h>
161#include <linux/mtio.h>
162#include <linux/pg.h>
163#include <linux/device.h>
164#include <linux/sched.h>	/* current, TASK_* */
165#include <linux/smp_lock.h>
166#include <linux/jiffies.h>
167
168#include <asm/uaccess.h>
169
170module_param(verbose, bool, 0644);
171module_param(major, int, 0);
172module_param(name, charp, 0);
173module_param_array(drive0, int, NULL, 0);
174module_param_array(drive1, int, NULL, 0);
175module_param_array(drive2, int, NULL, 0);
176module_param_array(drive3, int, NULL, 0);
177
178#include "paride.h"
179
180#define PG_SPIN_DEL     50	/* spin delay in micro-seconds  */
181#define PG_SPIN         200
182#define PG_TMO		HZ
183#define PG_RESET_TMO	10*HZ
184
185#define STAT_ERR        0x01
186#define STAT_INDEX      0x02
187#define STAT_ECC        0x04
188#define STAT_DRQ        0x08
189#define STAT_SEEK       0x10
190#define STAT_WRERR      0x20
191#define STAT_READY      0x40
192#define STAT_BUSY       0x80
193
194#define ATAPI_IDENTIFY		0x12
195
196static int pg_open(struct inode *inode, struct file *file);
197static int pg_release(struct inode *inode, struct file *file);
198static ssize_t pg_read(struct file *filp, char __user *buf,
199		       size_t count, loff_t * ppos);
200static ssize_t pg_write(struct file *filp, const char __user *buf,
201			size_t count, loff_t * ppos);
202static int pg_detect(void);
203
204#define PG_NAMELEN      8
205
206struct pg {
207	struct pi_adapter pia;	/* interface to paride layer */
208	struct pi_adapter *pi;
209	int busy;		/* write done, read expected */
210	int start;		/* jiffies at command start */
211	int dlen;		/* transfer size requested */
212	unsigned long timeout;	/* timeout requested */
213	int status;		/* last sense key */
214	int drive;		/* drive */
215	unsigned long access;	/* count of active opens ... */
216	int present;		/* device present ? */
217	char *bufptr;
218	char name[PG_NAMELEN];	/* pg0, pg1, ... */
219};
220
221static struct pg devices[PG_UNITS];
222
223static int pg_identify(struct pg *dev, int log);
224
225static char pg_scratch[512];	/* scratch block buffer */
226
227static struct class *pg_class;
228
229/* kernel glue structures */
230
231static const struct file_operations pg_fops = {
232	.owner = THIS_MODULE,
233	.read = pg_read,
234	.write = pg_write,
235	.open = pg_open,
236	.release = pg_release,
237};
238
239static void pg_init_units(void)
240{
241	int unit;
242
243	pg_drive_count = 0;
244	for (unit = 0; unit < PG_UNITS; unit++) {
245		int *parm = *drives[unit];
246		struct pg *dev = &devices[unit];
247		dev->pi = &dev->pia;
248		clear_bit(0, &dev->access);
249		dev->busy = 0;
250		dev->present = 0;
251		dev->bufptr = NULL;
252		dev->drive = parm[D_SLV];
253		snprintf(dev->name, PG_NAMELEN, "%s%c", name, 'a'+unit);
254		if (parm[D_PRT])
255			pg_drive_count++;
256	}
257}
258
259static inline int status_reg(struct pg *dev)
260{
261	return pi_read_regr(dev->pi, 1, 6);
262}
263
264static inline int read_reg(struct pg *dev, int reg)
265{
266	return pi_read_regr(dev->pi, 0, reg);
267}
268
269static inline void write_reg(struct pg *dev, int reg, int val)
270{
271	pi_write_regr(dev->pi, 0, reg, val);
272}
273
274static inline u8 DRIVE(struct pg *dev)
275{
276	return 0xa0+0x10*dev->drive;
277}
278
279static void pg_sleep(int cs)
280{
281	schedule_timeout_interruptible(cs);
282}
283
284static int pg_wait(struct pg *dev, int go, int stop, unsigned long tmo, char *msg)
285{
286	int j, r, e, s, p, to;
287
288	dev->status = 0;
289
290	j = 0;
291	while ((((r = status_reg(dev)) & go) || (stop && (!(r & stop))))
292	       && time_before(jiffies, tmo)) {
293		if (j++ < PG_SPIN)
294			udelay(PG_SPIN_DEL);
295		else
296			pg_sleep(1);
297	}
298
299	to = time_after_eq(jiffies, tmo);
300
301	if ((r & (STAT_ERR & stop)) || to) {
302		s = read_reg(dev, 7);
303		e = read_reg(dev, 1);
304		p = read_reg(dev, 2);
305		if (verbose > 1)
306			printk("%s: %s: stat=0x%x err=0x%x phase=%d%s\n",
307			       dev->name, msg, s, e, p, to ? " timeout" : "");
308		if (to)
309			e |= 0x100;
310		dev->status = (e >> 4) & 0xff;
311		return -1;
312	}
313	return 0;
314}
315
316static int pg_command(struct pg *dev, char *cmd, int dlen, unsigned long tmo)
317{
318	int k;
319
320	pi_connect(dev->pi);
321
322	write_reg(dev, 6, DRIVE(dev));
323
324	if (pg_wait(dev, STAT_BUSY | STAT_DRQ, 0, tmo, "before command"))
325		goto fail;
326
327	write_reg(dev, 4, dlen % 256);
328	write_reg(dev, 5, dlen / 256);
329	write_reg(dev, 7, 0xa0);	/* ATAPI packet command */
330
331	if (pg_wait(dev, STAT_BUSY, STAT_DRQ, tmo, "command DRQ"))
332		goto fail;
333
334	if (read_reg(dev, 2) != 1) {
335		printk("%s: command phase error\n", dev->name);
336		goto fail;
337	}
338
339	pi_write_block(dev->pi, cmd, 12);
340
341	if (verbose > 1) {
342		printk("%s: Command sent, dlen=%d packet= ", dev->name, dlen);
343		for (k = 0; k < 12; k++)
344			printk("%02x ", cmd[k] & 0xff);
345		printk("\n");
346	}
347	return 0;
348fail:
349	pi_disconnect(dev->pi);
350	return -1;
351}
352
353static int pg_completion(struct pg *dev, char *buf, unsigned long tmo)
354{
355	int r, d, n, p;
356
357	r = pg_wait(dev, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
358		    tmo, "completion");
359
360	dev->dlen = 0;
361
362	while (read_reg(dev, 7) & STAT_DRQ) {
363		d = (read_reg(dev, 4) + 256 * read_reg(dev, 5));
364		n = ((d + 3) & 0xfffc);
365		p = read_reg(dev, 2) & 3;
366		if (p == 0)
367			pi_write_block(dev->pi, buf, n);
368		if (p == 2)
369			pi_read_block(dev->pi, buf, n);
370		if (verbose > 1)
371			printk("%s: %s %d bytes\n", dev->name,
372			       p ? "Read" : "Write", n);
373		dev->dlen += (1 - p) * d;
374		buf += d;
375		r = pg_wait(dev, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
376			    tmo, "completion");
377	}
378
379	pi_disconnect(dev->pi);
380
381	return r;
382}
383
384static int pg_reset(struct pg *dev)
385{
386	int i, k, err;
387	int expect[5] = { 1, 1, 1, 0x14, 0xeb };
388	int got[5];
389
390	pi_connect(dev->pi);
391	write_reg(dev, 6, DRIVE(dev));
392	write_reg(dev, 7, 8);
393
394	pg_sleep(20 * HZ / 1000);
395
396	k = 0;
397	while ((k++ < PG_RESET_TMO) && (status_reg(dev) & STAT_BUSY))
398		pg_sleep(1);
399
400	for (i = 0; i < 5; i++)
401		got[i] = read_reg(dev, i + 1);
402
403	err = memcmp(expect, got, sizeof(got)) ? -1 : 0;
404
405	if (verbose) {
406		printk("%s: Reset (%d) signature = ", dev->name, k);
407		for (i = 0; i < 5; i++)
408			printk("%3x", got[i]);
409		if (err)
410			printk(" (incorrect)");
411		printk("\n");
412	}
413
414	pi_disconnect(dev->pi);
415	return err;
416}
417
418static void xs(char *buf, char *targ, int len)
419{
420	char l = '\0';
421	int k;
422
423	for (k = 0; k < len; k++) {
424		char c = *buf++;
425		if (c != ' ' && c != l)
426			l = *targ++ = c;
427	}
428	if (l == ' ')
429		targ--;
430	*targ = '\0';
431}
432
433static int pg_identify(struct pg *dev, int log)
434{
435	int s;
436	char *ms[2] = { "master", "slave" };
437	char mf[10], id[18];
438	char id_cmd[12] = { ATAPI_IDENTIFY, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
439	char buf[36];
440
441	s = pg_command(dev, id_cmd, 36, jiffies + PG_TMO);
442	if (s)
443		return -1;
444	s = pg_completion(dev, buf, jiffies + PG_TMO);
445	if (s)
446		return -1;
447
448	if (log) {
449		xs(buf + 8, mf, 8);
450		xs(buf + 16, id, 16);
451		printk("%s: %s %s, %s\n", dev->name, mf, id, ms[dev->drive]);
452	}
453
454	return 0;
455}
456
457/*
458 * returns  0, with id set if drive is detected
459 *	   -1, if drive detection failed
460 */
461static int pg_probe(struct pg *dev)
462{
463	if (dev->drive == -1) {
464		for (dev->drive = 0; dev->drive <= 1; dev->drive++)
465			if (!pg_reset(dev))
466				return pg_identify(dev, 1);
467	} else {
468		if (!pg_reset(dev))
469			return pg_identify(dev, 1);
470	}
471	return -1;
472}
473
474static int pg_detect(void)
475{
476	struct pg *dev = &devices[0];
477	int k, unit;
478
479	printk("%s: %s version %s, major %d\n", name, name, PG_VERSION, major);
480
481	k = 0;
482	if (pg_drive_count == 0) {
483		if (pi_init(dev->pi, 1, -1, -1, -1, -1, -1, pg_scratch,
484			    PI_PG, verbose, dev->name)) {
485			if (!pg_probe(dev)) {
486				dev->present = 1;
487				k++;
488			} else
489				pi_release(dev->pi);
490		}
491
492	} else
493		for (unit = 0; unit < PG_UNITS; unit++, dev++) {
494			int *parm = *drives[unit];
495			if (!parm[D_PRT])
496				continue;
497			if (pi_init(dev->pi, 0, parm[D_PRT], parm[D_MOD],
498				    parm[D_UNI], parm[D_PRO], parm[D_DLY],
499				    pg_scratch, PI_PG, verbose, dev->name)) {
500				if (!pg_probe(dev)) {
501					dev->present = 1;
502					k++;
503				} else
504					pi_release(dev->pi);
505			}
506		}
507
508	if (k)
509		return 0;
510
511	printk("%s: No ATAPI device detected\n", name);
512	return -1;
513}
514
515static int pg_open(struct inode *inode, struct file *file)
516{
517	int unit = iminor(inode) & 0x7f;
518	struct pg *dev = &devices[unit];
519	int ret = 0;
520
521	lock_kernel();
522	if ((unit >= PG_UNITS) || (!dev->present)) {
523		ret = -ENODEV;
524		goto out;
525	}
526
527	if (test_and_set_bit(0, &dev->access)) {
528		ret = -EBUSY;
529		goto out;
530	}
531
532	if (dev->busy) {
533		pg_reset(dev);
534		dev->busy = 0;
535	}
536
537	pg_identify(dev, (verbose > 1));
538
539	dev->bufptr = kmalloc(PG_MAX_DATA, GFP_KERNEL);
540	if (dev->bufptr == NULL) {
541		clear_bit(0, &dev->access);
542		printk("%s: buffer allocation failed\n", dev->name);
543		ret = -ENOMEM;
544		goto out;
545	}
546
547	file->private_data = dev;
548
549out:
550	unlock_kernel();
551	return ret;
552}
553
554static int pg_release(struct inode *inode, struct file *file)
555{
556	struct pg *dev = file->private_data;
557
558	kfree(dev->bufptr);
559	dev->bufptr = NULL;
560	clear_bit(0, &dev->access);
561
562	return 0;
563}
564
565static ssize_t pg_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos)
566{
567	struct pg *dev = filp->private_data;
568	struct pg_write_hdr hdr;
569	int hs = sizeof (hdr);
570
571	if (dev->busy)
572		return -EBUSY;
573	if (count < hs)
574		return -EINVAL;
575
576	if (copy_from_user(&hdr, buf, hs))
577		return -EFAULT;
578
579	if (hdr.magic != PG_MAGIC)
580		return -EINVAL;
581	if (hdr.dlen > PG_MAX_DATA)
582		return -EINVAL;
583	if ((count - hs) > PG_MAX_DATA)
584		return -EINVAL;
585
586	if (hdr.func == PG_RESET) {
587		if (count != hs)
588			return -EINVAL;
589		if (pg_reset(dev))
590			return -EIO;
591		return count;
592	}
593
594	if (hdr.func != PG_COMMAND)
595		return -EINVAL;
596
597	dev->start = jiffies;
598	dev->timeout = hdr.timeout * HZ + HZ / 2 + jiffies;
599
600	if (pg_command(dev, hdr.packet, hdr.dlen, jiffies + PG_TMO)) {
601		if (dev->status & 0x10)
602			return -ETIME;
603		return -EIO;
604	}
605
606	dev->busy = 1;
607
608	if (copy_from_user(dev->bufptr, buf + hs, count - hs))
609		return -EFAULT;
610	return count;
611}
612
613static ssize_t pg_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
614{
615	struct pg *dev = filp->private_data;
616	struct pg_read_hdr hdr;
617	int hs = sizeof (hdr);
618	int copy;
619
620	if (!dev->busy)
621		return -EINVAL;
622	if (count < hs)
623		return -EINVAL;
624
625	dev->busy = 0;
626
627	if (pg_completion(dev, dev->bufptr, dev->timeout))
628		if (dev->status & 0x10)
629			return -ETIME;
630
631	hdr.magic = PG_MAGIC;
632	hdr.dlen = dev->dlen;
633	copy = 0;
634
635	if (hdr.dlen < 0) {
636		hdr.dlen = -1 * hdr.dlen;
637		copy = hdr.dlen;
638		if (copy > (count - hs))
639			copy = count - hs;
640	}
641
642	hdr.duration = (jiffies - dev->start + HZ / 2) / HZ;
643	hdr.scsi = dev->status & 0x0f;
644
645	if (copy_to_user(buf, &hdr, hs))
646		return -EFAULT;
647	if (copy > 0)
648		if (copy_to_user(buf + hs, dev->bufptr, copy))
649			return -EFAULT;
650	return copy + hs;
651}
652
653static int __init pg_init(void)
654{
655	int unit;
656	int err;
657
658	if (disable){
659		err = -EINVAL;
660		goto out;
661	}
662
663	pg_init_units();
664
665	if (pg_detect()) {
666		err = -ENODEV;
667		goto out;
668	}
669
670	err = register_chrdev(major, name, &pg_fops);
671	if (err < 0) {
672		printk("pg_init: unable to get major number %d\n", major);
673		for (unit = 0; unit < PG_UNITS; unit++) {
674			struct pg *dev = &devices[unit];
675			if (dev->present)
676				pi_release(dev->pi);
677		}
678		goto out;
679	}
680	major = err;	/* In case the user specified `major=0' (dynamic) */
681	pg_class = class_create(THIS_MODULE, "pg");
682	if (IS_ERR(pg_class)) {
683		err = PTR_ERR(pg_class);
684		goto out_chrdev;
685	}
686	for (unit = 0; unit < PG_UNITS; unit++) {
687		struct pg *dev = &devices[unit];
688		if (dev->present)
689			device_create(pg_class, NULL, MKDEV(major, unit), NULL,
690				      "pg%u", unit);
691	}
692	err = 0;
693	goto out;
694
695out_chrdev:
696	unregister_chrdev(major, "pg");
697out:
698	return err;
699}
700
701static void __exit pg_exit(void)
702{
703	int unit;
704
705	for (unit = 0; unit < PG_UNITS; unit++) {
706		struct pg *dev = &devices[unit];
707		if (dev->present)
708			device_destroy(pg_class, MKDEV(major, unit));
709	}
710	class_destroy(pg_class);
711	unregister_chrdev(major, name);
712
713	for (unit = 0; unit < PG_UNITS; unit++) {
714		struct pg *dev = &devices[unit];
715		if (dev->present)
716			pi_release(dev->pi);
717	}
718}
719
720MODULE_LICENSE("GPL");
721module_init(pg_init)
722module_exit(pg_exit)
723