~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/drivers/char/lp.c

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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/malloc.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 3 printers, remember to increase LP_NO */
139 #define LP_NO 3
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 #undef LP_DEBUG
151 
152 /* --- low-level port access ----------------------------------- */
153 
154 #define r_dtr(x)        (parport_read_data(lp_table[(x)].dev->port))
155 #define r_str(x)        (parport_read_status(lp_table[(x)].dev->port))
156 #define w_ctr(x,y)      do { parport_write_control(lp_table[(x)].dev->port, (y)); } while (0)
157 #define w_dtr(x,y)      do { parport_write_data(lp_table[(x)].dev->port, (y)); } while (0)
158 
159 static int lp_reset(int minor)
160 {
161         int retval;
162         parport_claim_or_block (lp_table[minor].dev);
163         w_ctr(minor, LP_PSELECP);
164         udelay (LP_DELAY);
165         w_ctr(minor, LP_PSELECP | LP_PINITP);
166         retval = r_str(minor);
167         parport_release (lp_table[minor].dev);
168         return retval;
169 }
170 
171 static void lp_error (int minor)
172 {
173         int polling;
174 
175         if (LP_F(minor) & LP_ABORT)
176                 return;
177 
178         polling = lp_table[minor].dev->port->irq == PARPORT_IRQ_NONE;
179         if (polling) parport_release (lp_table[minor].dev);
180         interruptible_sleep_on_timeout (&lp_table[minor].waitq,
181                                         LP_TIMEOUT_POLLED);
182         if (polling) parport_claim_or_block (lp_table[minor].dev);
183         else parport_yield_blocking (lp_table[minor].dev);
184 }
185 
186 static int lp_check_status(int minor)
187 {
188         int error = 0;
189         unsigned int last = lp_table[minor].last_error;
190         unsigned char status = r_str(minor);
191         if ((status & LP_PERRORP) && !(LP_F(minor) & LP_CAREFUL))
192                 /* No error. */
193                 last = 0;
194         else if ((status & LP_POUTPA)) {
195                 if (last != LP_POUTPA) {
196                         last = LP_POUTPA;
197                         printk(KERN_INFO "lp%d out of paper\n", minor);
198                 }
199                 error = -ENOSPC;
200         } else if (!(status & LP_PSELECD)) {
201                 if (last != LP_PSELECD) {
202                         last = LP_PSELECD;
203                         printk(KERN_INFO "lp%d off-line\n", minor);
204                 }
205                 error = -EIO;
206         } else if (!(status & LP_PERRORP)) {
207                 if (last != LP_PERRORP) {
208                         last = LP_PERRORP;
209                         printk(KERN_INFO "lp%d on fire\n", minor);
210                 }
211                 error = -EIO;
212         } else {
213                 last = 0; /* Come here if LP_CAREFUL is set and no
214                              errors are reported. */
215         }
216 
217         lp_table[minor].last_error = last;
218 
219         if (last != 0)
220                 lp_error(minor);
221 
222         return error;
223 }
224 
225 static ssize_t lp_write(struct file * file, const char * buf,
226                         size_t count, loff_t *ppos)
227 {
228         unsigned int minor = MINOR(file->f_dentry->d_inode->i_rdev);
229         struct parport *port = lp_table[minor].dev->port;
230         char *kbuf = lp_table[minor].lp_buffer;
231         ssize_t retv = 0;
232         ssize_t written;
233         size_t copy_size = count;
234 
235 #ifdef LP_STATS
236         if (jiffies-lp_table[minor].lastcall > LP_TIME(minor))
237                 lp_table[minor].runchars = 0;
238 
239         lp_table[minor].lastcall = jiffies;
240 #endif
241 
242         /* Need to copy the data from user-space. */
243         if (copy_size > LP_BUFFER_SIZE)
244                 copy_size = LP_BUFFER_SIZE;
245 
246         if (copy_from_user (kbuf, buf, copy_size))
247                 return -EFAULT;
248 
249         if (down_interruptible (&lp_table[minor].port_mutex))
250                 return -EINTR;
251 
252         /* Claim Parport or sleep until it becomes available
253          */
254         parport_claim_or_block (lp_table[minor].dev);
255 
256         /* Go to compatibility mode. */
257         parport_negotiate (port, IEEE1284_MODE_COMPAT);
258 
259         parport_set_timeout (lp_table[minor].dev,
260                              lp_table[minor].timeout);
261 
262         if ((retv = lp_check_status (minor)) == 0)
263         do {
264                 /* Write the data. */
265                 written = parport_write (port, kbuf, copy_size);
266                 if (written >= 0) {
267                         copy_size -= written;
268                         count -= written;
269                         buf  += written;
270                         retv += written;
271                 }
272 
273                 if (signal_pending (current)) {
274                         if (retv == 0)
275                                 retv = -EINTR;
276 
277                         break;
278                 }
279 
280                 if (copy_size > 0) {
281                         /* incomplete write -> check error ! */
282                         int error = lp_check_status (minor);
283 
284                         if (LP_F(minor) & LP_ABORT) {
285                                 if (retv == 0)
286                                         retv = error;
287                                 break;
288                         }
289 
290                         parport_yield_blocking (lp_table[minor].dev);
291                 } else if (current->need_resched)
292                         schedule ();
293 
294                 if (count) {
295                         copy_size = count;
296                         if (copy_size > LP_BUFFER_SIZE)
297                                 copy_size = LP_BUFFER_SIZE;
298 
299                         if (copy_from_user(kbuf, buf, copy_size)) {
300                                 if (retv == 0)
301                                         retv = -EFAULT;
302                                 break;
303                         }
304                 }       
305         } while (count > 0);
306 
307         parport_release (lp_table[minor].dev);
308 
309         up (&lp_table[minor].port_mutex);
310 
311         return retv;
312 }
313 
314 #ifdef CONFIG_PARPORT_1284
315 
316 /* Status readback conforming to ieee1284 */
317 static ssize_t lp_read(struct file * file, char * buf,
318                        size_t count, loff_t *ppos)
319 {
320         unsigned int minor=MINOR(file->f_dentry->d_inode->i_rdev);
321         struct parport *port = lp_table[minor].dev->port;
322         ssize_t retval = 0;
323         char *kbuf = lp_table[minor].lp_buffer;
324 
325         if (count > LP_BUFFER_SIZE)
326                 count = LP_BUFFER_SIZE;
327 
328         if (down_interruptible (&lp_table[minor].port_mutex))
329                 return -EINTR;
330 
331         parport_claim_or_block (lp_table[minor].dev);
332 
333         for (;;) {
334                 retval = parport_read (port, kbuf, count);
335 
336                 if (retval)
337                         break;
338 
339                 if (file->f_flags & O_NONBLOCK)
340                         break;
341 
342                 /* Wait for an interrupt. */
343                 interruptible_sleep_on_timeout (&lp_table[minor].waitq,
344                                                 LP_TIMEOUT_POLLED);
345 
346                 if (signal_pending (current)) {
347                         retval = -EINTR;
348                         break;
349                 }
350         }
351 
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 (suser())
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_lock must be held 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 #ifdef MODULE
617 
618 static int parport_nr[LP_NO] = { [0 ... LP_NO-1] = LP_PARPORT_UNSPEC };
619 static char *parport[LP_NO] = { NULL,  };
620 static int reset = 0;
621 
622 MODULE_PARM(parport, "1-" __MODULE_STRING(LP_NO) "s");
623 MODULE_PARM(reset, "i");
624 
625 #else
626 
627 static int parport_nr[LP_NO] = { [0 ... LP_NO-1] = LP_PARPORT_UNSPEC };
628 static int reset = 0;
629 
630 static int parport_ptr = 0;
631 
632 void __init lp_setup(char *str, int *ints)
633 {
634         if (!str) {
635                 if (ints[0] == 0 || ints[1] == 0) {
636                         /* disable driver on "lp=" or "lp=0" */
637                         parport_nr[0] = LP_PARPORT_OFF;
638                 } else {
639                         printk(KERN_WARNING "warning: 'lp=0x%x' is deprecated, ignored\n", ints[1]);
640                 }
641         } else if (!strncmp(str, "parport", 7)) {
642                 int n = simple_strtoul(str+7, NULL, 10);
643                 if (parport_ptr < LP_NO)
644                         parport_nr[parport_ptr++] = n;
645                 else
646                         printk(KERN_INFO "lp: too many ports, %s ignored.\n",
647                                str);
648         } else if (!strcmp(str, "auto")) {
649                 parport_nr[0] = LP_PARPORT_AUTO;
650         } else if (!strcmp(str, "none")) {
651                 parport_nr[parport_ptr++] = LP_PARPORT_NONE;
652         } else if (!strcmp(str, "reset")) {
653                 reset = 1;
654         }
655 }
656 
657 #endif
658 
659 static int lp_register(int nr, struct parport *port)
660 {
661         char name[8];
662 
663         lp_table[nr].dev = parport_register_device(port, "lp", 
664                                                    NULL, NULL, NULL, 0,
665                                                    (void *) &lp_table[nr]);
666         if (lp_table[nr].dev == NULL)
667                 return 1;
668         lp_table[nr].flags |= LP_EXIST;
669 
670         if (reset)
671                 lp_reset(nr);
672 
673         sprintf (name, "%d", nr);
674         devfs_register (devfs_handle, name,
675                         DEVFS_FL_DEFAULT, LP_MAJOR, nr,
676                         S_IFCHR | S_IRUGO | S_IWUGO,
677                         &lp_fops, NULL);
678 
679         printk(KERN_INFO "lp%d: using %s (%s).\n", nr, port->name, 
680                (port->irq == PARPORT_IRQ_NONE)?"polling":"interrupt-driven");
681 
682 #ifdef CONFIG_LP_CONSOLE
683         if (!nr) {
684                 if (port->modes & PARPORT_MODE_SAFEININT) {
685                         MOD_INC_USE_COUNT;
686                         register_console (&lpcons);
687                         printk (KERN_INFO "lp%d: console ready\n", CONSOLE_LP);
688                 } else
689                         printk (KERN_ERR "lp%d: cannot run console on %s\n",
690                                 CONSOLE_LP, port->name);
691         }
692 #endif
693 
694         return 0;
695 }
696 
697 static void lp_attach (struct parport *port)
698 {
699         unsigned int i;
700 
701         switch (parport_nr[0])
702         {
703         case LP_PARPORT_UNSPEC:
704         case LP_PARPORT_AUTO:
705                 if (parport_nr[0] == LP_PARPORT_AUTO &&
706                     port->probe_info[0].class != PARPORT_CLASS_PRINTER)
707                         return;
708                 if (lp_count == LP_NO) {
709                         printk("lp: ignoring parallel port (max. %d)\n",LP_NO);
710                         return;
711                 }
712                 if (!lp_register(lp_count, port))
713                         lp_count++;
714                 break;
715 
716         default:
717                 for (i = 0; i < LP_NO; i++) {
718                         if (port->number == parport_nr[i]) {
719                                 if (!lp_register(i, port))
720                                         lp_count++;
721                                 break;
722                         }
723                 }
724                 break;
725         }
726 }
727 
728 static void lp_detach (struct parport *port)
729 {
730         /* Write this some day. */
731 }
732 
733 static struct parport_driver lp_driver = {
734         "lp",
735         lp_attach,
736         lp_detach,
737         NULL
738 };
739 
740 int __init lp_init (void)
741 {
742         int i;
743 
744         if (parport_nr[0] == LP_PARPORT_OFF)
745                 return 0;
746 
747         for (i = 0; i < LP_NO; i++) {
748                 lp_table[i].dev = NULL;
749                 lp_table[i].flags = 0;
750                 lp_table[i].chars = LP_INIT_CHAR;
751                 lp_table[i].time = LP_INIT_TIME;
752                 lp_table[i].wait = LP_INIT_WAIT;
753                 lp_table[i].lp_buffer = NULL;
754 #ifdef LP_STATS
755                 lp_table[i].lastcall = 0;
756                 lp_table[i].runchars = 0;
757                 memset (&lp_table[i].stats, 0, sizeof (struct lp_stats));
758 #endif
759                 lp_table[i].last_error = 0;
760                 init_waitqueue_head (&lp_table[i].waitq);
761                 init_waitqueue_head (&lp_table[i].dataq);
762                 init_MUTEX (&lp_table[i].port_mutex);
763                 lp_table[i].timeout = 10 * HZ;
764         }
765 
766         if (devfs_register_chrdev (LP_MAJOR, "lp", &lp_fops)) {
767                 printk ("lp: unable to get major %d\n", LP_MAJOR);
768                 return -EIO;
769         }
770 
771         devfs_handle = devfs_mk_dir (NULL, "printers", NULL);
772 
773         if (parport_register_driver (&lp_driver)) {
774                 printk ("lp: unable to register with parport\n");
775                 return -EIO;
776         }
777 
778         if (!lp_count) {
779                 printk (KERN_INFO "lp: driver loaded but no devices found\n");
780 #ifndef CONFIG_PARPORT_1284
781                 if (parport_nr[0] == LP_PARPORT_AUTO)
782                         printk (KERN_INFO "lp: (is IEEE 1284 support enabled?)\n");
783 #endif
784         }
785 
786         return 0;
787 }
788 
789 #ifdef MODULE
790 int init_module(void)
791 {
792         if (parport[0]) {
793                 /* The user gave some parameters.  Let's see what they were.  */
794                 if (!strncmp(parport[0], "auto", 4))
795                         parport_nr[0] = LP_PARPORT_AUTO;
796                 else {
797                         int n;
798                         for (n = 0; n < LP_NO && parport[n]; n++) {
799                                 if (!strncmp(parport[n], "none", 4))
800                                         parport_nr[n] = LP_PARPORT_NONE;
801                                 else {
802                                         char *ep;
803                                         unsigned long r = simple_strtoul(parport[n], &ep, 0);
804                                         if (ep != parport[n]) 
805                                                 parport_nr[n] = r;
806                                         else {
807                                                 printk(KERN_ERR "lp: bad port specifier `%s'\n", parport[n]);
808                                                 return -ENODEV;
809                                         }
810                                 }
811                         }
812                 }
813         }
814 
815         return lp_init();
816 }
817 
818 void cleanup_module(void)
819 {
820         unsigned int offset;
821 
822         parport_unregister_driver (&lp_driver);
823 
824 #ifdef CONFIG_LP_CONSOLE
825         unregister_console (&lpcons);
826 #endif
827 
828         devfs_unregister (devfs_handle);
829         devfs_unregister_chrdev(LP_MAJOR, "lp");
830         for (offset = 0; offset < LP_NO; offset++) {
831                 if (lp_table[offset].dev == NULL)
832                         continue;
833                 parport_unregister_device(lp_table[offset].dev);
834         }
835 }
836 #endif
837 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.