1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50#include <linux/module.h>
51#include <linux/kernel.h>
52#include <linux/sched.h>
53#include <linux/signal.h>
54#include <linux/poll.h>
55#include <linux/init.h>
56#include <linux/slab.h>
57#include <linux/lp.h>
58#include <linux/mutex.h>
59#undef DEBUG
60#include <linux/usb.h>
61
62
63
64
65#define DRIVER_AUTHOR "Michael Gee, Pavel Machek, Vojtech Pavlik, Randy Dunlap, Pete Zaitcev, David Paschal"
66#define DRIVER_DESC "USB Printer Device Class driver"
67
68#define USBLP_BUF_SIZE 8192
69#define USBLP_BUF_SIZE_IN 1024
70#define USBLP_DEVICE_ID_SIZE 1024
71
72
73#define IOCNR_GET_DEVICE_ID 1
74#define IOCNR_GET_PROTOCOLS 2
75#define IOCNR_SET_PROTOCOL 3
76#define IOCNR_HP_SET_CHANNEL 4
77#define IOCNR_GET_BUS_ADDRESS 5
78#define IOCNR_GET_VID_PID 6
79#define IOCNR_SOFT_RESET 7
80
81#define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
82
83
84
85
86#define LPIOC_GET_PROTOCOLS(len) _IOC(_IOC_READ, 'P', IOCNR_GET_PROTOCOLS, len)
87
88#define LPIOC_SET_PROTOCOL _IOC(_IOC_WRITE, 'P', IOCNR_SET_PROTOCOL, 0)
89
90#define LPIOC_HP_SET_CHANNEL _IOC(_IOC_WRITE, 'P', IOCNR_HP_SET_CHANNEL, 0)
91
92#define LPIOC_GET_BUS_ADDRESS(len) _IOC(_IOC_READ, 'P', IOCNR_GET_BUS_ADDRESS, len)
93
94#define LPIOC_GET_VID_PID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_VID_PID, len)
95
96#define LPIOC_SOFT_RESET _IOC(_IOC_NONE, 'P', IOCNR_SOFT_RESET, 0);
97
98
99
100
101
102
103
104
105
106
107
108
109
110#define USBLP_REQ_GET_ID 0x00
111#define USBLP_REQ_GET_STATUS 0x01
112#define USBLP_REQ_RESET 0x02
113#define USBLP_REQ_HP_CHANNEL_CHANGE_REQUEST 0x00
114
115#define USBLP_MINORS 16
116#define USBLP_MINOR_BASE 0
117
118#define USBLP_CTL_TIMEOUT 5000
119
120#define USBLP_FIRST_PROTOCOL 1
121#define USBLP_LAST_PROTOCOL 3
122#define USBLP_MAX_PROTOCOLS (USBLP_LAST_PROTOCOL+1)
123
124
125
126
127
128#define STATUS_BUF_SIZE 8
129
130
131
132
133
134
135
136
137struct usblp {
138 struct usb_device *dev;
139 struct mutex wmut;
140 struct mutex mut;
141 spinlock_t lock;
142 char *readbuf;
143 char *statusbuf;
144 struct usb_anchor urbs;
145 wait_queue_head_t rwait, wwait;
146 int readcount;
147 int ifnum;
148 struct usb_interface *intf;
149
150
151 struct {
152 int alt_setting;
153 struct usb_endpoint_descriptor *epwrite;
154 struct usb_endpoint_descriptor *epread;
155 } protocol[USBLP_MAX_PROTOCOLS];
156 int current_protocol;
157 int minor;
158 int wcomplete, rcomplete;
159 int wstatus;
160 int rstatus;
161 unsigned int quirks;
162 unsigned int flags;
163 unsigned char used;
164 unsigned char present;
165 unsigned char bidir;
166 unsigned char sleeping;
167 unsigned char no_paper;
168 unsigned char *device_id_string;
169
170};
171
172#ifdef DEBUG
173static void usblp_dump(struct usblp *usblp) {
174 int p;
175
176 dbg("usblp=0x%p", usblp);
177 dbg("dev=0x%p", usblp->dev);
178 dbg("present=%d", usblp->present);
179 dbg("readbuf=0x%p", usblp->readbuf);
180 dbg("readcount=%d", usblp->readcount);
181 dbg("ifnum=%d", usblp->ifnum);
182 for (p = USBLP_FIRST_PROTOCOL; p <= USBLP_LAST_PROTOCOL; p++) {
183 dbg("protocol[%d].alt_setting=%d", p, usblp->protocol[p].alt_setting);
184 dbg("protocol[%d].epwrite=%p", p, usblp->protocol[p].epwrite);
185 dbg("protocol[%d].epread=%p", p, usblp->protocol[p].epread);
186 }
187 dbg("current_protocol=%d", usblp->current_protocol);
188 dbg("minor=%d", usblp->minor);
189 dbg("wstatus=%d", usblp->wstatus);
190 dbg("rstatus=%d", usblp->rstatus);
191 dbg("quirks=%d", usblp->quirks);
192 dbg("used=%d", usblp->used);
193 dbg("bidir=%d", usblp->bidir);
194 dbg("sleeping=%d", usblp->sleeping);
195 dbg("device_id_string=\"%s\"",
196 usblp->device_id_string ?
197 usblp->device_id_string + 2 :
198 (unsigned char *)"(null)");
199}
200#endif
201
202
203
204struct quirk_printer_struct {
205 __u16 vendorId;
206 __u16 productId;
207 unsigned int quirks;
208};
209
210#define USBLP_QUIRK_BIDIR 0x1
211#define USBLP_QUIRK_USB_INIT 0x2
212#define USBLP_QUIRK_BAD_CLASS 0x4
213
214static const struct quirk_printer_struct quirk_printers[] = {
215 { 0x03f0, 0x0004, USBLP_QUIRK_BIDIR },
216 { 0x03f0, 0x0104, USBLP_QUIRK_BIDIR },
217 { 0x03f0, 0x0204, USBLP_QUIRK_BIDIR },
218 { 0x03f0, 0x0304, USBLP_QUIRK_BIDIR },
219 { 0x03f0, 0x0404, USBLP_QUIRK_BIDIR },
220 { 0x03f0, 0x0504, USBLP_QUIRK_BIDIR },
221 { 0x03f0, 0x0604, USBLP_QUIRK_BIDIR },
222 { 0x03f0, 0x0804, USBLP_QUIRK_BIDIR },
223 { 0x03f0, 0x1104, USBLP_QUIRK_BIDIR },
224 { 0x0409, 0xefbe, USBLP_QUIRK_BIDIR },
225 { 0x0409, 0xbef4, USBLP_QUIRK_BIDIR },
226 { 0x0409, 0xf0be, USBLP_QUIRK_BIDIR },
227 { 0x0409, 0xf1be, USBLP_QUIRK_BIDIR },
228 { 0x0482, 0x0010, USBLP_QUIRK_BIDIR },
229 { 0x04f9, 0x000d, USBLP_QUIRK_BIDIR },
230 { 0x04b8, 0x0202, USBLP_QUIRK_BAD_CLASS },
231 { 0, 0 }
232};
233
234static int usblp_wwait(struct usblp *usblp, int nonblock);
235static int usblp_wtest(struct usblp *usblp, int nonblock);
236static int usblp_rwait_and_lock(struct usblp *usblp, int nonblock);
237static int usblp_rtest(struct usblp *usblp, int nonblock);
238static int usblp_submit_read(struct usblp *usblp);
239static int usblp_select_alts(struct usblp *usblp);
240static int usblp_set_protocol(struct usblp *usblp, int protocol);
241static int usblp_cache_device_id_string(struct usblp *usblp);
242
243
244static struct usb_driver usblp_driver;
245static DEFINE_MUTEX(usblp_mutex);
246
247
248
249
250
251static int usblp_ctrl_msg(struct usblp *usblp, int request, int type, int dir, int recip, int value, void *buf, int len)
252{
253 int retval;
254 int index = usblp->ifnum;
255
256
257
258
259 if ((request == USBLP_REQ_GET_ID) && (type == USB_TYPE_CLASS)) {
260 index = (usblp->ifnum<<8)|usblp->protocol[usblp->current_protocol].alt_setting;
261 }
262
263 retval = usb_control_msg(usblp->dev,
264 dir ? usb_rcvctrlpipe(usblp->dev, 0) : usb_sndctrlpipe(usblp->dev, 0),
265 request, type | dir | recip, value, index, buf, len, USBLP_CTL_TIMEOUT);
266 dbg("usblp_control_msg: rq: 0x%02x dir: %d recip: %d value: %d idx: %d len: %#x result: %d",
267 request, !!dir, recip, value, index, len, retval);
268 return retval < 0 ? retval : 0;
269}
270
271#define usblp_read_status(usblp, status)\
272 usblp_ctrl_msg(usblp, USBLP_REQ_GET_STATUS, USB_TYPE_CLASS, USB_DIR_IN, USB_RECIP_INTERFACE, 0, status, 1)
273#define usblp_get_id(usblp, config, id, maxlen)\
274 usblp_ctrl_msg(usblp, USBLP_REQ_GET_ID, USB_TYPE_CLASS, USB_DIR_IN, USB_RECIP_INTERFACE, config, id, maxlen)
275#define usblp_reset(usblp)\
276 usblp_ctrl_msg(usblp, USBLP_REQ_RESET, USB_TYPE_CLASS, USB_DIR_OUT, USB_RECIP_OTHER, 0, NULL, 0)
277
278#define usblp_hp_channel_change_request(usblp, channel, buffer) \
279 usblp_ctrl_msg(usblp, USBLP_REQ_HP_CHANNEL_CHANGE_REQUEST, USB_TYPE_VENDOR, USB_DIR_IN, USB_RECIP_INTERFACE, channel, buffer, 1)
280
281
282
283
284
285
286static int proto_bias = -1;
287
288
289
290
291
292static void usblp_bulk_read(struct urb *urb)
293{
294 struct usblp *usblp = urb->context;
295 int status = urb->status;
296
297 if (usblp->present && usblp->used) {
298 if (status)
299 printk(KERN_WARNING "usblp%d: "
300 "nonzero read bulk status received: %d\n",
301 usblp->minor, status);
302 }
303 spin_lock(&usblp->lock);
304 if (status < 0)
305 usblp->rstatus = status;
306 else
307 usblp->rstatus = urb->actual_length;
308 usblp->rcomplete = 1;
309 wake_up(&usblp->rwait);
310 spin_unlock(&usblp->lock);
311
312 usb_free_urb(urb);
313}
314
315static void usblp_bulk_write(struct urb *urb)
316{
317 struct usblp *usblp = urb->context;
318 int status = urb->status;
319
320 if (usblp->present && usblp->used) {
321 if (status)
322 printk(KERN_WARNING "usblp%d: "
323 "nonzero write bulk status received: %d\n",
324 usblp->minor, status);
325 }
326 spin_lock(&usblp->lock);
327 if (status < 0)
328 usblp->wstatus = status;
329 else
330 usblp->wstatus = urb->actual_length;
331 usblp->no_paper = 0;
332 usblp->wcomplete = 1;
333 wake_up(&usblp->wwait);
334 spin_unlock(&usblp->lock);
335
336 usb_free_urb(urb);
337}
338
339
340
341
342
343static const char *usblp_messages[] = { "ok", "out of paper", "off-line", "on fire" };
344
345static int usblp_check_status(struct usblp *usblp, int err)
346{
347 unsigned char status, newerr = 0;
348 int error;
349
350 mutex_lock(&usblp->mut);
351 if ((error = usblp_read_status(usblp, usblp->statusbuf)) < 0) {
352 mutex_unlock(&usblp->mut);
353 if (printk_ratelimit())
354 printk(KERN_ERR
355 "usblp%d: error %d reading printer status\n",
356 usblp->minor, error);
357 return 0;
358 }
359 status = *usblp->statusbuf;
360 mutex_unlock(&usblp->mut);
361
362 if (~status & LP_PERRORP)
363 newerr = 3;
364 if (status & LP_POUTPA)
365 newerr = 1;
366 if (~status & LP_PSELECD)
367 newerr = 2;
368
369 if (newerr != err) {
370 printk(KERN_INFO "usblp%d: %s\n",
371 usblp->minor, usblp_messages[newerr]);
372 }
373
374 return newerr;
375}
376
377static int handle_bidir (struct usblp *usblp)
378{
379 if (usblp->bidir && usblp->used && !usblp->sleeping) {
380 if (usblp_submit_read(usblp) < 0)
381 return -EIO;
382 }
383 return 0;
384}
385
386
387
388
389
390static int usblp_open(struct inode *inode, struct file *file)
391{
392 int minor = iminor(inode);
393 struct usblp *usblp;
394 struct usb_interface *intf;
395 int retval;
396
397 if (minor < 0)
398 return -ENODEV;
399
400 mutex_lock (&usblp_mutex);
401
402 retval = -ENODEV;
403 intf = usb_find_interface(&usblp_driver, minor);
404 if (!intf) {
405 goto out;
406 }
407 usblp = usb_get_intfdata (intf);
408 if (!usblp || !usblp->dev || !usblp->present)
409 goto out;
410
411 retval = -EBUSY;
412 if (usblp->used)
413 goto out;
414
415
416
417
418
419
420
421 retval = usb_autopm_get_interface(intf);
422 if (retval < 0)
423 goto out;
424 usblp->used = 1;
425 file->private_data = usblp;
426
427 usblp->wcomplete = 1;
428 usblp->wstatus = 0;
429 usblp->rcomplete = 0;
430
431 if (handle_bidir(usblp) < 0) {
432 usb_autopm_put_interface(intf);
433 usblp->used = 0;
434 file->private_data = NULL;
435 retval = -EIO;
436 }
437out:
438 mutex_unlock (&usblp_mutex);
439 return retval;
440}
441
442static void usblp_cleanup (struct usblp *usblp)
443{
444 printk(KERN_INFO "usblp%d: removed\n", usblp->minor);
445
446 kfree(usblp->readbuf);
447 kfree (usblp->device_id_string);
448 kfree (usblp->statusbuf);
449 kfree (usblp);
450}
451
452static void usblp_unlink_urbs(struct usblp *usblp)
453{
454 usb_kill_anchored_urbs(&usblp->urbs);
455}
456
457static int usblp_release(struct inode *inode, struct file *file)
458{
459 struct usblp *usblp = file->private_data;
460
461 usblp->flags &= ~LP_ABORT;
462
463 mutex_lock (&usblp_mutex);
464 usblp->used = 0;
465 if (usblp->present) {
466 usblp_unlink_urbs(usblp);
467 usb_autopm_put_interface(usblp->intf);
468 } else
469 usblp_cleanup (usblp);
470 mutex_unlock (&usblp_mutex);
471 return 0;
472}
473
474
475static unsigned int usblp_poll(struct file *file, struct poll_table_struct *wait)
476{
477 int ret;
478 unsigned long flags;
479
480 struct usblp *usblp = file->private_data;
481
482 poll_wait(file, &usblp->rwait, wait);
483 poll_wait(file, &usblp->wwait, wait);
484 spin_lock_irqsave(&usblp->lock, flags);
485 ret = ((usblp->bidir && usblp->rcomplete) ? POLLIN | POLLRDNORM : 0) |
486 ((usblp->no_paper || usblp->wcomplete) ? POLLOUT | POLLWRNORM : 0);
487 spin_unlock_irqrestore(&usblp->lock, flags);
488 return ret;
489}
490
491static long usblp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
492{
493 struct usblp *usblp = file->private_data;
494 int length, err, i;
495 unsigned char newChannel;
496 int status;
497 int twoints[2];
498 int retval = 0;
499
500 mutex_lock (&usblp->mut);
501 if (!usblp->present) {
502 retval = -ENODEV;
503 goto done;
504 }
505
506 if (usblp->sleeping) {
507 retval = -ENODEV;
508 goto done;
509 }
510
511 dbg("usblp_ioctl: cmd=0x%x (%c nr=%d len=%d dir=%d)", cmd, _IOC_TYPE(cmd),
512 _IOC_NR(cmd), _IOC_SIZE(cmd), _IOC_DIR(cmd) );
513
514 if (_IOC_TYPE(cmd) == 'P')
515
516 switch (_IOC_NR(cmd)) {
517
518 case IOCNR_GET_DEVICE_ID:
519 if (_IOC_DIR(cmd) != _IOC_READ) {
520 retval = -EINVAL;
521 goto done;
522 }
523
524 length = usblp_cache_device_id_string(usblp);
525 if (length < 0) {
526 retval = length;
527 goto done;
528 }
529 if (length > _IOC_SIZE(cmd))
530 length = _IOC_SIZE(cmd);
531
532 if (copy_to_user((void __user *) arg,
533 usblp->device_id_string,
534 (unsigned long) length)) {
535 retval = -EFAULT;
536 goto done;
537 }
538
539 break;
540
541 case IOCNR_GET_PROTOCOLS:
542 if (_IOC_DIR(cmd) != _IOC_READ ||
543 _IOC_SIZE(cmd) < sizeof(twoints)) {
544 retval = -EINVAL;
545 goto done;
546 }
547
548 twoints[0] = usblp->current_protocol;
549 twoints[1] = 0;
550 for (i = USBLP_FIRST_PROTOCOL;
551 i <= USBLP_LAST_PROTOCOL; i++) {
552 if (usblp->protocol[i].alt_setting >= 0)
553 twoints[1] |= (1<<i);
554 }
555
556 if (copy_to_user((void __user *)arg,
557 (unsigned char *)twoints,
558 sizeof(twoints))) {
559 retval = -EFAULT;
560 goto done;
561 }
562
563 break;
564
565 case IOCNR_SET_PROTOCOL:
566 if (_IOC_DIR(cmd) != _IOC_WRITE) {
567 retval = -EINVAL;
568 goto done;
569 }
570
571#ifdef DEBUG
572 if (arg == -10) {
573 usblp_dump(usblp);
574 break;
575 }
576#endif
577
578 usblp_unlink_urbs(usblp);
579 retval = usblp_set_protocol(usblp, arg);
580 if (retval < 0) {
581 usblp_set_protocol(usblp,
582 usblp->current_protocol);
583 }
584 break;
585
586 case IOCNR_HP_SET_CHANNEL:
587 if (_IOC_DIR(cmd) != _IOC_WRITE ||
588 le16_to_cpu(usblp->dev->descriptor.idVendor) != 0x03F0 ||
589 usblp->quirks & USBLP_QUIRK_BIDIR) {
590 retval = -EINVAL;
591 goto done;
592 }
593
594 err = usblp_hp_channel_change_request(usblp,
595 arg, &newChannel);
596 if (err < 0) {
597 dev_err(&usblp->dev->dev,
598 "usblp%d: error = %d setting "
599 "HP channel\n",
600 usblp->minor, err);
601 retval = -EIO;
602 goto done;
603 }
604
605 dbg("usblp%d requested/got HP channel %ld/%d",
606 usblp->minor, arg, newChannel);
607 break;
608
609 case IOCNR_GET_BUS_ADDRESS:
610 if (_IOC_DIR(cmd) != _IOC_READ ||
611 _IOC_SIZE(cmd) < sizeof(twoints)) {
612 retval = -EINVAL;
613 goto done;
614 }
615
616 twoints[0] = usblp->dev->bus->busnum;
617 twoints[1] = usblp->dev->devnum;
618 if (copy_to_user((void __user *)arg,
619 (unsigned char *)twoints,
620 sizeof(twoints))) {
621 retval = -EFAULT;
622 goto done;
623 }
624
625 dbg("usblp%d is bus=%d, device=%d",
626 usblp->minor, twoints[0], twoints[1]);
627 break;
628
629 case IOCNR_GET_VID_PID:
630 if (_IOC_DIR(cmd) != _IOC_READ ||
631 _IOC_SIZE(cmd) < sizeof(twoints)) {
632 retval = -EINVAL;
633 goto done;
634 }
635
636 twoints[0] = le16_to_cpu(usblp->dev->descriptor.idVendor);
637 twoints[1] = le16_to_cpu(usblp->dev->descriptor.idProduct);
638 if (copy_to_user((void __user *)arg,
639 (unsigned char *)twoints,
640 sizeof(twoints))) {
641 retval = -EFAULT;
642 goto done;
643 }
644
645 dbg("usblp%d is VID=0x%4.4X, PID=0x%4.4X",
646 usblp->minor, twoints[0], twoints[1]);
647 break;
648
649 case IOCNR_SOFT_RESET:
650 if (_IOC_DIR(cmd) != _IOC_NONE) {
651 retval = -EINVAL;
652 goto done;
653 }
654 retval = usblp_reset(usblp);
655 break;
656 default:
657 retval = -ENOTTY;
658 }
659 else
660 switch (cmd) {
661
662 case LPGETSTATUS:
663 if ((retval = usblp_read_status(usblp, usblp->statusbuf))) {
664 if (printk_ratelimit())
665 printk(KERN_ERR "usblp%d:"
666 "failed reading printer status (%d)\n",
667 usblp->minor, retval);
668 retval = -EIO;
669 goto done;
670 }
671 status = *usblp->statusbuf;
672 if (copy_to_user ((void __user *)arg, &status, sizeof(int)))
673 retval = -EFAULT;
674 break;
675
676 case LPABORT:
677 if (arg)
678 usblp->flags |= LP_ABORT;
679 else
680 usblp->flags &= ~LP_ABORT;
681 break;
682
683 default:
684 retval = -ENOTTY;
685 }
686
687done:
688 mutex_unlock (&usblp->mut);
689 return retval;
690}
691
692static struct urb *usblp_new_writeurb(struct usblp *usblp, int transfer_length)
693{
694 struct urb *urb;
695 char *writebuf;
696
697 if ((writebuf = kmalloc(transfer_length, GFP_KERNEL)) == NULL)
698 return NULL;
699 if ((urb = usb_alloc_urb(0, GFP_KERNEL)) == NULL) {
700 kfree(writebuf);
701 return NULL;
702 }
703
704 usb_fill_bulk_urb(urb, usblp->dev,
705 usb_sndbulkpipe(usblp->dev,
706 usblp->protocol[usblp->current_protocol].epwrite->bEndpointAddress),
707 writebuf, transfer_length, usblp_bulk_write, usblp);
708 urb->transfer_flags |= URB_FREE_BUFFER;
709
710 return urb;
711}
712
713static ssize_t usblp_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
714{
715 struct usblp *usblp = file->private_data;
716 struct urb *writeurb;
717 int rv;
718 int transfer_length;
719 ssize_t writecount = 0;
720
721 if (mutex_lock_interruptible(&usblp->wmut)) {
722 rv = -EINTR;
723 goto raise_biglock;
724 }
725 if ((rv = usblp_wwait(usblp, !!(file->f_flags & O_NONBLOCK))) < 0)
726 goto raise_wait;
727
728 while (writecount < count) {
729
730
731
732 if ((transfer_length = count - writecount) > USBLP_BUF_SIZE)
733 transfer_length = USBLP_BUF_SIZE;
734
735 rv = -ENOMEM;
736 if ((writeurb = usblp_new_writeurb(usblp, transfer_length)) == NULL)
737 goto raise_urb;
738 usb_anchor_urb(writeurb, &usblp->urbs);
739
740 if (copy_from_user(writeurb->transfer_buffer,
741 buffer + writecount, transfer_length)) {
742 rv = -EFAULT;
743 goto raise_badaddr;
744 }
745
746 spin_lock_irq(&usblp->lock);
747 usblp->wcomplete = 0;
748 spin_unlock_irq(&usblp->lock);
749 if ((rv = usb_submit_urb(writeurb, GFP_KERNEL)) < 0) {
750 usblp->wstatus = 0;
751 spin_lock_irq(&usblp->lock);
752 usblp->no_paper = 0;
753 usblp->wcomplete = 1;
754 wake_up(&usblp->wwait);
755 spin_unlock_irq(&usblp->lock);
756 if (rv != -ENOMEM)
757 rv = -EIO;
758 goto raise_submit;
759 }
760
761
762
763
764 rv = usblp_wwait(usblp, !!(file->f_flags&O_NONBLOCK));
765 if (rv < 0) {
766 if (rv == -EAGAIN) {
767
768 writecount += transfer_length;
769 }
770 if (rv == -ENOSPC) {
771 spin_lock_irq(&usblp->lock);
772 usblp->no_paper = 1;
773 spin_unlock_irq(&usblp->lock);
774 writecount += transfer_length;
775 }
776
777 goto collect_error;
778 }
779
780 if (usblp->wstatus < 0) {
781 rv = -EIO;
782 goto collect_error;
783 }
784
785
786
787
788 writecount += usblp->wstatus;
789 }
790
791 mutex_unlock(&usblp->wmut);
792 return writecount;
793
794raise_submit:
795raise_badaddr:
796 usb_unanchor_urb(writeurb);
797 usb_free_urb(writeurb);
798raise_urb:
799raise_wait:
800collect_error:
801 mutex_unlock(&usblp->wmut);
802raise_biglock:
803 return writecount ? writecount : rv;
804}
805
806
807
808
809
810
811static ssize_t usblp_read(struct file *file, char __user *buffer, size_t len, loff_t *ppos)
812{
813 struct usblp *usblp = file->private_data;
814 ssize_t count;
815 ssize_t avail;
816 int rv;
817
818 if (!usblp->bidir)
819 return -EINVAL;
820
821 rv = usblp_rwait_and_lock(usblp, !!(file->f_flags & O_NONBLOCK));
822 if (rv < 0)
823 return rv;
824
825 if ((avail = usblp->rstatus) < 0) {
826 printk(KERN_ERR "usblp%d: error %d reading from printer\n",
827 usblp->minor, (int)avail);
828 usblp_submit_read(usblp);
829 count = -EIO;
830 goto done;
831 }
832
833 count = len < avail - usblp->readcount ? len : avail - usblp->readcount;
834 if (count != 0 &&
835 copy_to_user(buffer, usblp->readbuf + usblp->readcount, count)) {
836 count = -EFAULT;
837 goto done;
838 }
839
840 if ((usblp->readcount += count) == avail) {
841 if (usblp_submit_read(usblp) < 0) {
842
843 if (count == 0)
844 count = -EIO;
845 goto done;
846 }
847 }
848
849done:
850 mutex_unlock (&usblp->mut);
851 return count;
852}
853
854
855
856
857
858
859
860
861
862
863
864
865static int usblp_wwait(struct usblp *usblp, int nonblock)
866{
867 DECLARE_WAITQUEUE(waita, current);
868 int rc;
869 int err = 0;
870
871 add_wait_queue(&usblp->wwait, &waita);
872 for (;;) {
873 set_current_state(TASK_INTERRUPTIBLE);
874 if (mutex_lock_interruptible(&usblp->mut)) {
875 rc = -EINTR;
876 break;
877 }
878 rc = usblp_wtest(usblp, nonblock);
879 mutex_unlock(&usblp->mut);
880 if (rc <= 0)
881 break;
882
883 if (schedule_timeout(msecs_to_jiffies(1500)) == 0) {
884 if (usblp->flags & LP_ABORT) {
885 err = usblp_check_status(usblp, err);
886 if (err == 1) {
887 rc = -ENOSPC;
888 break;
889 }
890 } else {
891
892 mutex_lock(&usblp->mut);
893 usblp_read_status(usblp, usblp->statusbuf);
894 mutex_unlock(&usblp->mut);
895 }
896 }
897 }
898 set_current_state(TASK_RUNNING);
899 remove_wait_queue(&usblp->wwait, &waita);
900 return rc;
901}
902
903static int usblp_wtest(struct usblp *usblp, int nonblock)
904{
905 unsigned long flags;
906
907 if (!usblp->present)
908 return -ENODEV;
909 if (signal_pending(current))
910 return -EINTR;
911 spin_lock_irqsave(&usblp->lock, flags);
912 if (usblp->wcomplete) {
913 spin_unlock_irqrestore(&usblp->lock, flags);
914 return 0;
915 }
916 spin_unlock_irqrestore(&usblp->lock, flags);
917 if (usblp->sleeping)
918 return -ENODEV;
919 if (nonblock)
920 return -EAGAIN;
921 return 1;
922}
923
924
925
926
927
928
929
930
931static int usblp_rwait_and_lock(struct usblp *usblp, int nonblock)
932{
933 DECLARE_WAITQUEUE(waita, current);
934 int rc;
935
936 add_wait_queue(&usblp->rwait, &waita);
937 for (;;) {
938 if (mutex_lock_interruptible(&usblp->mut)) {
939 rc = -EINTR;
940 break;
941 }
942 set_current_state(TASK_INTERRUPTIBLE);
943 if ((rc = usblp_rtest(usblp, nonblock)) < 0) {
944 mutex_unlock(&usblp->mut);
945 break;
946 }
947 if (rc == 0)
948 break;
949 mutex_unlock(&usblp->mut);
950 schedule();
951 }
952 set_current_state(TASK_RUNNING);
953 remove_wait_queue(&usblp->rwait, &waita);
954 return rc;
955}
956
957static int usblp_rtest(struct usblp *usblp, int nonblock)
958{
959 unsigned long flags;
960
961 if (!usblp->present)
962 return -ENODEV;
963 if (signal_pending(current))
964 return -EINTR;
965 spin_lock_irqsave(&usblp->lock, flags);
966 if (usblp->rcomplete) {
967 spin_unlock_irqrestore(&usblp->lock, flags);
968 return 0;
969 }
970 spin_unlock_irqrestore(&usblp->lock, flags);
971 if (usblp->sleeping)
972 return -ENODEV;
973 if (nonblock)
974 return -EAGAIN;
975 return 1;
976}
977
978
979
980
981static int usblp_submit_read(struct usblp *usblp)
982{
983 struct urb *urb;
984 unsigned long flags;
985 int rc;
986
987 rc = -ENOMEM;
988 if ((urb = usb_alloc_urb(0, GFP_KERNEL)) == NULL)
989 goto raise_urb;
990
991 usb_fill_bulk_urb(urb, usblp->dev,
992 usb_rcvbulkpipe(usblp->dev,
993 usblp->protocol[usblp->current_protocol].epread->bEndpointAddress),
994 usblp->readbuf, USBLP_BUF_SIZE_IN,
995 usblp_bulk_read, usblp);
996 usb_anchor_urb(urb, &usblp->urbs);
997
998 spin_lock_irqsave(&usblp->lock, flags);
999 usblp->readcount = 0;
1000 usblp->rcomplete = 0;
1001 spin_unlock_irqrestore(&usblp->lock, flags);
1002 if ((rc = usb_submit_urb(urb, GFP_KERNEL)) < 0) {
1003 dbg("error submitting urb (%d)", rc);
1004 spin_lock_irqsave(&usblp->lock, flags);
1005 usblp->rstatus = rc;
1006 usblp->rcomplete = 1;
1007 spin_unlock_irqrestore(&usblp->lock, flags);
1008 goto raise_submit;
1009 }
1010
1011 return 0;
1012
1013raise_submit:
1014 usb_unanchor_urb(urb);
1015 usb_free_urb(urb);
1016raise_urb:
1017 return rc;
1018}
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037static unsigned int usblp_quirks (__u16 vendor, __u16 product)
1038{
1039 int i;
1040
1041 for (i = 0; quirk_printers[i].vendorId; i++) {
1042 if (vendor == quirk_printers[i].vendorId &&
1043 product == quirk_printers[i].productId)
1044 return quirk_printers[i].quirks;
1045 }
1046 return 0;
1047}
1048
1049static const struct file_operations usblp_fops = {
1050 .owner = THIS_MODULE,
1051 .read = usblp_read,
1052 .write = usblp_write,
1053 .poll = usblp_poll,
1054 .unlocked_ioctl = usblp_ioctl,
1055 .compat_ioctl = usblp_ioctl,
1056 .open = usblp_open,
1057 .release = usblp_release,
1058};
1059
1060static char *usblp_devnode(struct device *dev, mode_t *mode)
1061{
1062 return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev));
1063}
1064
1065static struct usb_class_driver usblp_class = {
1066 .name = "lp%d",
1067 .devnode = usblp_devnode,
1068 .fops = &usblp_fops,
1069 .minor_base = USBLP_MINOR_BASE,
1070};
1071
1072static ssize_t usblp_show_ieee1284_id(struct device *dev, struct device_attribute *attr, char *buf)
1073{
1074 struct usb_interface *intf = to_usb_interface(dev);
1075 struct usblp *usblp = usb_get_intfdata (intf);
1076
1077 if (usblp->device_id_string[0] == 0 &&
1078 usblp->device_id_string[1] == 0)
1079 return 0;
1080
1081 return sprintf(buf, "%s", usblp->device_id_string+2);
1082}
1083
1084static DEVICE_ATTR(ieee1284_id, S_IRUGO, usblp_show_ieee1284_id, NULL);
1085
1086static int usblp_probe(struct usb_interface *intf,
1087 const struct usb_device_id *id)
1088{
1089 struct usb_device *dev = interface_to_usbdev (intf);
1090 struct usblp *usblp;
1091 int protocol;
1092 int retval;
1093
1094
1095
1096 usblp = kzalloc(sizeof(struct usblp), GFP_KERNEL);
1097 if (!usblp) {
1098 retval = -ENOMEM;
1099 goto abort_ret;
1100 }
1101 usblp->dev = dev;
1102 mutex_init(&usblp->wmut);
1103 mutex_init (&usblp->mut);
1104 spin_lock_init(&usblp->lock);
1105 init_waitqueue_head(&usblp->rwait);
1106 init_waitqueue_head(&usblp->wwait);
1107 init_usb_anchor(&usblp->urbs);
1108 usblp->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
1109 usblp->intf = intf;
1110
1111
1112
1113
1114 if (!(usblp->device_id_string = kmalloc(USBLP_DEVICE_ID_SIZE, GFP_KERNEL))) {
1115 retval = -ENOMEM;
1116 goto abort;
1117 }
1118
1119
1120
1121
1122
1123
1124 if (!(usblp->readbuf = kmalloc(USBLP_BUF_SIZE_IN, GFP_KERNEL))) {
1125 retval = -ENOMEM;
1126 goto abort;
1127 }
1128
1129
1130 usblp->statusbuf = kmalloc(STATUS_BUF_SIZE, GFP_KERNEL);
1131 if (!usblp->statusbuf) {
1132 retval = -ENOMEM;
1133 goto abort;
1134 }
1135
1136
1137 usblp->quirks = usblp_quirks(
1138 le16_to_cpu(dev->descriptor.idVendor),
1139 le16_to_cpu(dev->descriptor.idProduct));
1140
1141
1142 protocol = usblp_select_alts(usblp);
1143 if (protocol < 0) {
1144 dbg("incompatible printer-class device 0x%4.4X/0x%4.4X",
1145 le16_to_cpu(dev->descriptor.idVendor),
1146 le16_to_cpu(dev->descriptor.idProduct));
1147 retval = -ENODEV;
1148 goto abort;
1149 }
1150
1151
1152 if (usblp_set_protocol(usblp, protocol) < 0) {
1153 retval = -ENODEV;
1154 goto abort;
1155 }
1156
1157
1158 usblp_cache_device_id_string(usblp);
1159 retval = device_create_file(&intf->dev, &dev_attr_ieee1284_id);
1160 if (retval)
1161 goto abort_intfdata;
1162
1163#ifdef DEBUG
1164 usblp_check_status(usblp, 0);
1165#endif
1166
1167 usb_set_intfdata (intf, usblp);
1168
1169 usblp->present = 1;
1170
1171 retval = usb_register_dev(intf, &usblp_class);
1172 if (retval) {
1173 printk(KERN_ERR "usblp: Not able to get a minor"
1174 " (base %u, slice default): %d\n",
1175 USBLP_MINOR_BASE, retval);
1176 goto abort_intfdata;
1177 }
1178 usblp->minor = intf->minor;
1179 printk(KERN_INFO "usblp%d: USB %sdirectional printer dev %d "
1180 "if %d alt %d proto %d vid 0x%4.4X pid 0x%4.4X\n",
1181 usblp->minor, usblp->bidir ? "Bi" : "Uni", dev->devnum,
1182 usblp->ifnum,
1183 usblp->protocol[usblp->current_protocol].alt_setting,
1184 usblp->current_protocol,
1185 le16_to_cpu(usblp->dev->descriptor.idVendor),
1186 le16_to_cpu(usblp->dev->descriptor.idProduct));
1187
1188 return 0;
1189
1190abort_intfdata:
1191 usb_set_intfdata (intf, NULL);
1192 device_remove_file(&intf->dev, &dev_attr_ieee1284_id);
1193abort:
1194 kfree(usblp->readbuf);
1195 kfree(usblp->statusbuf);
1196 kfree(usblp->device_id_string);
1197 kfree(usblp);
1198abort_ret:
1199 return retval;
1200}
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221static int usblp_select_alts(struct usblp *usblp)
1222{
1223 struct usb_interface *if_alt;
1224 struct usb_host_interface *ifd;
1225 struct usb_endpoint_descriptor *epd, *epwrite, *epread;
1226 int p, i, e;
1227
1228 if_alt = usblp->intf;
1229
1230 for (p = 0; p < USBLP_MAX_PROTOCOLS; p++)
1231 usblp->protocol[p].alt_setting = -1;
1232
1233
1234 for (i = 0; i < if_alt->num_altsetting; i++) {
1235 ifd = &if_alt->altsetting[i];
1236
1237 if (ifd->desc.bInterfaceClass != 7 || ifd->desc.bInterfaceSubClass != 1)
1238 if (!(usblp->quirks & USBLP_QUIRK_BAD_CLASS))
1239 continue;
1240
1241 if (ifd->desc.bInterfaceProtocol < USBLP_FIRST_PROTOCOL ||
1242 ifd->desc.bInterfaceProtocol > USBLP_LAST_PROTOCOL)
1243 continue;
1244
1245
1246 epwrite = epread = NULL;
1247 for (e = 0; e < ifd->desc.bNumEndpoints; e++) {
1248 epd = &ifd->endpoint[e].desc;
1249
1250 if (usb_endpoint_is_bulk_out(epd))
1251 if (!epwrite)
1252 epwrite = epd;
1253
1254 if (usb_endpoint_is_bulk_in(epd))
1255 if (!epread)
1256 epread = epd;
1257 }
1258
1259
1260 if (!epwrite || (ifd->desc.bInterfaceProtocol > 1 && !epread))
1261 continue;
1262
1263
1264
1265 if (ifd->desc.bInterfaceProtocol == 1) {
1266 epread = NULL;
1267 } else if (usblp->quirks & USBLP_QUIRK_BIDIR) {
1268 printk(KERN_INFO "usblp%d: Disabling reads from "
1269 "problematic bidirectional printer\n",
1270 usblp->minor);
1271 epread = NULL;
1272 }
1273
1274 usblp->protocol[ifd->desc.bInterfaceProtocol].alt_setting =
1275 ifd->desc.bAlternateSetting;
1276 usblp->protocol[ifd->desc.bInterfaceProtocol].epwrite = epwrite;
1277 usblp->protocol[ifd->desc.bInterfaceProtocol].epread = epread;
1278 }
1279
1280
1281 if (proto_bias >= USBLP_FIRST_PROTOCOL &&
1282 proto_bias <= USBLP_LAST_PROTOCOL &&
1283 usblp->protocol[proto_bias].alt_setting != -1)
1284 return proto_bias;
1285
1286
1287 if (usblp->protocol[2].alt_setting != -1)
1288 return 2;
1289 if (usblp->protocol[1].alt_setting != -1)
1290 return 1;
1291 if (usblp->protocol[3].alt_setting != -1)
1292 return 3;
1293
1294
1295 return -1;
1296}
1297
1298static int usblp_set_protocol(struct usblp *usblp, int protocol)
1299{
1300 int r, alts;
1301
1302 if (protocol < USBLP_FIRST_PROTOCOL || protocol > USBLP_LAST_PROTOCOL)
1303 return -EINVAL;
1304
1305 alts = usblp->protocol[protocol].alt_setting;
1306 if (alts < 0)
1307 return -EINVAL;
1308 r = usb_set_interface(usblp->dev, usblp->ifnum, alts);
1309 if (r < 0) {
1310 printk(KERN_ERR "usblp: can't set desired altsetting %d on interface %d\n",
1311 alts, usblp->ifnum);
1312 return r;
1313 }
1314
1315 usblp->bidir = (usblp->protocol[protocol].epread != NULL);
1316 usblp->current_protocol = protocol;
1317 dbg("usblp%d set protocol %d", usblp->minor, protocol);
1318 return 0;
1319}
1320
1321
1322
1323
1324static int usblp_cache_device_id_string(struct usblp *usblp)
1325{
1326 int err, length;
1327
1328 err = usblp_get_id(usblp, 0, usblp->device_id_string, USBLP_DEVICE_ID_SIZE - 1);
1329 if (err < 0) {
1330 dbg("usblp%d: error = %d reading IEEE-1284 Device ID string",
1331 usblp->minor, err);
1332 usblp->device_id_string[0] = usblp->device_id_string[1] = '\0';
1333 return -EIO;
1334 }
1335
1336
1337
1338
1339 length = be16_to_cpu(*((__be16 *)usblp->device_id_string));
1340 if (length < 2)
1341 length = 2;
1342 else if (length >= USBLP_DEVICE_ID_SIZE)
1343 length = USBLP_DEVICE_ID_SIZE - 1;
1344 usblp->device_id_string[length] = '\0';
1345
1346 dbg("usblp%d Device ID string [len=%d]=\"%s\"",
1347 usblp->minor, length, &usblp->device_id_string[2]);
1348
1349 return length;
1350}
1351
1352static void usblp_disconnect(struct usb_interface *intf)
1353{
1354 struct usblp *usblp = usb_get_intfdata (intf);
1355
1356 usb_deregister_dev(intf, &usblp_class);
1357
1358 if (!usblp || !usblp->dev) {
1359 dev_err(&intf->dev, "bogus disconnect\n");
1360 BUG ();
1361 }
1362
1363 device_remove_file(&intf->dev, &dev_attr_ieee1284_id);
1364
1365 mutex_lock (&usblp_mutex);
1366 mutex_lock (&usblp->mut);
1367 usblp->present = 0;
1368 wake_up(&usblp->wwait);
1369 wake_up(&usblp->rwait);
1370 usb_set_intfdata (intf, NULL);
1371
1372 usblp_unlink_urbs(usblp);
1373 mutex_unlock (&usblp->mut);
1374
1375 if (!usblp->used)
1376 usblp_cleanup (usblp);
1377 mutex_unlock (&usblp_mutex);
1378}
1379
1380static int usblp_suspend (struct usb_interface *intf, pm_message_t message)
1381{
1382 struct usblp *usblp = usb_get_intfdata (intf);
1383
1384
1385 usblp->sleeping = 1;
1386 usblp_unlink_urbs(usblp);
1387#if 0
1388
1389 wake_up(&usblp->wwait);
1390 wake_up(&usblp->rwait);
1391#endif
1392
1393 return 0;
1394}
1395
1396static int usblp_resume (struct usb_interface *intf)
1397{
1398 struct usblp *usblp = usb_get_intfdata (intf);
1399 int r;
1400
1401 usblp->sleeping = 0;
1402 r = handle_bidir (usblp);
1403
1404 return r;
1405}
1406
1407static struct usb_device_id usblp_ids [] = {
1408 { USB_DEVICE_INFO(7, 1, 1) },
1409 { USB_DEVICE_INFO(7, 1, 2) },
1410 { USB_DEVICE_INFO(7, 1, 3) },
1411 { USB_INTERFACE_INFO(7, 1, 1) },
1412 { USB_INTERFACE_INFO(7, 1, 2) },
1413 { USB_INTERFACE_INFO(7, 1, 3) },
1414 { USB_DEVICE(0x04b8, 0x0202) },
1415 { }
1416};
1417
1418MODULE_DEVICE_TABLE (usb, usblp_ids);
1419
1420static struct usb_driver usblp_driver = {
1421 .name = "usblp",
1422 .probe = usblp_probe,
1423 .disconnect = usblp_disconnect,
1424 .suspend = usblp_suspend,
1425 .resume = usblp_resume,
1426 .id_table = usblp_ids,
1427 .supports_autosuspend = 1,
1428};
1429
1430static int __init usblp_init(void)
1431{
1432 return usb_register(&usblp_driver);
1433}
1434
1435static void __exit usblp_exit(void)
1436{
1437 usb_deregister(&usblp_driver);
1438}
1439
1440module_init(usblp_init);
1441module_exit(usblp_exit);
1442
1443MODULE_AUTHOR( DRIVER_AUTHOR );
1444MODULE_DESCRIPTION( DRIVER_DESC );
1445module_param(proto_bias, int, S_IRUGO | S_IWUSR);
1446MODULE_PARM_DESC(proto_bias, "Favourite protocol number");
1447MODULE_LICENSE("GPL");
1448