Lines Matching +full:string +full:- +full:array +full:- +full:property

17  *	v0.1 - thorough cleaning, URBification, almost a rewrite
18 * v0.2 - some more cleanups
19 * v0.3 - cleaner again, waitqueue fixes
20 * v0.4 - fixes in unidirectional mode
21 * v0.5 - add DEVICE_ID string support
22 * v0.6 - never time out
23 * v0.7 - fixed bulk-IN read and poll (David Paschal)
24 * v0.8 - add devfs support
25 * v0.9 - fix unplug-while-open paths
26 * v0.10- remove sleep_on, fix error on oom (oliver@neukum.org)
27 * v0.11 - add proto_bias option (Pete Zaitcev)
28 * v0.12 - add hpoj.sourceforge.net ioctls (David Paschal)
29 * v0.13 - alloc space for statusbuf (<status> not on stack);
31 * none - Maintained in Linux kernel after v0.13
47 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
81 /* Get device_id string: */
84 /* Get two-int array:
90 /* Set channel number (HP Vendor-specific command): */
92 /* Get two-int array: [0]=bus number, [1]=device address: */
94 /* Get two-int array: [0]=vendor ID, [1]=product ID: */
100 * A DEVICE_ID string may include the printer's serial number.
101 * It should end with a semi-colon (';').
102 * An example from an HP 970C DeskJet printer is (this is one long string,
104 MFG:HEWLETT-PACKARD;MDL:DESKJET 970C;CMD:MLC,PCL,PML;CLASS:PRINTER;DESCRIPTION:Hewlett-Packard Desk…
114 #define USBLP_REQ_HP_CHANNEL_CHANGE_REQUEST 0x00 /* HP Vendor-specific */
133 * ->wmut locks wstatus.
134 * ->mut locks the whole usblp, except [rw]complete, and thus, by indirection,
136 * ->lock locks what interrupt accesses.
150 /* Alternate-setting numbers and endpoints for each protocol
168 unsigned char *device_id_string; /* IEEE 1284 DEVICE ID string (ptr) */
169 /* first 2 bytes are (big-endian) length */
178 dbg("dev=0x%p", usblp->dev); in usblp_dump()
179 dbg("present=%d", usblp->present); in usblp_dump()
180 dbg("readbuf=0x%p", usblp->readbuf); in usblp_dump()
181 dbg("readcount=%d", usblp->readcount); in usblp_dump()
182 dbg("ifnum=%d", usblp->ifnum); in usblp_dump()
184 dbg("protocol[%d].alt_setting=%d", p, usblp->protocol[p].alt_setting); in usblp_dump()
185 dbg("protocol[%d].epwrite=%p", p, usblp->protocol[p].epwrite); in usblp_dump()
186 dbg("protocol[%d].epread=%p", p, usblp->protocol[p].epread); in usblp_dump()
188 dbg("current_protocol=%d", usblp->current_protocol); in usblp_dump()
189 dbg("minor=%d", usblp->minor); in usblp_dump()
190 dbg("wstatus=%d", usblp->wstatus); in usblp_dump()
191 dbg("rstatus=%d", usblp->rstatus); in usblp_dump()
192 dbg("quirks=%d", usblp->quirks); in usblp_dump()
193 dbg("used=%d", usblp->used); in usblp_dump()
194 dbg("bidir=%d", usblp->bidir); in usblp_dump()
196 usblp->device_id_string ? in usblp_dump()
197 usblp->device_id_string + 2 : in usblp_dump()
211 #define USBLP_QUIRK_USB_INIT 0x2 /* needs vendor USB init string */
212 #define USBLP_QUIRK_BAD_CLASS 0x4 /* descriptor uses vendor-specific Class or SubClass */
229 { 0x04f9, 0x000d, USBLP_QUIRK_BIDIR }, /* Brother Industries, Ltd HL-1440 Laser Printer */
254 int index = usblp->ifnum; in usblp_ctrl_msg()
260 index = (usblp->ifnum<<8)|usblp->protocol[usblp->current_protocol].alt_setting; in usblp_ctrl_msg()
262 retval = usb_control_msg(usblp->dev, in usblp_ctrl_msg()
263 dir ? usb_rcvctrlpipe(usblp->dev, 0) : usb_sndctrlpipe(usblp->dev, 0), in usblp_ctrl_msg()
285 static int proto_bias = -1;
293 struct usblp *usblp = urb->context; in usblp_bulk_read()
294 int status = urb->status; in usblp_bulk_read()
296 if (usblp->present && usblp->used) { in usblp_bulk_read()
300 usblp->minor, status); in usblp_bulk_read()
302 spin_lock(&usblp->lock); in usblp_bulk_read()
304 usblp->rstatus = status; in usblp_bulk_read()
306 usblp->rstatus = urb->actual_length; in usblp_bulk_read()
307 usblp->rcomplete = 1; in usblp_bulk_read()
308 wake_up(&usblp->rwait); in usblp_bulk_read()
309 spin_unlock(&usblp->lock); in usblp_bulk_read()
316 struct usblp *usblp = urb->context; in usblp_bulk_write()
317 int status = urb->status; in usblp_bulk_write()
319 if (usblp->present && usblp->used) { in usblp_bulk_write()
323 usblp->minor, status); in usblp_bulk_write()
325 spin_lock(&usblp->lock); in usblp_bulk_write()
327 usblp->wstatus = status; in usblp_bulk_write()
329 usblp->wstatus = urb->actual_length; in usblp_bulk_write()
330 usblp->no_paper = 0; in usblp_bulk_write()
331 usblp->wcomplete = 1; in usblp_bulk_write()
332 wake_up(&usblp->wwait); in usblp_bulk_write()
333 spin_unlock(&usblp->lock); in usblp_bulk_write()
342 static const char *usblp_messages[] = { "ok", "out of paper", "off-line", "on fire" };
349 mutex_lock(&usblp->mut); in usblp_check_status()
350 if ((error = usblp_read_status(usblp, usblp->statusbuf)) < 0) { in usblp_check_status()
351 mutex_unlock(&usblp->mut); in usblp_check_status()
354 usblp->minor, error); in usblp_check_status()
357 status = *usblp->statusbuf; in usblp_check_status()
358 mutex_unlock(&usblp->mut); in usblp_check_status()
369 usblp->minor, usblp_messages[newerr]); in usblp_check_status()
377 if (usblp->bidir && usblp->used) { in handle_bidir()
379 return -EIO; in handle_bidir()
396 return -ENODEV; in usblp_open()
400 retval = -ENODEV; in usblp_open()
405 if (!usblp || !usblp->dev || !usblp->present) in usblp_open()
408 retval = -EBUSY; in usblp_open()
409 if (usblp->used) in usblp_open()
414 * - We do not want persistent state which close(2) does not clear in usblp_open()
415 * - It is not used anyway, according to CUPS people in usblp_open()
421 usblp->used = 1; in usblp_open()
422 file->private_data = usblp; in usblp_open()
424 usblp->wcomplete = 1; /* we begin writeable */ in usblp_open()
425 usblp->wstatus = 0; in usblp_open()
426 usblp->rcomplete = 0; in usblp_open()
430 usblp->used = 0; in usblp_open()
431 file->private_data = NULL; in usblp_open()
432 retval = -EIO; in usblp_open()
441 printk(KERN_INFO "usblp%d: removed\n", usblp->minor); in usblp_cleanup()
443 kfree(usblp->readbuf); in usblp_cleanup()
444 kfree(usblp->device_id_string); in usblp_cleanup()
445 kfree(usblp->statusbuf); in usblp_cleanup()
451 usb_kill_anchored_urbs(&usblp->urbs); in usblp_unlink_urbs()
456 struct usblp *usblp = file->private_data; in usblp_release()
458 usblp->flags &= ~LP_ABORT; in usblp_release()
461 usblp->used = 0; in usblp_release()
462 if (usblp->present) { in usblp_release()
464 usb_autopm_put_interface(usblp->intf); in usblp_release()
471 /* No kernel lock - fine */
477 struct usblp *usblp = file->private_data; in usblp_poll()
478 /* Should we check file->f_mode & FMODE_WRITE before poll_wait()? */ in usblp_poll()
479 poll_wait(file, &usblp->rwait, wait); in usblp_poll()
480 poll_wait(file, &usblp->wwait, wait); in usblp_poll()
481 spin_lock_irqsave(&usblp->lock, flags); in usblp_poll()
482 ret = ((usblp->bidir && usblp->rcomplete) ? POLLIN | POLLRDNORM : 0) | in usblp_poll()
483 ((usblp->no_paper || usblp->wcomplete) ? POLLOUT | POLLWRNORM : 0); in usblp_poll()
484 spin_unlock_irqrestore(&usblp->lock, flags); in usblp_poll()
490 struct usblp *usblp = file->private_data; in usblp_ioctl()
497 mutex_lock(&usblp->mut); in usblp_ioctl()
498 if (!usblp->present) { in usblp_ioctl()
499 retval = -ENODEV; in usblp_ioctl()
506 if (_IOC_TYPE(cmd) == 'P') /* new-style ioctl number */ in usblp_ioctl()
510 case IOCNR_GET_DEVICE_ID: /* get the DEVICE_ID string */ in usblp_ioctl()
512 retval = -EINVAL; in usblp_ioctl()
525 usblp->device_id_string, in usblp_ioctl()
527 retval = -EFAULT; in usblp_ioctl()
536 retval = -EINVAL; in usblp_ioctl()
540 twoints[0] = usblp->current_protocol; in usblp_ioctl()
544 if (usblp->protocol[i].alt_setting >= 0) in usblp_ioctl()
551 retval = -EFAULT; in usblp_ioctl()
559 retval = -EINVAL; in usblp_ioctl()
564 if (arg == -10) { in usblp_ioctl()
574 usblp->current_protocol); in usblp_ioctl()
580 le16_to_cpu(usblp->dev->descriptor.idVendor) != 0x03F0 || in usblp_ioctl()
581 usblp->quirks & USBLP_QUIRK_BIDIR) { in usblp_ioctl()
582 retval = -EINVAL; in usblp_ioctl()
589 dev_err(&usblp->dev->dev, in usblp_ioctl()
592 usblp->minor, err); in usblp_ioctl()
593 retval = -EIO; in usblp_ioctl()
598 usblp->minor, arg, newChannel); in usblp_ioctl()
604 retval = -EINVAL; in usblp_ioctl()
608 twoints[0] = usblp->dev->bus->busnum; in usblp_ioctl()
609 twoints[1] = usblp->dev->devnum; in usblp_ioctl()
613 retval = -EFAULT; in usblp_ioctl()
618 usblp->minor, twoints[0], twoints[1]); in usblp_ioctl()
624 retval = -EINVAL; in usblp_ioctl()
628 twoints[0] = le16_to_cpu(usblp->dev->descriptor.idVendor); in usblp_ioctl()
629 twoints[1] = le16_to_cpu(usblp->dev->descriptor.idProduct); in usblp_ioctl()
633 retval = -EFAULT; in usblp_ioctl()
638 usblp->minor, twoints[0], twoints[1]); in usblp_ioctl()
643 retval = -EINVAL; in usblp_ioctl()
649 retval = -ENOTTY; in usblp_ioctl()
651 else /* old-style ioctl value */ in usblp_ioctl()
655 if ((retval = usblp_read_status(usblp, usblp->statusbuf))) { in usblp_ioctl()
658 usblp->minor, retval); in usblp_ioctl()
659 retval = -EIO; in usblp_ioctl()
662 status = *usblp->statusbuf; in usblp_ioctl()
664 retval = -EFAULT; in usblp_ioctl()
669 usblp->flags |= LP_ABORT; in usblp_ioctl()
671 usblp->flags &= ~LP_ABORT; in usblp_ioctl()
675 retval = -ENOTTY; in usblp_ioctl()
679 mutex_unlock(&usblp->mut); in usblp_ioctl()
695 usb_fill_bulk_urb(urb, usblp->dev, in usblp_new_writeurb()
696 usb_sndbulkpipe(usblp->dev, in usblp_new_writeurb()
697 usblp->protocol[usblp->current_protocol].epwrite->bEndpointAddress), in usblp_new_writeurb()
699 urb->transfer_flags |= URB_FREE_BUFFER; in usblp_new_writeurb()
706 struct usblp *usblp = file->private_data; in usblp_write()
712 if (mutex_lock_interruptible(&usblp->wmut)) { in usblp_write()
713 rv = -EINTR; in usblp_write()
716 if ((rv = usblp_wwait(usblp, !!(file->f_flags & O_NONBLOCK))) < 0) in usblp_write()
723 if ((transfer_length = count - writecount) > USBLP_BUF_SIZE) in usblp_write()
726 rv = -ENOMEM; in usblp_write()
729 usb_anchor_urb(writeurb, &usblp->urbs); in usblp_write()
731 if (copy_from_user(writeurb->transfer_buffer, in usblp_write()
733 rv = -EFAULT; in usblp_write()
737 spin_lock_irq(&usblp->lock); in usblp_write()
738 usblp->wcomplete = 0; in usblp_write()
739 spin_unlock_irq(&usblp->lock); in usblp_write()
741 usblp->wstatus = 0; in usblp_write()
742 spin_lock_irq(&usblp->lock); in usblp_write()
743 usblp->no_paper = 0; in usblp_write()
744 usblp->wcomplete = 1; in usblp_write()
745 wake_up(&usblp->wwait); in usblp_write()
746 spin_unlock_irq(&usblp->lock); in usblp_write()
747 if (rv != -ENOMEM) in usblp_write()
748 rv = -EIO; in usblp_write()
755 rv = usblp_wwait(usblp, !!(file->f_flags&O_NONBLOCK)); in usblp_write()
757 if (rv == -EAGAIN) { in usblp_write()
761 if (rv == -ENOSPC) { in usblp_write()
762 spin_lock_irq(&usblp->lock); in usblp_write()
763 usblp->no_paper = 1; /* Mark for poll(2) */ in usblp_write()
764 spin_unlock_irq(&usblp->lock); in usblp_write()
771 if (usblp->wstatus < 0) { in usblp_write()
772 rv = -EIO; in usblp_write()
779 writecount += usblp->wstatus; in usblp_write()
782 mutex_unlock(&usblp->wmut); in usblp_write()
792 mutex_unlock(&usblp->wmut); in usblp_write()
804 struct usblp *usblp = file->private_data; in usblp_read()
809 if (!usblp->bidir) in usblp_read()
810 return -EINVAL; in usblp_read()
812 rv = usblp_rwait_and_lock(usblp, !!(file->f_flags & O_NONBLOCK)); in usblp_read()
816 if ((avail = usblp->rstatus) < 0) { in usblp_read()
818 usblp->minor, (int)avail); in usblp_read()
820 count = -EIO; in usblp_read()
824 count = len < avail - usblp->readcount ? len : avail - usblp->readcount; in usblp_read()
826 copy_to_user(buffer, usblp->readbuf + usblp->readcount, count)) { in usblp_read()
827 count = -EFAULT; in usblp_read()
831 if ((usblp->readcount += count) == avail) { in usblp_read()
835 count = -EIO; in usblp_read()
841 mutex_unlock(&usblp->mut); in usblp_read()
847 * This is called under the ->wmut, so the idle path stays idle.
849 * Our write path has a peculiar property: it does not buffer like a tty,
850 * but waits for the write to succeed. This allows our ->release to bug out
854 * Alternatively, set blocking mode with fcntl and issue a zero-size write.
862 add_wait_queue(&usblp->wwait, &waita); in usblp_wwait()
865 if (mutex_lock_interruptible(&usblp->mut)) { in usblp_wwait()
866 rc = -EINTR; in usblp_wwait()
870 mutex_unlock(&usblp->mut); in usblp_wwait()
875 if (usblp->flags & LP_ABORT) { in usblp_wwait()
878 rc = -ENOSPC; in usblp_wwait()
883 mutex_lock(&usblp->mut); in usblp_wwait()
884 usblp_read_status(usblp, usblp->statusbuf); in usblp_wwait()
885 mutex_unlock(&usblp->mut); in usblp_wwait()
890 remove_wait_queue(&usblp->wwait, &waita); in usblp_wwait()
898 if (!usblp->present) in usblp_wtest()
899 return -ENODEV; in usblp_wtest()
901 return -EINTR; in usblp_wtest()
902 spin_lock_irqsave(&usblp->lock, flags); in usblp_wtest()
903 if (usblp->wcomplete) { in usblp_wtest()
904 spin_unlock_irqrestore(&usblp->lock, flags); in usblp_wtest()
907 spin_unlock_irqrestore(&usblp->lock, flags); in usblp_wtest()
909 return -EAGAIN; in usblp_wtest()
925 add_wait_queue(&usblp->rwait, &waita); in usblp_rwait_and_lock()
927 if (mutex_lock_interruptible(&usblp->mut)) { in usblp_rwait_and_lock()
928 rc = -EINTR; in usblp_rwait_and_lock()
933 mutex_unlock(&usblp->mut); in usblp_rwait_and_lock()
938 mutex_unlock(&usblp->mut); in usblp_rwait_and_lock()
942 remove_wait_queue(&usblp->rwait, &waita); in usblp_rwait_and_lock()
950 if (!usblp->present) in usblp_rtest()
951 return -ENODEV; in usblp_rtest()
953 return -EINTR; in usblp_rtest()
954 spin_lock_irqsave(&usblp->lock, flags); in usblp_rtest()
955 if (usblp->rcomplete) { in usblp_rtest()
956 spin_unlock_irqrestore(&usblp->lock, flags); in usblp_rtest()
959 spin_unlock_irqrestore(&usblp->lock, flags); in usblp_rtest()
961 return -EAGAIN; in usblp_rtest()
966 * Please check ->bidir and other such things outside for now.
974 rc = -ENOMEM; in usblp_submit_read()
978 usb_fill_bulk_urb(urb, usblp->dev, in usblp_submit_read()
979 usb_rcvbulkpipe(usblp->dev, in usblp_submit_read()
980 usblp->protocol[usblp->current_protocol].epread->bEndpointAddress), in usblp_submit_read()
981 usblp->readbuf, USBLP_BUF_SIZE_IN, in usblp_submit_read()
983 usb_anchor_urb(urb, &usblp->urbs); in usblp_submit_read()
985 spin_lock_irqsave(&usblp->lock, flags); in usblp_submit_read()
986 usblp->readcount = 0; /* XXX Why here? */ in usblp_submit_read()
987 usblp->rcomplete = 0; in usblp_submit_read()
988 spin_unlock_irqrestore(&usblp->lock, flags); in usblp_submit_read()
991 spin_lock_irqsave(&usblp->lock, flags); in usblp_submit_read()
992 usblp->rstatus = rc; in usblp_submit_read()
993 usblp->rcomplete = 1; in usblp_submit_read()
994 spin_unlock_irqrestore(&usblp->lock, flags); in usblp_submit_read()
1010 * have this flaw (HP 810, 880, 895, etc.), or needing an init string
1065 if (usblp->device_id_string[0] == 0 && in usblp_show_ieee1284_id()
1066 usblp->device_id_string[1] == 0) in usblp_show_ieee1284_id()
1069 return sprintf(buf, "%s", usblp->device_id_string+2); in usblp_show_ieee1284_id()
1086 retval = -ENOMEM; in usblp_probe()
1089 usblp->dev = dev; in usblp_probe()
1090 mutex_init(&usblp->wmut); in usblp_probe()
1091 mutex_init(&usblp->mut); in usblp_probe()
1092 spin_lock_init(&usblp->lock); in usblp_probe()
1093 init_waitqueue_head(&usblp->rwait); in usblp_probe()
1094 init_waitqueue_head(&usblp->wwait); in usblp_probe()
1095 init_usb_anchor(&usblp->urbs); in usblp_probe()
1096 usblp->ifnum = intf->cur_altsetting->desc.bInterfaceNumber; in usblp_probe()
1097 usblp->intf = intf; in usblp_probe()
1099 /* Malloc device ID string buffer to the largest expected length, in usblp_probe()
1100 * since we can re-query it on an ioctl and a dynamic string in usblp_probe()
1102 if (!(usblp->device_id_string = kmalloc(USBLP_DEVICE_ID_SIZE, GFP_KERNEL))) { in usblp_probe()
1103 retval = -ENOMEM; in usblp_probe()
1112 if (!(usblp->readbuf = kmalloc(USBLP_BUF_SIZE_IN, GFP_KERNEL))) { in usblp_probe()
1113 retval = -ENOMEM; in usblp_probe()
1118 usblp->statusbuf = kmalloc(STATUS_BUF_SIZE, GFP_KERNEL); in usblp_probe()
1119 if (!usblp->statusbuf) { in usblp_probe()
1120 retval = -ENOMEM; in usblp_probe()
1125 usblp->quirks = usblp_quirks( in usblp_probe()
1126 le16_to_cpu(dev->descriptor.idVendor), in usblp_probe()
1127 le16_to_cpu(dev->descriptor.idProduct)); in usblp_probe()
1132 dbg("incompatible printer-class device 0x%4.4X/0x%4.4X", in usblp_probe()
1133 le16_to_cpu(dev->descriptor.idVendor), in usblp_probe()
1134 le16_to_cpu(dev->descriptor.idProduct)); in usblp_probe()
1135 retval = -ENODEV; in usblp_probe()
1141 retval = -ENODEV; /* ->probe isn't ->ioctl */ in usblp_probe()
1145 /* Retrieve and store the device ID string. */ in usblp_probe()
1147 retval = device_create_file(&intf->dev, &dev_attr_ieee1284_id); in usblp_probe()
1157 usblp->present = 1; in usblp_probe()
1166 usblp->minor = intf->minor; in usblp_probe()
1169 usblp->minor, usblp->bidir ? "Bi" : "Uni", dev->devnum, in usblp_probe()
1170 usblp->ifnum, in usblp_probe()
1171 usblp->protocol[usblp->current_protocol].alt_setting, in usblp_probe()
1172 usblp->current_protocol, in usblp_probe()
1173 le16_to_cpu(usblp->dev->descriptor.idVendor), in usblp_probe()
1174 le16_to_cpu(usblp->dev->descriptor.idProduct)); in usblp_probe()
1180 device_remove_file(&intf->dev, &dev_attr_ieee1284_id); in usblp_probe()
1182 kfree(usblp->readbuf); in usblp_probe()
1183 kfree(usblp->statusbuf); in usblp_probe()
1184 kfree(usblp->device_id_string); in usblp_probe()
1205 * stream-compatible, because this matches the behaviour of the old code.
1207 * If nothing else, we bind to 7/1/1 - the unidirectional interface.
1216 if_alt = usblp->intf; in usblp_select_alts()
1219 usblp->protocol[p].alt_setting = -1; in usblp_select_alts()
1222 for (i = 0; i < if_alt->num_altsetting; i++) { in usblp_select_alts()
1223 ifd = &if_alt->altsetting[i]; in usblp_select_alts()
1225 if (ifd->desc.bInterfaceClass != 7 || ifd->desc.bInterfaceSubClass != 1) in usblp_select_alts()
1226 if (!(usblp->quirks & USBLP_QUIRK_BAD_CLASS)) in usblp_select_alts()
1229 if (ifd->desc.bInterfaceProtocol < USBLP_FIRST_PROTOCOL || in usblp_select_alts()
1230 ifd->desc.bInterfaceProtocol > USBLP_LAST_PROTOCOL) in usblp_select_alts()
1235 for (e = 0; e < ifd->desc.bNumEndpoints; e++) { in usblp_select_alts()
1236 epd = &ifd->endpoint[e].desc; in usblp_select_alts()
1248 if (!epwrite || (ifd->desc.bInterfaceProtocol > 1 && !epread)) in usblp_select_alts()
1253 if (ifd->desc.bInterfaceProtocol == 1) { in usblp_select_alts()
1255 } else if (usblp->quirks & USBLP_QUIRK_BIDIR) { in usblp_select_alts()
1258 usblp->minor); in usblp_select_alts()
1262 usblp->protocol[ifd->desc.bInterfaceProtocol].alt_setting = in usblp_select_alts()
1263 ifd->desc.bAlternateSetting; in usblp_select_alts()
1264 usblp->protocol[ifd->desc.bInterfaceProtocol].epwrite = epwrite; in usblp_select_alts()
1265 usblp->protocol[ifd->desc.bInterfaceProtocol].epread = epread; in usblp_select_alts()
1271 usblp->protocol[proto_bias].alt_setting != -1) in usblp_select_alts()
1275 if (usblp->protocol[2].alt_setting != -1) in usblp_select_alts()
1277 if (usblp->protocol[1].alt_setting != -1) in usblp_select_alts()
1279 if (usblp->protocol[3].alt_setting != -1) in usblp_select_alts()
1283 return -1; in usblp_select_alts()
1291 return -EINVAL; in usblp_set_protocol()
1293 alts = usblp->protocol[protocol].alt_setting; in usblp_set_protocol()
1295 return -EINVAL; in usblp_set_protocol()
1296 r = usb_set_interface(usblp->dev, usblp->ifnum, alts); in usblp_set_protocol()
1299 alts, usblp->ifnum); in usblp_set_protocol()
1303 usblp->bidir = (usblp->protocol[protocol].epread != NULL); in usblp_set_protocol()
1304 usblp->current_protocol = protocol; in usblp_set_protocol()
1305 dbg("usblp%d set protocol %d", usblp->minor, protocol); in usblp_set_protocol()
1309 /* Retrieves and caches device ID string.
1316 err = usblp_get_id(usblp, 0, usblp->device_id_string, USBLP_DEVICE_ID_SIZE - 1); in usblp_cache_device_id_string()
1318 dbg("usblp%d: error = %d reading IEEE-1284 Device ID string", in usblp_cache_device_id_string()
1319 usblp->minor, err); in usblp_cache_device_id_string()
1320 usblp->device_id_string[0] = usblp->device_id_string[1] = '\0'; in usblp_cache_device_id_string()
1321 return -EIO; in usblp_cache_device_id_string()
1324 /* First two bytes are length in big-endian. in usblp_cache_device_id_string()
1327 length = be16_to_cpu(*((__be16 *)usblp->device_id_string)); in usblp_cache_device_id_string()
1331 length = USBLP_DEVICE_ID_SIZE - 1; in usblp_cache_device_id_string()
1332 usblp->device_id_string[length] = '\0'; in usblp_cache_device_id_string()
1334 dbg("usblp%d Device ID string [len=%d]=\"%s\"", in usblp_cache_device_id_string()
1335 usblp->minor, length, &usblp->device_id_string[2]); in usblp_cache_device_id_string()
1346 if (!usblp || !usblp->dev) { in usblp_disconnect()
1347 dev_err(&intf->dev, "bogus disconnect\n"); in usblp_disconnect()
1351 device_remove_file(&intf->dev, &dev_attr_ieee1284_id); in usblp_disconnect()
1354 mutex_lock(&usblp->mut); in usblp_disconnect()
1355 usblp->present = 0; in usblp_disconnect()
1356 wake_up(&usblp->wwait); in usblp_disconnect()
1357 wake_up(&usblp->rwait); in usblp_disconnect()
1361 mutex_unlock(&usblp->mut); in usblp_disconnect()
1363 if (!usblp->used) in usblp_disconnect()
1375 wake_up(&usblp->wwait); in usblp_suspend()
1376 wake_up(&usblp->rwait); in usblp_suspend()