root/drivers/char/lp.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. lp_claim_parport_or_block
  2. lp_release_parport
  3. lp_preempt
  4. lp_negotiate
  5. lp_reset
  6. lp_error
  7. lp_check_status
  8. lp_wait_ready
  9. lp_write
  10. lp_read
  11. lp_open
  12. lp_release
  13. lp_do_ioctl
  14. lp_set_timeout
  15. lp_set_timeout32
  16. lp_set_timeout64
  17. lp_ioctl
  18. lp_compat_ioctl
  19. lp_console_write
  20. lp_setup
  21. lp_register
  22. lp_attach
  23. lp_detach
  24. lp_init
  25. lp_init_module
  26. lp_cleanup_module

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Generic parallel printer driver
   4  *
   5  * Copyright (C) 1992 by Jim Weigand and Linus Torvalds
   6  * Copyright (C) 1992,1993 by Michael K. Johnson
   7  * - Thanks much to Gunter Windau for pointing out to me where the error
   8  *   checking ought to be.
   9  * Copyright (C) 1993 by Nigel Gamble (added interrupt code)
  10  * Copyright (C) 1994 by Alan Cox (Modularised it)
  11  * LPCAREFUL, LPABORT, LPGETSTATUS added by Chris Metcalf, metcalf@lcs.mit.edu
  12  * Statistics and support for slow printers by Rob Janssen, rob@knoware.nl
  13  * "lp=" command line parameters added by Grant Guenther, grant@torque.net
  14  * lp_read (Status readback) support added by Carsten Gross,
  15  *                                             carsten@sol.wohnheim.uni-ulm.de
  16  * Support for parport by Philip Blundell <philb@gnu.org>
  17  * Parport sharing hacking by Andrea Arcangeli
  18  * Fixed kernel_(to/from)_user memory copy to check for errors
  19  *                              by Riccardo Facchetti <fizban@tin.it>
  20  * 22-JAN-1998  Added support for devfs  Richard Gooch <rgooch@atnf.csiro.au>
  21  * Redesigned interrupt handling for handle printers with buggy handshake
  22  *                              by Andrea Arcangeli, 11 May 1998
  23  * Full efficient handling of printer with buggy irq handshake (now I have
  24  * understood the meaning of the strange handshake). This is done sending new
  25  * characters if the interrupt is just happened, even if the printer say to
  26  * be still BUSY. This is needed at least with Epson Stylus Color. To enable
  27  * the new TRUST_IRQ mode read the `LP OPTIMIZATION' section below...
  28  * Fixed the irq on the rising edge of the strobe case.
  29  * Obsoleted the CAREFUL flag since a printer that doesn' t work with
  30  * CAREFUL will block a bit after in lp_check_status().
  31  *                              Andrea Arcangeli, 15 Oct 1998
  32  * Obsoleted and removed all the lowlevel stuff implemented in the last
  33  * month to use the IEEE1284 functions (that handle the _new_ compatibilty
  34  * mode fine).
  35  */
  36 
  37 /* This driver should, in theory, work with any parallel port that has an
  38  * appropriate low-level driver; all I/O is done through the parport
  39  * abstraction layer.
  40  *
  41  * If this driver is built into the kernel, you can configure it using the
  42  * kernel command-line.  For example:
  43  *
  44  *      lp=parport1,none,parport2       (bind lp0 to parport1, disable lp1 and
  45  *                                       bind lp2 to parport2)
  46  *
  47  *      lp=auto                         (assign lp devices to all ports that
  48  *                                       have printers attached, as determined
  49  *                                       by the IEEE-1284 autoprobe)
  50  *
  51  *      lp=reset                        (reset the printer during
  52  *                                       initialisation)
  53  *
  54  *      lp=off                          (disable the printer driver entirely)
  55  *
  56  * If the driver is loaded as a module, similar functionality is available
  57  * using module parameters.  The equivalent of the above commands would be:
  58  *
  59  *      # insmod lp.o parport=1,none,2
  60  *
  61  *      # insmod lp.o parport=auto
  62  *
  63  *      # insmod lp.o reset=1
  64  */
  65 
  66 /* COMPATIBILITY WITH OLD KERNELS
  67  *
  68  * Under Linux 2.0 and previous versions, lp devices were bound to ports at
  69  * particular I/O addresses, as follows:
  70  *
  71  *      lp0             0x3bc
  72  *      lp1             0x378
  73  *      lp2             0x278
  74  *
  75  * The new driver, by default, binds lp devices to parport devices as it
  76  * finds them.  This means that if you only have one port, it will be bound
  77  * to lp0 regardless of its I/O address.  If you need the old behaviour, you
  78  * can force it using the parameters described above.
  79  */
  80 
  81 /*
  82  * The new interrupt handling code take care of the buggy handshake
  83  * of some HP and Epson printer:
  84  * ___
  85  * ACK    _______________    ___________
  86  *                       |__|
  87  * ____
  88  * BUSY   _________              _______
  89  *                 |____________|
  90  *
  91  * I discovered this using the printer scanner that you can find at:
  92  *
  93  *      ftp://e-mind.com/pub/linux/pscan/
  94  *
  95  *                                      11 May 98, Andrea Arcangeli
  96  *
  97  * My printer scanner run on an Epson Stylus Color show that such printer
  98  * generates the irq on the _rising_ edge of the STROBE. Now lp handle
  99  * this case fine too.
 100  *
 101  *                                      15 Oct 1998, Andrea Arcangeli
 102  *
 103  * The so called `buggy' handshake is really the well documented
 104  * compatibility mode IEEE1284 handshake. They changed the well known
 105  * Centronics handshake acking in the middle of busy expecting to not
 106  * break drivers or legacy application, while they broken linux lp
 107  * until I fixed it reverse engineering the protocol by hand some
 108  * month ago...
 109  *
 110  *                                     14 Dec 1998, Andrea Arcangeli
 111  *
 112  * Copyright (C) 2000 by Tim Waugh (added LPSETTIMEOUT ioctl)
 113  */
 114 
 115 #include <linux/module.h>
 116 #include <linux/init.h>
 117 
 118 #include <linux/errno.h>
 119 #include <linux/kernel.h>
 120 #include <linux/major.h>
 121 #include <linux/sched/signal.h>
 122 #include <linux/slab.h>
 123 #include <linux/fcntl.h>
 124 #include <linux/delay.h>
 125 #include <linux/poll.h>
 126 #include <linux/console.h>
 127 #include <linux/device.h>
 128 #include <linux/wait.h>
 129 #include <linux/jiffies.h>
 130 #include <linux/mutex.h>
 131 #include <linux/compat.h>
 132 
 133 #include <linux/parport.h>
 134 #undef LP_STATS
 135 #include <linux/lp.h>
 136 
 137 #include <asm/irq.h>
 138 #include <linux/uaccess.h>
 139 
 140 /* if you have more than 8 printers, remember to increase LP_NO */
 141 #define LP_NO 8
 142 
 143 static DEFINE_MUTEX(lp_mutex);
 144 static struct lp_struct lp_table[LP_NO];
 145 static int port_num[LP_NO];
 146 
 147 static unsigned int lp_count = 0;
 148 static struct class *lp_class;
 149 
 150 #ifdef CONFIG_LP_CONSOLE
 151 static struct parport *console_registered;
 152 #endif /* CONFIG_LP_CONSOLE */
 153 
 154 #undef LP_DEBUG
 155 
 156 /* Bits used to manage claiming the parport device */
 157 #define LP_PREEMPT_REQUEST 1
 158 #define LP_PARPORT_CLAIMED 2
 159 
 160 /* --- low-level port access ----------------------------------- */
 161 
 162 #define r_dtr(x)        (parport_read_data(lp_table[(x)].dev->port))
 163 #define r_str(x)        (parport_read_status(lp_table[(x)].dev->port))
 164 #define w_ctr(x,y)      do { parport_write_control(lp_table[(x)].dev->port, (y)); } while (0)
 165 #define w_dtr(x,y)      do { parport_write_data(lp_table[(x)].dev->port, (y)); } while (0)
 166 
 167 /* Claim the parport or block trying unless we've already claimed it */
 168 static void lp_claim_parport_or_block(struct lp_struct *this_lp)
 169 {
 170         if (!test_and_set_bit(LP_PARPORT_CLAIMED, &this_lp->bits)) {
 171                 parport_claim_or_block(this_lp->dev);
 172         }
 173 }
 174 
 175 /* Claim the parport or block trying unless we've already claimed it */
 176 static void lp_release_parport(struct lp_struct *this_lp)
 177 {
 178         if (test_and_clear_bit(LP_PARPORT_CLAIMED, &this_lp->bits)) {
 179                 parport_release(this_lp->dev);
 180         }
 181 }
 182 
 183 
 184 
 185 static int lp_preempt(void *handle)
 186 {
 187         struct lp_struct *this_lp = (struct lp_struct *)handle;
 188         set_bit(LP_PREEMPT_REQUEST, &this_lp->bits);
 189         return 1;
 190 }
 191 
 192 
 193 /*
 194  * Try to negotiate to a new mode; if unsuccessful negotiate to
 195  * compatibility mode.  Return the mode we ended up in.
 196  */
 197 static int lp_negotiate(struct parport *port, int mode)
 198 {
 199         if (parport_negotiate(port, mode) != 0) {
 200                 mode = IEEE1284_MODE_COMPAT;
 201                 parport_negotiate(port, mode);
 202         }
 203 
 204         return mode;
 205 }
 206 
 207 static int lp_reset(int minor)
 208 {
 209         int retval;
 210         lp_claim_parport_or_block(&lp_table[minor]);
 211         w_ctr(minor, LP_PSELECP);
 212         udelay(LP_DELAY);
 213         w_ctr(minor, LP_PSELECP | LP_PINITP);
 214         retval = r_str(minor);
 215         lp_release_parport(&lp_table[minor]);
 216         return retval;
 217 }
 218 
 219 static void lp_error(int minor)
 220 {
 221         DEFINE_WAIT(wait);
 222         int polling;
 223 
 224         if (LP_F(minor) & LP_ABORT)
 225                 return;
 226 
 227         polling = lp_table[minor].dev->port->irq == PARPORT_IRQ_NONE;
 228         if (polling)
 229                 lp_release_parport(&lp_table[minor]);
 230         prepare_to_wait(&lp_table[minor].waitq, &wait, TASK_INTERRUPTIBLE);
 231         schedule_timeout(LP_TIMEOUT_POLLED);
 232         finish_wait(&lp_table[minor].waitq, &wait);
 233         if (polling)
 234                 lp_claim_parport_or_block(&lp_table[minor]);
 235         else
 236                 parport_yield_blocking(lp_table[minor].dev);
 237 }
 238 
 239 static int lp_check_status(int minor)
 240 {
 241         int error = 0;
 242         unsigned int last = lp_table[minor].last_error;
 243         unsigned char status = r_str(minor);
 244         if ((status & LP_PERRORP) && !(LP_F(minor) & LP_CAREFUL))
 245                 /* No error. */
 246                 last = 0;
 247         else if ((status & LP_POUTPA)) {
 248                 if (last != LP_POUTPA) {
 249                         last = LP_POUTPA;
 250                         printk(KERN_INFO "lp%d out of paper\n", minor);
 251                 }
 252                 error = -ENOSPC;
 253         } else if (!(status & LP_PSELECD)) {
 254                 if (last != LP_PSELECD) {
 255                         last = LP_PSELECD;
 256                         printk(KERN_INFO "lp%d off-line\n", minor);
 257                 }
 258                 error = -EIO;
 259         } else if (!(status & LP_PERRORP)) {
 260                 if (last != LP_PERRORP) {
 261                         last = LP_PERRORP;
 262                         printk(KERN_INFO "lp%d on fire\n", minor);
 263                 }
 264                 error = -EIO;
 265         } else {
 266                 last = 0; /* Come here if LP_CAREFUL is set and no
 267                              errors are reported. */
 268         }
 269 
 270         lp_table[minor].last_error = last;
 271 
 272         if (last != 0)
 273                 lp_error(minor);
 274 
 275         return error;
 276 }
 277 
 278 static int lp_wait_ready(int minor, int nonblock)
 279 {
 280         int error = 0;
 281 
 282         /* If we're not in compatibility mode, we're ready now! */
 283         if (lp_table[minor].current_mode != IEEE1284_MODE_COMPAT) {
 284                 return 0;
 285         }
 286 
 287         do {
 288                 error = lp_check_status(minor);
 289                 if (error && (nonblock || (LP_F(minor) & LP_ABORT)))
 290                         break;
 291                 if (signal_pending(current)) {
 292                         error = -EINTR;
 293                         break;
 294                 }
 295         } while (error);
 296         return error;
 297 }
 298 
 299 static ssize_t lp_write(struct file *file, const char __user *buf,
 300                         size_t count, loff_t *ppos)
 301 {
 302         unsigned int minor = iminor(file_inode(file));
 303         struct parport *port = lp_table[minor].dev->port;
 304         char *kbuf = lp_table[minor].lp_buffer;
 305         ssize_t retv = 0;
 306         ssize_t written;
 307         size_t copy_size = count;
 308         int nonblock = ((file->f_flags & O_NONBLOCK) ||
 309                         (LP_F(minor) & LP_ABORT));
 310 
 311 #ifdef LP_STATS
 312         if (time_after(jiffies, lp_table[minor].lastcall + LP_TIME(minor)))
 313                 lp_table[minor].runchars = 0;
 314 
 315         lp_table[minor].lastcall = jiffies;
 316 #endif
 317 
 318         /* Need to copy the data from user-space. */
 319         if (copy_size > LP_BUFFER_SIZE)
 320                 copy_size = LP_BUFFER_SIZE;
 321 
 322         if (mutex_lock_interruptible(&lp_table[minor].port_mutex))
 323                 return -EINTR;
 324 
 325         if (copy_from_user(kbuf, buf, copy_size)) {
 326                 retv = -EFAULT;
 327                 goto out_unlock;
 328         }
 329 
 330         /* Claim Parport or sleep until it becomes available
 331          */
 332         lp_claim_parport_or_block(&lp_table[minor]);
 333         /* Go to the proper mode. */
 334         lp_table[minor].current_mode = lp_negotiate(port,
 335                                                     lp_table[minor].best_mode);
 336 
 337         parport_set_timeout(lp_table[minor].dev,
 338                             (nonblock ? PARPORT_INACTIVITY_O_NONBLOCK
 339                              : lp_table[minor].timeout));
 340 
 341         if ((retv = lp_wait_ready(minor, nonblock)) == 0)
 342         do {
 343                 /* Write the data. */
 344                 written = parport_write(port, kbuf, copy_size);
 345                 if (written > 0) {
 346                         copy_size -= written;
 347                         count -= written;
 348                         buf  += written;
 349                         retv += written;
 350                 }
 351 
 352                 if (signal_pending(current)) {
 353                         if (retv == 0)
 354                                 retv = -EINTR;
 355 
 356                         break;
 357                 }
 358 
 359                 if (copy_size > 0) {
 360                         /* incomplete write -> check error ! */
 361                         int error;
 362 
 363                         parport_negotiate(lp_table[minor].dev->port,
 364                                           IEEE1284_MODE_COMPAT);
 365                         lp_table[minor].current_mode = IEEE1284_MODE_COMPAT;
 366 
 367                         error = lp_wait_ready(minor, nonblock);
 368 
 369                         if (error) {
 370                                 if (retv == 0)
 371                                         retv = error;
 372                                 break;
 373                         } else if (nonblock) {
 374                                 if (retv == 0)
 375                                         retv = -EAGAIN;
 376                                 break;
 377                         }
 378 
 379                         parport_yield_blocking(lp_table[minor].dev);
 380                         lp_table[minor].current_mode
 381                           = lp_negotiate(port,
 382                                          lp_table[minor].best_mode);
 383 
 384                 } else if (need_resched())
 385                         schedule();
 386 
 387                 if (count) {
 388                         copy_size = count;
 389                         if (copy_size > LP_BUFFER_SIZE)
 390                                 copy_size = LP_BUFFER_SIZE;
 391 
 392                         if (copy_from_user(kbuf, buf, copy_size)) {
 393                                 if (retv == 0)
 394                                         retv = -EFAULT;
 395                                 break;
 396                         }
 397                 }
 398         } while (count > 0);
 399 
 400         if (test_and_clear_bit(LP_PREEMPT_REQUEST,
 401                                &lp_table[minor].bits)) {
 402                 printk(KERN_INFO "lp%d releasing parport\n", minor);
 403                 parport_negotiate(lp_table[minor].dev->port,
 404                                   IEEE1284_MODE_COMPAT);
 405                 lp_table[minor].current_mode = IEEE1284_MODE_COMPAT;
 406                 lp_release_parport(&lp_table[minor]);
 407         }
 408 out_unlock:
 409         mutex_unlock(&lp_table[minor].port_mutex);
 410 
 411         return retv;
 412 }
 413 
 414 #ifdef CONFIG_PARPORT_1284
 415 
 416 /* Status readback conforming to ieee1284 */
 417 static ssize_t lp_read(struct file *file, char __user *buf,
 418                        size_t count, loff_t *ppos)
 419 {
 420         DEFINE_WAIT(wait);
 421         unsigned int minor=iminor(file_inode(file));
 422         struct parport *port = lp_table[minor].dev->port;
 423         ssize_t retval = 0;
 424         char *kbuf = lp_table[minor].lp_buffer;
 425         int nonblock = ((file->f_flags & O_NONBLOCK) ||
 426                         (LP_F(minor) & LP_ABORT));
 427 
 428         if (count > LP_BUFFER_SIZE)
 429                 count = LP_BUFFER_SIZE;
 430 
 431         if (mutex_lock_interruptible(&lp_table[minor].port_mutex))
 432                 return -EINTR;
 433 
 434         lp_claim_parport_or_block(&lp_table[minor]);
 435 
 436         parport_set_timeout(lp_table[minor].dev,
 437                             (nonblock ? PARPORT_INACTIVITY_O_NONBLOCK
 438                              : lp_table[minor].timeout));
 439 
 440         parport_negotiate(lp_table[minor].dev->port, IEEE1284_MODE_COMPAT);
 441         if (parport_negotiate(lp_table[minor].dev->port,
 442                               IEEE1284_MODE_NIBBLE)) {
 443                 retval = -EIO;
 444                 goto out;
 445         }
 446 
 447         while (retval == 0) {
 448                 retval = parport_read(port, kbuf, count);
 449 
 450                 if (retval > 0)
 451                         break;
 452 
 453                 if (nonblock) {
 454                         retval = -EAGAIN;
 455                         break;
 456                 }
 457 
 458                 /* Wait for data. */
 459 
 460                 if (lp_table[minor].dev->port->irq == PARPORT_IRQ_NONE) {
 461                         parport_negotiate(lp_table[minor].dev->port,
 462                                           IEEE1284_MODE_COMPAT);
 463                         lp_error(minor);
 464                         if (parport_negotiate(lp_table[minor].dev->port,
 465                                               IEEE1284_MODE_NIBBLE)) {
 466                                 retval = -EIO;
 467                                 goto out;
 468                         }
 469                 } else {
 470                         prepare_to_wait(&lp_table[minor].waitq, &wait, TASK_INTERRUPTIBLE);
 471                         schedule_timeout(LP_TIMEOUT_POLLED);
 472                         finish_wait(&lp_table[minor].waitq, &wait);
 473                 }
 474 
 475                 if (signal_pending(current)) {
 476                         retval = -ERESTARTSYS;
 477                         break;
 478                 }
 479 
 480                 cond_resched();
 481         }
 482         parport_negotiate(lp_table[minor].dev->port, IEEE1284_MODE_COMPAT);
 483  out:
 484         lp_release_parport(&lp_table[minor]);
 485 
 486         if (retval > 0 && copy_to_user(buf, kbuf, retval))
 487                 retval = -EFAULT;
 488 
 489         mutex_unlock(&lp_table[minor].port_mutex);
 490 
 491         return retval;
 492 }
 493 
 494 #endif /* IEEE 1284 support */
 495 
 496 static int lp_open(struct inode *inode, struct file *file)
 497 {
 498         unsigned int minor = iminor(inode);
 499         int ret = 0;
 500 
 501         mutex_lock(&lp_mutex);
 502         if (minor >= LP_NO) {
 503                 ret = -ENXIO;
 504                 goto out;
 505         }
 506         if ((LP_F(minor) & LP_EXIST) == 0) {
 507                 ret = -ENXIO;
 508                 goto out;
 509         }
 510         if (test_and_set_bit(LP_BUSY_BIT_POS, &LP_F(minor))) {
 511                 ret = -EBUSY;
 512                 goto out;
 513         }
 514         /* If ABORTOPEN is set and the printer is offline or out of paper,
 515            we may still want to open it to perform ioctl()s.  Therefore we
 516            have commandeered O_NONBLOCK, even though it is being used in
 517            a non-standard manner.  This is strictly a Linux hack, and
 518            should most likely only ever be used by the tunelp application. */
 519         if ((LP_F(minor) & LP_ABORTOPEN) && !(file->f_flags & O_NONBLOCK)) {
 520                 int status;
 521                 lp_claim_parport_or_block(&lp_table[minor]);
 522                 status = r_str(minor);
 523                 lp_release_parport(&lp_table[minor]);
 524                 if (status & LP_POUTPA) {
 525                         printk(KERN_INFO "lp%d out of paper\n", minor);
 526                         LP_F(minor) &= ~LP_BUSY;
 527                         ret = -ENOSPC;
 528                         goto out;
 529                 } else if (!(status & LP_PSELECD)) {
 530                         printk(KERN_INFO "lp%d off-line\n", minor);
 531                         LP_F(minor) &= ~LP_BUSY;
 532                         ret = -EIO;
 533                         goto out;
 534                 } else if (!(status & LP_PERRORP)) {
 535                         printk(KERN_ERR "lp%d printer error\n", minor);
 536                         LP_F(minor) &= ~LP_BUSY;
 537                         ret = -EIO;
 538                         goto out;
 539                 }
 540         }
 541         lp_table[minor].lp_buffer = kmalloc(LP_BUFFER_SIZE, GFP_KERNEL);
 542         if (!lp_table[minor].lp_buffer) {
 543                 LP_F(minor) &= ~LP_BUSY;
 544                 ret = -ENOMEM;
 545                 goto out;
 546         }
 547         /* Determine if the peripheral supports ECP mode */
 548         lp_claim_parport_or_block(&lp_table[minor]);
 549         if ( (lp_table[minor].dev->port->modes & PARPORT_MODE_ECP) &&
 550              !parport_negotiate(lp_table[minor].dev->port,
 551                                  IEEE1284_MODE_ECP)) {
 552                 printk(KERN_INFO "lp%d: ECP mode\n", minor);
 553                 lp_table[minor].best_mode = IEEE1284_MODE_ECP;
 554         } else {
 555                 lp_table[minor].best_mode = IEEE1284_MODE_COMPAT;
 556         }
 557         /* Leave peripheral in compatibility mode */
 558         parport_negotiate(lp_table[minor].dev->port, IEEE1284_MODE_COMPAT);
 559         lp_release_parport(&lp_table[minor]);
 560         lp_table[minor].current_mode = IEEE1284_MODE_COMPAT;
 561 out:
 562         mutex_unlock(&lp_mutex);
 563         return ret;
 564 }
 565 
 566 static int lp_release(struct inode *inode, struct file *file)
 567 {
 568         unsigned int minor = iminor(inode);
 569 
 570         lp_claim_parport_or_block(&lp_table[minor]);
 571         parport_negotiate(lp_table[minor].dev->port, IEEE1284_MODE_COMPAT);
 572         lp_table[minor].current_mode = IEEE1284_MODE_COMPAT;
 573         lp_release_parport(&lp_table[minor]);
 574         kfree(lp_table[minor].lp_buffer);
 575         lp_table[minor].lp_buffer = NULL;
 576         LP_F(minor) &= ~LP_BUSY;
 577         return 0;
 578 }
 579 
 580 static int lp_do_ioctl(unsigned int minor, unsigned int cmd,
 581         unsigned long arg, void __user *argp)
 582 {
 583         int status;
 584         int retval = 0;
 585 
 586 #ifdef LP_DEBUG
 587         printk(KERN_DEBUG "lp%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
 588 #endif
 589         if (minor >= LP_NO)
 590                 return -ENODEV;
 591         if ((LP_F(minor) & LP_EXIST) == 0)
 592                 return -ENODEV;
 593         switch ( cmd ) {
 594                 case LPTIME:
 595                         if (arg > UINT_MAX / HZ)
 596                                 return -EINVAL;
 597                         LP_TIME(minor) = arg * HZ/100;
 598                         break;
 599                 case LPCHAR:
 600                         LP_CHAR(minor) = arg;
 601                         break;
 602                 case LPABORT:
 603                         if (arg)
 604                                 LP_F(minor) |= LP_ABORT;
 605                         else
 606                                 LP_F(minor) &= ~LP_ABORT;
 607                         break;
 608                 case LPABORTOPEN:
 609                         if (arg)
 610                                 LP_F(minor) |= LP_ABORTOPEN;
 611                         else
 612                                 LP_F(minor) &= ~LP_ABORTOPEN;
 613                         break;
 614                 case LPCAREFUL:
 615                         if (arg)
 616                                 LP_F(minor) |= LP_CAREFUL;
 617                         else
 618                                 LP_F(minor) &= ~LP_CAREFUL;
 619                         break;
 620                 case LPWAIT:
 621                         LP_WAIT(minor) = arg;
 622                         break;
 623                 case LPSETIRQ:
 624                         return -EINVAL;
 625                         break;
 626                 case LPGETIRQ:
 627                         if (copy_to_user(argp, &LP_IRQ(minor),
 628                                         sizeof(int)))
 629                                 return -EFAULT;
 630                         break;
 631                 case LPGETSTATUS:
 632                         if (mutex_lock_interruptible(&lp_table[minor].port_mutex))
 633                                 return -EINTR;
 634                         lp_claim_parport_or_block(&lp_table[minor]);
 635                         status = r_str(minor);
 636                         lp_release_parport(&lp_table[minor]);
 637                         mutex_unlock(&lp_table[minor].port_mutex);
 638 
 639                         if (copy_to_user(argp, &status, sizeof(int)))
 640                                 return -EFAULT;
 641                         break;
 642                 case LPRESET:
 643                         lp_reset(minor);
 644                         break;
 645 #ifdef LP_STATS
 646                 case LPGETSTATS:
 647                         if (copy_to_user(argp, &LP_STAT(minor),
 648                                         sizeof(struct lp_stats)))
 649                                 return -EFAULT;
 650                         if (capable(CAP_SYS_ADMIN))
 651                                 memset(&LP_STAT(minor), 0,
 652                                                 sizeof(struct lp_stats));
 653                         break;
 654 #endif
 655                 case LPGETFLAGS:
 656                         status = LP_F(minor);
 657                         if (copy_to_user(argp, &status, sizeof(int)))
 658                                 return -EFAULT;
 659                         break;
 660 
 661                 default:
 662                         retval = -EINVAL;
 663         }
 664         return retval;
 665 }
 666 
 667 static int lp_set_timeout(unsigned int minor, s64 tv_sec, long tv_usec)
 668 {
 669         long to_jiffies;
 670 
 671         /* Convert to jiffies, place in lp_table */
 672         if (tv_sec < 0 || tv_usec < 0)
 673                 return -EINVAL;
 674 
 675         /*
 676          * we used to not check, so let's not make this fatal,
 677          * but deal with user space passing a 32-bit tv_nsec in
 678          * a 64-bit field, capping the timeout to 1 second
 679          * worth of microseconds, and capping the total at
 680          * MAX_JIFFY_OFFSET.
 681          */
 682         if (tv_usec > 999999)
 683                 tv_usec = 999999;
 684 
 685         if (tv_sec >= MAX_SEC_IN_JIFFIES - 1) {
 686                 to_jiffies = MAX_JIFFY_OFFSET;
 687         } else {
 688                 to_jiffies = DIV_ROUND_UP(tv_usec, 1000000/HZ);
 689                 to_jiffies += tv_sec * (long) HZ;
 690         }
 691 
 692         if (to_jiffies <= 0) {
 693                 return -EINVAL;
 694         }
 695         lp_table[minor].timeout = to_jiffies;
 696         return 0;
 697 }
 698 
 699 static int lp_set_timeout32(unsigned int minor, void __user *arg)
 700 {
 701         s32 karg[2];
 702 
 703         if (copy_from_user(karg, arg, sizeof(karg)))
 704                 return -EFAULT;
 705 
 706         return lp_set_timeout(minor, karg[0], karg[1]);
 707 }
 708 
 709 static int lp_set_timeout64(unsigned int minor, void __user *arg)
 710 {
 711         s64 karg[2];
 712 
 713         if (copy_from_user(karg, arg, sizeof(karg)))
 714                 return -EFAULT;
 715 
 716         /* sparc64 suseconds_t is 32-bit only */
 717         if (IS_ENABLED(CONFIG_SPARC64) && !in_compat_syscall())
 718                 karg[1] >>= 32;
 719 
 720         return lp_set_timeout(minor, karg[0], karg[1]);
 721 }
 722 
 723 static long lp_ioctl(struct file *file, unsigned int cmd,
 724                         unsigned long arg)
 725 {
 726         unsigned int minor;
 727         int ret;
 728 
 729         minor = iminor(file_inode(file));
 730         mutex_lock(&lp_mutex);
 731         switch (cmd) {
 732         case LPSETTIMEOUT_OLD:
 733                 if (BITS_PER_LONG == 32) {
 734                         ret = lp_set_timeout32(minor, (void __user *)arg);
 735                         break;
 736                 }
 737                 /* fall through - for 64-bit */
 738         case LPSETTIMEOUT_NEW:
 739                 ret = lp_set_timeout64(minor, (void __user *)arg);
 740                 break;
 741         default:
 742                 ret = lp_do_ioctl(minor, cmd, arg, (void __user *)arg);
 743                 break;
 744         }
 745         mutex_unlock(&lp_mutex);
 746 
 747         return ret;
 748 }
 749 
 750 #ifdef CONFIG_COMPAT
 751 static long lp_compat_ioctl(struct file *file, unsigned int cmd,
 752                         unsigned long arg)
 753 {
 754         unsigned int minor;
 755         int ret;
 756 
 757         minor = iminor(file_inode(file));
 758         mutex_lock(&lp_mutex);
 759         switch (cmd) {
 760         case LPSETTIMEOUT_OLD:
 761                 if (!COMPAT_USE_64BIT_TIME) {
 762                         ret = lp_set_timeout32(minor, (void __user *)arg);
 763                         break;
 764                 }
 765                 /* fall through - for x32 mode */
 766         case LPSETTIMEOUT_NEW:
 767                 ret = lp_set_timeout64(minor, (void __user *)arg);
 768                 break;
 769 #ifdef LP_STATS
 770         case LPGETSTATS:
 771                 /* FIXME: add an implementation if you set LP_STATS */
 772                 ret = -EINVAL;
 773                 break;
 774 #endif
 775         default:
 776                 ret = lp_do_ioctl(minor, cmd, arg, compat_ptr(arg));
 777                 break;
 778         }
 779         mutex_unlock(&lp_mutex);
 780 
 781         return ret;
 782 }
 783 #endif
 784 
 785 static const struct file_operations lp_fops = {
 786         .owner          = THIS_MODULE,
 787         .write          = lp_write,
 788         .unlocked_ioctl = lp_ioctl,
 789 #ifdef CONFIG_COMPAT
 790         .compat_ioctl   = lp_compat_ioctl,
 791 #endif
 792         .open           = lp_open,
 793         .release        = lp_release,
 794 #ifdef CONFIG_PARPORT_1284
 795         .read           = lp_read,
 796 #endif
 797         .llseek         = noop_llseek,
 798 };
 799 
 800 /* --- support for console on the line printer ----------------- */
 801 
 802 #ifdef CONFIG_LP_CONSOLE
 803 
 804 #define CONSOLE_LP 0
 805 
 806 /* If the printer is out of paper, we can either lose the messages or
 807  * stall until the printer is happy again.  Define CONSOLE_LP_STRICT
 808  * non-zero to get the latter behaviour. */
 809 #define CONSOLE_LP_STRICT 1
 810 
 811 /* The console must be locked when we get here. */
 812 
 813 static void lp_console_write(struct console *co, const char *s,
 814                              unsigned count)
 815 {
 816         struct pardevice *dev = lp_table[CONSOLE_LP].dev;
 817         struct parport *port = dev->port;
 818         ssize_t written;
 819 
 820         if (parport_claim(dev))
 821                 /* Nothing we can do. */
 822                 return;
 823 
 824         parport_set_timeout(dev, 0);
 825 
 826         /* Go to compatibility mode. */
 827         parport_negotiate(port, IEEE1284_MODE_COMPAT);
 828 
 829         do {
 830                 /* Write the data, converting LF->CRLF as we go. */
 831                 ssize_t canwrite = count;
 832                 char *lf = memchr(s, '\n', count);
 833                 if (lf)
 834                         canwrite = lf - s;
 835 
 836                 if (canwrite > 0) {
 837                         written = parport_write(port, s, canwrite);
 838 
 839                         if (written <= 0)
 840                                 continue;
 841 
 842                         s += written;
 843                         count -= written;
 844                         canwrite -= written;
 845                 }
 846 
 847                 if (lf && canwrite <= 0) {
 848                         const char *crlf = "\r\n";
 849                         int i = 2;
 850 
 851                         /* Dodge the original '\n', and put '\r\n' instead. */
 852                         s++;
 853                         count--;
 854                         do {
 855                                 written = parport_write(port, crlf, i);
 856                                 if (written > 0)
 857                                         i -= written, crlf += written;
 858                         } while (i > 0 && (CONSOLE_LP_STRICT || written > 0));
 859                 }
 860         } while (count > 0 && (CONSOLE_LP_STRICT || written > 0));
 861 
 862         parport_release(dev);
 863 }
 864 
 865 static struct console lpcons = {
 866         .name           = "lp",
 867         .write          = lp_console_write,
 868         .flags          = CON_PRINTBUFFER,
 869 };
 870 
 871 #endif /* console on line printer */
 872 
 873 /* --- initialisation code ------------------------------------- */
 874 
 875 static int parport_nr[LP_NO] = { [0 ... LP_NO-1] = LP_PARPORT_UNSPEC };
 876 static char *parport[LP_NO];
 877 static bool reset;
 878 
 879 module_param_array(parport, charp, NULL, 0);
 880 module_param(reset, bool, 0);
 881 
 882 #ifndef MODULE
 883 static int __init lp_setup(char *str)
 884 {
 885         static int parport_ptr;
 886         int x;
 887 
 888         if (get_option(&str, &x)) {
 889                 if (x == 0) {
 890                         /* disable driver on "lp=" or "lp=0" */
 891                         parport_nr[0] = LP_PARPORT_OFF;
 892                 } else {
 893                         printk(KERN_WARNING "warning: 'lp=0x%x' is deprecated, ignored\n", x);
 894                         return 0;
 895                 }
 896         } else if (!strncmp(str, "parport", 7)) {
 897                 int n = simple_strtoul(str+7, NULL, 10);
 898                 if (parport_ptr < LP_NO)
 899                         parport_nr[parport_ptr++] = n;
 900                 else
 901                         printk(KERN_INFO "lp: too many ports, %s ignored.\n",
 902                                str);
 903         } else if (!strcmp(str, "auto")) {
 904                 parport_nr[0] = LP_PARPORT_AUTO;
 905         } else if (!strcmp(str, "none")) {
 906                 if (parport_ptr < LP_NO)
 907                         parport_nr[parport_ptr++] = LP_PARPORT_NONE;
 908                 else
 909                         printk(KERN_INFO "lp: too many ports, %s ignored.\n",
 910                                str);
 911         } else if (!strcmp(str, "reset")) {
 912                 reset = true;
 913         }
 914         return 1;
 915 }
 916 #endif
 917 
 918 static int lp_register(int nr, struct parport *port)
 919 {
 920         struct pardev_cb ppdev_cb;
 921 
 922         memset(&ppdev_cb, 0, sizeof(ppdev_cb));
 923         ppdev_cb.preempt = lp_preempt;
 924         ppdev_cb.private = &lp_table[nr];
 925         lp_table[nr].dev = parport_register_dev_model(port, "lp",
 926                                                       &ppdev_cb, nr);
 927         if (lp_table[nr].dev == NULL)
 928                 return 1;
 929         lp_table[nr].flags |= LP_EXIST;
 930 
 931         if (reset)
 932                 lp_reset(nr);
 933 
 934         device_create(lp_class, port->dev, MKDEV(LP_MAJOR, nr), NULL,
 935                       "lp%d", nr);
 936 
 937         printk(KERN_INFO "lp%d: using %s (%s).\n", nr, port->name,
 938                (port->irq == PARPORT_IRQ_NONE)?"polling":"interrupt-driven");
 939 
 940 #ifdef CONFIG_LP_CONSOLE
 941         if (!nr) {
 942                 if (port->modes & PARPORT_MODE_SAFEININT) {
 943                         register_console(&lpcons);
 944                         console_registered = port;
 945                         printk(KERN_INFO "lp%d: console ready\n", CONSOLE_LP);
 946                 } else
 947                         printk(KERN_ERR "lp%d: cannot run console on %s\n",
 948                                CONSOLE_LP, port->name);
 949         }
 950 #endif
 951         port_num[nr] = port->number;
 952 
 953         return 0;
 954 }
 955 
 956 static void lp_attach(struct parport *port)
 957 {
 958         unsigned int i;
 959 
 960         switch (parport_nr[0]) {
 961         case LP_PARPORT_UNSPEC:
 962         case LP_PARPORT_AUTO:
 963                 if (parport_nr[0] == LP_PARPORT_AUTO &&
 964                     port->probe_info[0].class != PARPORT_CLASS_PRINTER)
 965                         return;
 966                 if (lp_count == LP_NO) {
 967                         printk(KERN_INFO "lp: ignoring parallel port (max. %d)\n",LP_NO);
 968                         return;
 969                 }
 970                 for (i = 0; i < LP_NO; i++)
 971                         if (port_num[i] == -1)
 972                                 break;
 973 
 974                 if (!lp_register(i, port))
 975                         lp_count++;
 976                 break;
 977 
 978         default:
 979                 for (i = 0; i < LP_NO; i++) {
 980                         if (port->number == parport_nr[i]) {
 981                                 if (!lp_register(i, port))
 982                                         lp_count++;
 983                                 break;
 984                         }
 985                 }
 986                 break;
 987         }
 988 }
 989 
 990 static void lp_detach(struct parport *port)
 991 {
 992         int n;
 993 
 994         /* Write this some day. */
 995 #ifdef CONFIG_LP_CONSOLE
 996         if (console_registered == port) {
 997                 unregister_console(&lpcons);
 998                 console_registered = NULL;
 999         }
1000 #endif /* CONFIG_LP_CONSOLE */
1001 
1002         for (n = 0; n < LP_NO; n++) {
1003                 if (port_num[n] == port->number) {
1004                         port_num[n] = -1;
1005                         lp_count--;
1006                         device_destroy(lp_class, MKDEV(LP_MAJOR, n));
1007                         parport_unregister_device(lp_table[n].dev);
1008                 }
1009         }
1010 }
1011 
1012 static struct parport_driver lp_driver = {
1013         .name = "lp",
1014         .match_port = lp_attach,
1015         .detach = lp_detach,
1016         .devmodel = true,
1017 };
1018 
1019 static int __init lp_init(void)
1020 {
1021         int i, err = 0;
1022 
1023         if (parport_nr[0] == LP_PARPORT_OFF)
1024                 return 0;
1025 
1026         for (i = 0; i < LP_NO; i++) {
1027                 lp_table[i].dev = NULL;
1028                 lp_table[i].flags = 0;
1029                 lp_table[i].chars = LP_INIT_CHAR;
1030                 lp_table[i].time = LP_INIT_TIME;
1031                 lp_table[i].wait = LP_INIT_WAIT;
1032                 lp_table[i].lp_buffer = NULL;
1033 #ifdef LP_STATS
1034                 lp_table[i].lastcall = 0;
1035                 lp_table[i].runchars = 0;
1036                 memset(&lp_table[i].stats, 0, sizeof(struct lp_stats));
1037 #endif
1038                 lp_table[i].last_error = 0;
1039                 init_waitqueue_head(&lp_table[i].waitq);
1040                 init_waitqueue_head(&lp_table[i].dataq);
1041                 mutex_init(&lp_table[i].port_mutex);
1042                 lp_table[i].timeout = 10 * HZ;
1043                 port_num[i] = -1;
1044         }
1045 
1046         if (register_chrdev(LP_MAJOR, "lp", &lp_fops)) {
1047                 printk(KERN_ERR "lp: unable to get major %d\n", LP_MAJOR);
1048                 return -EIO;
1049         }
1050 
1051         lp_class = class_create(THIS_MODULE, "printer");
1052         if (IS_ERR(lp_class)) {
1053                 err = PTR_ERR(lp_class);
1054                 goto out_reg;
1055         }
1056 
1057         if (parport_register_driver(&lp_driver)) {
1058                 printk(KERN_ERR "lp: unable to register with parport\n");
1059                 err = -EIO;
1060                 goto out_class;
1061         }
1062 
1063         if (!lp_count) {
1064                 printk(KERN_INFO "lp: driver loaded but no devices found\n");
1065 #ifndef CONFIG_PARPORT_1284
1066                 if (parport_nr[0] == LP_PARPORT_AUTO)
1067                         printk(KERN_INFO "lp: (is IEEE 1284 support enabled?)\n");
1068 #endif
1069         }
1070 
1071         return 0;
1072 
1073 out_class:
1074         class_destroy(lp_class);
1075 out_reg:
1076         unregister_chrdev(LP_MAJOR, "lp");
1077         return err;
1078 }
1079 
1080 static int __init lp_init_module(void)
1081 {
1082         if (parport[0]) {
1083                 /* The user gave some parameters.  Let's see what they were.  */
1084                 if (!strncmp(parport[0], "auto", 4))
1085                         parport_nr[0] = LP_PARPORT_AUTO;
1086                 else {
1087                         int n;
1088                         for (n = 0; n < LP_NO && parport[n]; n++) {
1089                                 if (!strncmp(parport[n], "none", 4))
1090                                         parport_nr[n] = LP_PARPORT_NONE;
1091                                 else {
1092                                         char *ep;
1093                                         unsigned long r = simple_strtoul(parport[n], &ep, 0);
1094                                         if (ep != parport[n])
1095                                                 parport_nr[n] = r;
1096                                         else {
1097                                                 printk(KERN_ERR "lp: bad port specifier `%s'\n", parport[n]);
1098                                                 return -ENODEV;
1099                                         }
1100                                 }
1101                         }
1102                 }
1103         }
1104 
1105         return lp_init();
1106 }
1107 
1108 static void lp_cleanup_module(void)
1109 {
1110         parport_unregister_driver(&lp_driver);
1111 
1112 #ifdef CONFIG_LP_CONSOLE
1113         unregister_console(&lpcons);
1114 #endif
1115 
1116         unregister_chrdev(LP_MAJOR, "lp");
1117         class_destroy(lp_class);
1118 }
1119 
1120 __setup("lp=", lp_setup);
1121 module_init(lp_init_module);
1122 module_exit(lp_cleanup_module);
1123 
1124 MODULE_ALIAS_CHARDEV_MAJOR(LP_MAJOR);
1125 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */