File: /usr/src/linux/drivers/char/lp.c

1     /*
2      * Generic parallel printer driver
3      *
4      * Copyright (C) 1992 by Jim Weigand and Linus Torvalds
5      * Copyright (C) 1992,1993 by Michael K. Johnson
6      * - Thanks much to Gunter Windau for pointing out to me where the error
7      *   checking ought to be.
8      * Copyright (C) 1993 by Nigel Gamble (added interrupt code)
9      * Copyright (C) 1994 by Alan Cox (Modularised it)
10      * LPCAREFUL, LPABORT, LPGETSTATUS added by Chris Metcalf, metcalf@lcs.mit.edu
11      * Statistics and support for slow printers by Rob Janssen, rob@knoware.nl
12      * "lp=" command line parameters added by Grant Guenther, grant@torque.net
13      * lp_read (Status readback) support added by Carsten Gross,
14      *                                             carsten@sol.wohnheim.uni-ulm.de
15      * Support for parport by Philip Blundell <Philip.Blundell@pobox.com>
16      * Parport sharing hacking by Andrea Arcangeli
17      * Fixed kernel_(to/from)_user memory copy to check for errors
18      * 				by Riccardo Facchetti <fizban@tin.it>
19      * 22-JAN-1998  Added support for devfs  Richard Gooch <rgooch@atnf.csiro.au>
20      * Redesigned interrupt handling for handle printers with buggy handshake
21      *				by Andrea Arcangeli, 11 May 1998
22      * Full efficient handling of printer with buggy irq handshake (now I have
23      * understood the meaning of the strange handshake). This is done sending new
24      * characters if the interrupt is just happened, even if the printer say to
25      * be still BUSY. This is needed at least with Epson Stylus Color. To enable
26      * the new TRUST_IRQ mode read the `LP OPTIMIZATION' section below...
27      * Fixed the irq on the rising edge of the strobe case.
28      * Obsoleted the CAREFUL flag since a printer that doesn' t work with
29      * CAREFUL will block a bit after in lp_check_status().
30      *				Andrea Arcangeli, 15 Oct 1998
31      * Obsoleted and removed all the lowlevel stuff implemented in the last
32      * month to use the IEEE1284 functions (that handle the _new_ compatibilty
33      * mode fine).
34      */
35     
36     /* This driver should, in theory, work with any parallel port that has an
37      * appropriate low-level driver; all I/O is done through the parport
38      * abstraction layer.
39      *
40      * If this driver is built into the kernel, you can configure it using the
41      * kernel command-line.  For example:
42      *
43      *	lp=parport1,none,parport2	(bind lp0 to parport1, disable lp1 and
44      *					 bind lp2 to parport2)
45      *
46      *	lp=auto				(assign lp devices to all ports that
47      *				         have printers attached, as determined
48      *					 by the IEEE-1284 autoprobe)
49      * 
50      *	lp=reset			(reset the printer during 
51      *					 initialisation)
52      *
53      *	lp=off				(disable the printer driver entirely)
54      *
55      * If the driver is loaded as a module, similar functionality is available
56      * using module parameters.  The equivalent of the above commands would be:
57      *
58      *	# insmod lp.o parport=1,none,2
59      *
60      *	# insmod lp.o parport=auto
61      *
62      *	# insmod lp.o reset=1
63      */
64     
65     /* COMPATIBILITY WITH OLD KERNELS
66      *
67      * Under Linux 2.0 and previous versions, lp devices were bound to ports at
68      * particular I/O addresses, as follows:
69      *
70      *	lp0		0x3bc
71      *	lp1		0x378
72      *	lp2		0x278
73      *
74      * The new driver, by default, binds lp devices to parport devices as it
75      * finds them.  This means that if you only have one port, it will be bound
76      * to lp0 regardless of its I/O address.  If you need the old behaviour, you
77      * can force it using the parameters described above.
78      */
79     
80     /*
81      * The new interrupt handling code take care of the buggy handshake
82      * of some HP and Epson printer:
83      * ___
84      * ACK    _______________    ___________
85      *                       |__|
86      * ____
87      * BUSY   _________              _______
88      *                 |____________|
89      *
90      * I discovered this using the printer scanner that you can find at:
91      *
92      *	ftp://e-mind.com/pub/linux/pscan/
93      *
94      *					11 May 98, Andrea Arcangeli
95      *
96      * My printer scanner run on an Epson Stylus Color show that such printer
97      * generates the irq on the _rising_ edge of the STROBE. Now lp handle
98      * this case fine too.
99      *
100      *					15 Oct 1998, Andrea Arcangeli
101      *
102      * The so called `buggy' handshake is really the well documented
103      * compatibility mode IEEE1284 handshake. They changed the well known
104      * Centronics handshake acking in the middle of busy expecting to not
105      * break drivers or legacy application, while they broken linux lp
106      * until I fixed it reverse engineering the protocol by hand some
107      * month ago...
108      *
109      *                                     14 Dec 1998, Andrea Arcangeli
110      *
111      * Copyright (C) 2000 by Tim Waugh (added LPSETTIMEOUT ioctl)
112      */
113     
114     #include <linux/module.h>
115     #include <linux/init.h>
116     
117     #include <linux/config.h>
118     #include <linux/errno.h>
119     #include <linux/kernel.h>
120     #include <linux/major.h>
121     #include <linux/sched.h>
122     #include <linux/smp_lock.h>
123     #include <linux/devfs_fs_kernel.h>
124     #include <linux/slab.h>
125     #include <linux/fcntl.h>
126     #include <linux/delay.h>
127     #include <linux/poll.h>
128     #include <linux/console.h>
129     
130     #include <linux/parport.h>
131     #undef LP_STATS
132     #include <linux/lp.h>
133     
134     #include <asm/irq.h>
135     #include <asm/uaccess.h>
136     #include <asm/system.h>
137     
138     /* if you have more than 8 printers, remember to increase LP_NO */
139     #define LP_NO 8
140     
141     /* ROUND_UP macro from fs/select.c */
142     #define ROUND_UP(x,y) (((x)+(y)-1)/(y))
143     
144     static devfs_handle_t devfs_handle = NULL;
145     
146     struct lp_struct lp_table[LP_NO];
147     
148     static unsigned int lp_count = 0;
149     
150     #ifdef CONFIG_LP_CONSOLE
151     static struct parport *console_registered; // initially NULL
152     #endif /* CONFIG_LP_CONSOLE */
153     
154     #undef LP_DEBUG
155     
156     /* --- low-level port access ----------------------------------- */
157     
158     #define r_dtr(x)	(parport_read_data(lp_table[(x)].dev->port))
159     #define r_str(x)	(parport_read_status(lp_table[(x)].dev->port))
160     #define w_ctr(x,y)	do { parport_write_control(lp_table[(x)].dev->port, (y)); } while (0)
161     #define w_dtr(x,y)	do { parport_write_data(lp_table[(x)].dev->port, (y)); } while (0)
162     
163     static int lp_reset(int minor)
164     {
165     	int retval;
166     	parport_claim_or_block (lp_table[minor].dev);
167     	w_ctr(minor, LP_PSELECP);
168     	udelay (LP_DELAY);
169     	w_ctr(minor, LP_PSELECP | LP_PINITP);
170     	retval = r_str(minor);
171     	parport_release (lp_table[minor].dev);
172     	return retval;
173     }
174     
175     static void lp_error (int minor)
176     {
177     	int polling;
178     
179     	if (LP_F(minor) & LP_ABORT)
180     		return;
181     
182     	polling = lp_table[minor].dev->port->irq == PARPORT_IRQ_NONE;
183     	if (polling) parport_release (lp_table[minor].dev);
184     	interruptible_sleep_on_timeout (&lp_table[minor].waitq,
185     					LP_TIMEOUT_POLLED);
186     	if (polling) parport_claim_or_block (lp_table[minor].dev);
187     	else parport_yield_blocking (lp_table[minor].dev);
188     }
189     
190     static int lp_check_status(int minor)
191     {
192     	int error = 0;
193     	unsigned int last = lp_table[minor].last_error;
194     	unsigned char status = r_str(minor);
195     	if ((status & LP_PERRORP) && !(LP_F(minor) & LP_CAREFUL))
196     		/* No error. */
197     		last = 0;
198     	else if ((status & LP_POUTPA)) {
199     		if (last != LP_POUTPA) {
200     			last = LP_POUTPA;
201     			printk(KERN_INFO "lp%d out of paper\n", minor);
202     		}
203     		error = -ENOSPC;
204     	} else if (!(status & LP_PSELECD)) {
205     		if (last != LP_PSELECD) {
206     			last = LP_PSELECD;
207     			printk(KERN_INFO "lp%d off-line\n", minor);
208     		}
209     		error = -EIO;
210     	} else if (!(status & LP_PERRORP)) {
211     		if (last != LP_PERRORP) {
212     			last = LP_PERRORP;
213     			printk(KERN_INFO "lp%d on fire\n", minor);
214     		}
215     		error = -EIO;
216     	} else {
217     		last = 0; /* Come here if LP_CAREFUL is set and no
218                                  errors are reported. */
219     	}
220     
221     	lp_table[minor].last_error = last;
222     
223     	if (last != 0)
224     		lp_error(minor);
225     
226     	return error;
227     }
228     
229     static int lp_wait_ready(int minor)
230     {
231     	int error = 0;
232     	do {
233     		error = lp_check_status (minor);
234     		if (error && (LP_F(minor) & LP_ABORT))
235     			break;
236     		if (signal_pending (current)) {
237     			error = -EINTR;
238     			break;
239     		}
240     	} while (error);
241     	return error;
242     }
243     
244     static ssize_t lp_write(struct file * file, const char * buf,
245     		        size_t count, loff_t *ppos)
246     {
247     	unsigned int minor = MINOR(file->f_dentry->d_inode->i_rdev);
248     	struct parport *port = lp_table[minor].dev->port;
249     	char *kbuf = lp_table[minor].lp_buffer;
250     	ssize_t retv = 0;
251     	ssize_t written;
252     	size_t copy_size = count;
253     
254     #ifdef LP_STATS
255     	if (jiffies-lp_table[minor].lastcall > LP_TIME(minor))
256     		lp_table[minor].runchars = 0;
257     
258     	lp_table[minor].lastcall = jiffies;
259     #endif
260     
261     	/* Need to copy the data from user-space. */
262     	if (copy_size > LP_BUFFER_SIZE)
263     		copy_size = LP_BUFFER_SIZE;
264     
265     	if (copy_from_user (kbuf, buf, copy_size))
266     		return -EFAULT;
267     
268     	if (down_interruptible (&lp_table[minor].port_mutex))
269     		return -EINTR;
270     
271      	/* Claim Parport or sleep until it becomes available
272      	 */
273      	parport_claim_or_block (lp_table[minor].dev);
274     
275     	/* Go to compatibility mode. */
276     	parport_negotiate (port, IEEE1284_MODE_COMPAT);
277     
278     	parport_set_timeout (lp_table[minor].dev,
279     			     lp_table[minor].timeout);
280     
281     	if ((retv = lp_wait_ready (minor)) == 0)
282     	do {
283     		/* Write the data. */
284     		written = parport_write (port, kbuf, copy_size);
285     		if (written >= 0) {
286     			copy_size -= written;
287     			count -= written;
288     			buf  += written;
289     			retv += written;
290     		}
291     
292     		if (signal_pending (current)) {
293     			if (retv == 0)
294     				retv = -EINTR;
295     
296     			break;
297     		}
298     
299     		if (copy_size > 0) {
300     			/* incomplete write -> check error ! */
301     			int error = lp_wait_ready (minor);
302     
303     			if (error) {
304     				if (retv == 0)
305     					retv = error;
306     				break;
307     			}
308     
309     			parport_yield_blocking (lp_table[minor].dev);
310     		} else if (current->need_resched)
311     			schedule ();
312     
313     		if (count) {
314     			copy_size = count;
315     			if (copy_size > LP_BUFFER_SIZE)
316     				copy_size = LP_BUFFER_SIZE;
317     
318     			if (copy_from_user(kbuf, buf, copy_size)) {
319     				if (retv == 0)
320     					retv = -EFAULT;
321     				break;
322     			}
323     		}	
324     	} while (count > 0);
325     
326      	parport_release (lp_table[minor].dev);
327     
328     	up (&lp_table[minor].port_mutex);
329     
330      	return retv;
331     }
332     
333     #ifdef CONFIG_PARPORT_1284
334     
335     /* Status readback conforming to ieee1284 */
336     static ssize_t lp_read(struct file * file, char * buf,
337     		       size_t count, loff_t *ppos)
338     {
339     	unsigned int minor=MINOR(file->f_dentry->d_inode->i_rdev);
340     	struct parport *port = lp_table[minor].dev->port;
341     	ssize_t retval = 0;
342     	char *kbuf = lp_table[minor].lp_buffer;
343     
344     	if (count > LP_BUFFER_SIZE)
345     		count = LP_BUFFER_SIZE;
346     
347     	if (down_interruptible (&lp_table[minor].port_mutex))
348     		return -EINTR;
349     
350     	parport_claim_or_block (lp_table[minor].dev);
351     	retval = parport_read (port, kbuf, count);
352     	parport_release (lp_table[minor].dev);
353     
354     	if (retval > 0 && copy_to_user (buf, kbuf, retval))
355     		retval = -EFAULT;
356     
357     	up (&lp_table[minor].port_mutex);
358     
359     	return retval;
360     }
361     
362     #endif /* IEEE 1284 support */
363     
364     static int lp_open(struct inode * inode, struct file * file)
365     {
366     	unsigned int minor = MINOR(inode->i_rdev);
367     
368     	if (minor >= LP_NO)
369     		return -ENXIO;
370     	if ((LP_F(minor) & LP_EXIST) == 0)
371     		return -ENXIO;
372     	if (test_and_set_bit(LP_BUSY_BIT_POS, &LP_F(minor)))
373     		return -EBUSY;
374     
375     	/* If ABORTOPEN is set and the printer is offline or out of paper,
376     	   we may still want to open it to perform ioctl()s.  Therefore we
377     	   have commandeered O_NONBLOCK, even though it is being used in
378     	   a non-standard manner.  This is strictly a Linux hack, and
379     	   should most likely only ever be used by the tunelp application. */
380     	if ((LP_F(minor) & LP_ABORTOPEN) && !(file->f_flags & O_NONBLOCK)) {
381     		int status;
382     		parport_claim_or_block (lp_table[minor].dev);
383     		status = r_str(minor);
384     		parport_release (lp_table[minor].dev);
385     		if (status & LP_POUTPA) {
386     			printk(KERN_INFO "lp%d out of paper\n", minor);
387     			LP_F(minor) &= ~LP_BUSY;
388     			return -ENOSPC;
389     		} else if (!(status & LP_PSELECD)) {
390     			printk(KERN_INFO "lp%d off-line\n", minor);
391     			LP_F(minor) &= ~LP_BUSY;
392     			return -EIO;
393     		} else if (!(status & LP_PERRORP)) {
394     			printk(KERN_ERR "lp%d printer error\n", minor);
395     			LP_F(minor) &= ~LP_BUSY;
396     			return -EIO;
397     		}
398     	}
399     	lp_table[minor].lp_buffer = (char *) kmalloc(LP_BUFFER_SIZE, GFP_KERNEL);
400     	if (!lp_table[minor].lp_buffer) {
401     		LP_F(minor) &= ~LP_BUSY;
402     		return -ENOMEM;
403     	}
404     	return 0;
405     }
406     
407     static int lp_release(struct inode * inode, struct file * file)
408     {
409     	unsigned int minor = MINOR(inode->i_rdev);
410     
411     	lock_kernel();
412     	kfree(lp_table[minor].lp_buffer);
413     	lp_table[minor].lp_buffer = NULL;
414     	LP_F(minor) &= ~LP_BUSY;
415     	unlock_kernel();
416     	return 0;
417     }
418     
419     static int lp_ioctl(struct inode *inode, struct file *file,
420     		    unsigned int cmd, unsigned long arg)
421     {
422     	unsigned int minor = MINOR(inode->i_rdev);
423     	int status;
424     	int retval = 0;
425     
426     #ifdef LP_DEBUG
427     	printk(KERN_DEBUG "lp%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
428     #endif
429     	if (minor >= LP_NO)
430     		return -ENODEV;
431     	if ((LP_F(minor) & LP_EXIST) == 0)
432     		return -ENODEV;
433     	switch ( cmd ) {
434     		struct timeval par_timeout;
435     		long to_jiffies;
436     
437     		case LPTIME:
438     			LP_TIME(minor) = arg * HZ/100;
439     			break;
440     		case LPCHAR:
441     			LP_CHAR(minor) = arg;
442     			break;
443     		case LPABORT:
444     			if (arg)
445     				LP_F(minor) |= LP_ABORT;
446     			else
447     				LP_F(minor) &= ~LP_ABORT;
448     			break;
449     		case LPABORTOPEN:
450     			if (arg)
451     				LP_F(minor) |= LP_ABORTOPEN;
452     			else
453     				LP_F(minor) &= ~LP_ABORTOPEN;
454     			break;
455     		case LPCAREFUL:
456     			if (arg)
457     				LP_F(minor) |= LP_CAREFUL;
458     			else
459     				LP_F(minor) &= ~LP_CAREFUL;
460     			break;
461     		case LPWAIT:
462     			LP_WAIT(minor) = arg;
463     			break;
464     		case LPSETIRQ: 
465     			return -EINVAL;
466     			break;
467     		case LPGETIRQ:
468     			if (copy_to_user((int *) arg, &LP_IRQ(minor),
469     					sizeof(int)))
470     				return -EFAULT;
471     			break;
472     		case LPGETSTATUS:
473     			parport_claim_or_block (lp_table[minor].dev);
474     			status = r_str(minor);
475     			parport_release (lp_table[minor].dev);
476     
477     			if (copy_to_user((int *) arg, &status, sizeof(int)))
478     				return -EFAULT;
479     			break;
480     		case LPRESET:
481     			lp_reset(minor);
482     			break;
483     #ifdef LP_STATS
484     		case LPGETSTATS:
485     			if (copy_to_user((int *) arg, &LP_STAT(minor),
486     					sizeof(struct lp_stats)))
487     				return -EFAULT;
488     			if (capable(CAP_SYS_ADMIN))
489     				memset(&LP_STAT(minor), 0,
490     						sizeof(struct lp_stats));
491     			break;
492     #endif
493      		case LPGETFLAGS:
494      			status = LP_F(minor);
495     			if (copy_to_user((int *) arg, &status, sizeof(int)))
496     				return -EFAULT;
497     			break;
498     
499     		case LPSETTIMEOUT:
500     			if (copy_from_user (&par_timeout,
501     					    (struct timeval *) arg,
502     					    sizeof (struct timeval))) {
503     				return -EFAULT;
504     			}
505     			/* Convert to jiffies, place in lp_table */
506     			if ((par_timeout.tv_sec < 0) ||
507     			    (par_timeout.tv_usec < 0)) {
508     				return -EINVAL;
509     			}
510     			to_jiffies = ROUND_UP(par_timeout.tv_usec, 1000000/HZ);
511     			to_jiffies += par_timeout.tv_sec * (long) HZ;
512     			if (to_jiffies <= 0) {
513     				return -EINVAL;
514     			}
515     			lp_table[minor].timeout = to_jiffies;
516     			break;
517     
518     		default:
519     			retval = -EINVAL;
520     	}
521     	return retval;
522     }
523     
524     static struct file_operations lp_fops = {
525     	owner:		THIS_MODULE,
526     	write:		lp_write,
527     	ioctl:		lp_ioctl,
528     	open:		lp_open,
529     	release:	lp_release,
530     #ifdef CONFIG_PARPORT_1284
531     	read:		lp_read,
532     #endif
533     };
534     
535     /* --- support for console on the line printer ----------------- */
536     
537     #ifdef CONFIG_LP_CONSOLE
538     
539     #define CONSOLE_LP 0
540     
541     /* If the printer is out of paper, we can either lose the messages or
542      * stall until the printer is happy again.  Define CONSOLE_LP_STRICT
543      * non-zero to get the latter behaviour. */
544     #define CONSOLE_LP_STRICT 1
545     
546     /* The console must be locked when we get here. */
547     
548     static void lp_console_write (struct console *co, const char *s,
549     			      unsigned count)
550     {
551     	struct pardevice *dev = lp_table[CONSOLE_LP].dev;
552     	struct parport *port = dev->port;
553     	ssize_t written;
554     
555     	if (parport_claim (dev))
556     		/* Nothing we can do. */
557     		return;
558     
559     	parport_set_timeout (dev, 0);
560     
561     	/* Go to compatibility mode. */
562     	parport_negotiate (port, IEEE1284_MODE_COMPAT);
563     
564     	do {
565     		/* Write the data, converting LF->CRLF as we go. */
566     		ssize_t canwrite = count;
567     		char *lf = strchr (s, '\n');
568     		if (lf)
569     			canwrite = lf - s;
570     
571     		if (canwrite > 0) {
572     			written = parport_write (port, s, canwrite);
573     
574     			if (written <= 0)
575     				continue;
576     
577     			s += written;
578     			count -= written;
579     			canwrite -= written;
580     		}
581     
582     		if (lf && canwrite <= 0) {
583     			const char *crlf = "\r\n";
584     			int i = 2;
585     
586     			/* Dodge the original '\n', and put '\r\n' instead. */
587     			s++;
588     			count--;
589     			do {
590     				written = parport_write (port, crlf, i);
591     				if (written > 0)
592     					i -= written, crlf += written;
593     			} while (i > 0 && (CONSOLE_LP_STRICT || written > 0));
594     		}
595     	} while (count > 0 && (CONSOLE_LP_STRICT || written > 0));
596     
597     	parport_release (dev);
598     }
599     
600     static kdev_t lp_console_device (struct console *c)
601     {
602     	return MKDEV(LP_MAJOR, CONSOLE_LP);
603     }
604     
605     static struct console lpcons = {
606     	name:		"lp",
607     	write:		lp_console_write,
608     	device:		lp_console_device,
609     	flags:		CON_PRINTBUFFER,
610     };
611     
612     #endif /* console on line printer */
613     
614     /* --- initialisation code ------------------------------------- */
615     
616     static int parport_nr[LP_NO] = { [0 ... LP_NO-1] = LP_PARPORT_UNSPEC };
617     static char *parport[LP_NO] = { NULL,  };
618     static int reset = 0;
619     
620     MODULE_PARM(parport, "1-" __MODULE_STRING(LP_NO) "s");
621     MODULE_PARM(reset, "i");
622     
623     #ifndef MODULE
624     static int __init lp_setup (char *str)
625     {
626     	static int parport_ptr; // initially zero
627     	int x;
628     
629     	if (get_option (&str, &x)) {
630     		if (x == 0) {
631     			/* disable driver on "lp=" or "lp=0" */
632     			parport_nr[0] = LP_PARPORT_OFF;
633     		} else {
634     			printk(KERN_WARNING "warning: 'lp=0x%x' is deprecated, ignored\n", x);
635     			return 0;
636     		}
637     	} else if (!strncmp(str, "parport", 7)) {
638     		int n = simple_strtoul(str+7, NULL, 10);
639     		if (parport_ptr < LP_NO)
640     			parport_nr[parport_ptr++] = n;
641     		else
642     			printk(KERN_INFO "lp: too many ports, %s ignored.\n",
643     			       str);
644     	} else if (!strcmp(str, "auto")) {
645     		parport_nr[0] = LP_PARPORT_AUTO;
646     	} else if (!strcmp(str, "none")) {
647     		parport_nr[parport_ptr++] = LP_PARPORT_NONE;
648     	} else if (!strcmp(str, "reset")) {
649     		reset = 1;
650     	}
651     	return 1;
652     }
653     #endif
654     
655     static int lp_register(int nr, struct parport *port)
656     {
657     	char name[8];
658     
659     	lp_table[nr].dev = parport_register_device(port, "lp", 
660     						   NULL, NULL, NULL, 0,
661     						   (void *) &lp_table[nr]);
662     	if (lp_table[nr].dev == NULL)
663     		return 1;
664     	lp_table[nr].flags |= LP_EXIST;
665     
666     	if (reset)
667     		lp_reset(nr);
668     
669     	sprintf (name, "%d", nr);
670     	devfs_register (devfs_handle, name,
671     			DEVFS_FL_DEFAULT, LP_MAJOR, nr,
672     			S_IFCHR | S_IRUGO | S_IWUGO,
673     			&lp_fops, NULL);
674     
675     	printk(KERN_INFO "lp%d: using %s (%s).\n", nr, port->name, 
676     	       (port->irq == PARPORT_IRQ_NONE)?"polling":"interrupt-driven");
677     
678     #ifdef CONFIG_LP_CONSOLE
679     	if (!nr) {
680     		if (port->modes & PARPORT_MODE_SAFEININT) {
681     			register_console (&lpcons);
682     			console_registered = port;
683     			printk (KERN_INFO "lp%d: console ready\n", CONSOLE_LP);
684     		} else
685     			printk (KERN_ERR "lp%d: cannot run console on %s\n",
686     				CONSOLE_LP, port->name);
687     	}
688     #endif
689     
690     	return 0;
691     }
692     
693     static void lp_attach (struct parport *port)
694     {
695     	unsigned int i;
696     
697     	switch (parport_nr[0])
698     	{
699     	case LP_PARPORT_UNSPEC:
700     	case LP_PARPORT_AUTO:
701     		if (parport_nr[0] == LP_PARPORT_AUTO &&
702     		    port->probe_info[0].class != PARPORT_CLASS_PRINTER)
703     			return;
704     		if (lp_count == LP_NO) {
705     			printk("lp: ignoring parallel port (max. %d)\n",LP_NO);
706     			return;
707     		}
708     		if (!lp_register(lp_count, port))
709     			lp_count++;
710     		break;
711     
712     	default:
713     		for (i = 0; i < LP_NO; i++) {
714     			if (port->number == parport_nr[i]) {
715     				if (!lp_register(i, port))
716     					lp_count++;
717     				break;
718     			}
719     		}
720     		break;
721     	}
722     }
723     
724     static void lp_detach (struct parport *port)
725     {
726     	/* Write this some day. */
727     #ifdef CONFIG_LP_CONSOLE
728     	if (console_registered == port) {
729     		unregister_console (&lpcons);
730     		console_registered = NULL;
731     	}
732     #endif /* CONFIG_LP_CONSOLE */
733     }
734     
735     static struct parport_driver lp_driver = {
736     	"lp",
737     	lp_attach,
738     	lp_detach,
739     	NULL
740     };
741     
742     int __init lp_init (void)
743     {
744     	int i;
745     
746     	if (parport_nr[0] == LP_PARPORT_OFF)
747     		return 0;
748     
749     	for (i = 0; i < LP_NO; i++) {
750     		lp_table[i].dev = NULL;
751     		lp_table[i].flags = 0;
752     		lp_table[i].chars = LP_INIT_CHAR;
753     		lp_table[i].time = LP_INIT_TIME;
754     		lp_table[i].wait = LP_INIT_WAIT;
755     		lp_table[i].lp_buffer = NULL;
756     #ifdef LP_STATS
757     		lp_table[i].lastcall = 0;
758     		lp_table[i].runchars = 0;
759     		memset (&lp_table[i].stats, 0, sizeof (struct lp_stats));
760     #endif
761     		lp_table[i].last_error = 0;
762     		init_waitqueue_head (&lp_table[i].waitq);
763     		init_waitqueue_head (&lp_table[i].dataq);
764     		init_MUTEX (&lp_table[i].port_mutex);
765     		lp_table[i].timeout = 10 * HZ;
766     	}
767     
768     	if (devfs_register_chrdev (LP_MAJOR, "lp", &lp_fops)) {
769     		printk ("lp: unable to get major %d\n", LP_MAJOR);
770     		return -EIO;
771     	}
772     
773     	devfs_handle = devfs_mk_dir (NULL, "printers", NULL);
774     
775     	if (parport_register_driver (&lp_driver)) {
776     		printk ("lp: unable to register with parport\n");
777     		return -EIO;
778     	}
779     
780     	if (!lp_count) {
781     		printk (KERN_INFO "lp: driver loaded but no devices found\n");
782     #ifndef CONFIG_PARPORT_1284
783     		if (parport_nr[0] == LP_PARPORT_AUTO)
784     			printk (KERN_INFO "lp: (is IEEE 1284 support enabled?)\n");
785     #endif
786     	}
787     
788     	return 0;
789     }
790     
791     static int __init lp_init_module (void)
792     {
793     	if (parport[0]) {
794     		/* The user gave some parameters.  Let's see what they were.  */
795     		if (!strncmp(parport[0], "auto", 4))
796     			parport_nr[0] = LP_PARPORT_AUTO;
797     		else {
798     			int n;
799     			for (n = 0; n < LP_NO && parport[n]; n++) {
800     				if (!strncmp(parport[n], "none", 4))
801     					parport_nr[n] = LP_PARPORT_NONE;
802     				else {
803     					char *ep;
804     					unsigned long r = simple_strtoul(parport[n], &ep, 0);
805     					if (ep != parport[n]) 
806     						parport_nr[n] = r;
807     					else {
808     						printk(KERN_ERR "lp: bad port specifier `%s'\n", parport[n]);
809     						return -ENODEV;
810     					}
811     				}
812     			}
813     		}
814     	}
815     
816     	return lp_init();
817     }
818     
819     static void lp_cleanup_module (void)
820     {
821     	unsigned int offset;
822     
823     	parport_unregister_driver (&lp_driver);
824     
825     #ifdef CONFIG_LP_CONSOLE
826     	unregister_console (&lpcons);
827     #endif
828     
829     	devfs_unregister (devfs_handle);
830     	devfs_unregister_chrdev(LP_MAJOR, "lp");
831     	for (offset = 0; offset < LP_NO; offset++) {
832     		if (lp_table[offset].dev == NULL)
833     			continue;
834     		parport_unregister_device(lp_table[offset].dev);
835     	}
836     }
837     
838     __setup("lp=", lp_setup);
839     module_init(lp_init_module);
840     module_exit(lp_cleanup_module);
841     
842     MODULE_LICENSE("GPL");
843     EXPORT_NO_SYMBOLS;
844