• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/usb/class/

Lines Matching refs:usblp

2  * usblp.c
133 * ->mut locks the whole usblp, except [rw]complete, and thus, by indirection,
137 struct usblp {
172 static void usblp_dump(struct usblp *usblp)
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);
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);
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);
195 usblp->device_id_string ?
196 usblp->device_id_string + 2 :
233 static int usblp_wwait(struct usblp *usblp, int nonblock);
234 static int usblp_wtest(struct usblp *usblp, int nonblock);
235 static int usblp_rwait_and_lock(struct usblp *usblp, int nonblock);
236 static int usblp_rtest(struct usblp *usblp, int nonblock);
237 static int usblp_submit_read(struct usblp *usblp);
238 static int usblp_select_alts(struct usblp *usblp);
239 static int usblp_set_protocol(struct usblp *usblp, int protocol);
240 static int usblp_cache_device_id_string(struct usblp *usblp);
244 static DEFINE_MUTEX(usblp_mutex); /* locks the existence of usblp's */
247 * Functions for usblp control messages.
250 static int usblp_ctrl_msg(struct usblp *usblp, int request, int type, int dir, int recip, int value, void *buf, int len)
253 int index = usblp->ifnum;
259 index = (usblp->ifnum<<8)|usblp->protocol[usblp->current_protocol].alt_setting;
261 retval = usb_control_msg(usblp->dev,
262 dir ? usb_rcvctrlpipe(usblp->dev, 0) : usb_sndctrlpipe(usblp->dev, 0),
269 #define usblp_read_status(usblp, status)\
270 usblp_ctrl_msg(usblp, USBLP_REQ_GET_STATUS, USB_TYPE_CLASS, USB_DIR_IN, USB_RECIP_INTERFACE, 0, status, 1)
271 #define usblp_get_id(usblp, config, id, maxlen)\
272 usblp_ctrl_msg(usblp, USBLP_REQ_GET_ID, USB_TYPE_CLASS, USB_DIR_IN, USB_RECIP_INTERFACE, config, id, maxlen)
273 #define usblp_reset(usblp)\
274 usblp_ctrl_msg(usblp, USBLP_REQ_RESET, USB_TYPE_CLASS, USB_DIR_OUT, USB_RECIP_OTHER, 0, NULL, 0)
276 #define usblp_hp_channel_change_request(usblp, channel, buffer) \
277 usblp_ctrl_msg(usblp, USBLP_REQ_HP_CHANNEL_CHANGE_REQUEST, USB_TYPE_VENDOR, USB_DIR_IN, USB_RECIP_INTERFACE, channel, buffer, 1)
292 struct usblp *usblp = urb->context;
295 if (usblp->present && usblp->used) {
297 printk(KERN_WARNING "usblp%d: "
299 usblp->minor, status);
301 spin_lock(&usblp->lock);
303 usblp->rstatus = status;
305 usblp->rstatus = urb->actual_length;
306 usblp->rcomplete = 1;
307 wake_up(&usblp->rwait);
308 spin_unlock(&usblp->lock);
315 struct usblp *usblp = urb->context;
318 if (usblp->present && usblp->used) {
320 printk(KERN_WARNING "usblp%d: "
322 usblp->minor, status);
324 spin_lock(&usblp->lock);
326 usblp->wstatus = status;
328 usblp->wstatus = urb->actual_length;
329 usblp->no_paper = 0;
330 usblp->wcomplete = 1;
331 wake_up(&usblp->wwait);
332 spin_unlock(&usblp->lock);
343 static int usblp_check_status(struct usblp *usblp, int err)
348 mutex_lock(&usblp->mut);
349 if ((error = usblp_read_status(usblp, usblp->statusbuf)) < 0) {
350 mutex_unlock(&usblp->mut);
353 "usblp%d: error %d reading printer status\n",
354 usblp->minor, error);
357 status = *usblp->statusbuf;
358 mutex_unlock(&usblp->mut);
368 printk(KERN_INFO "usblp%d: %s\n",
369 usblp->minor, usblp_messages[newerr]);
375 static int handle_bidir(struct usblp *usblp)
377 if (usblp->bidir && usblp->used) {
378 if (usblp_submit_read(usblp) < 0)
391 struct usblp *usblp;
404 usblp = usb_get_intfdata(intf);
405 if (!usblp || !usblp->dev || !usblp->present)
409 if (usblp->used)
421 usblp->used = 1;
422 file->private_data = usblp;
424 usblp->wcomplete = 1; /* we begin writeable */
425 usblp->wstatus = 0;
426 usblp->rcomplete = 0;
428 if (handle_bidir(usblp) < 0) {
430 usblp->used = 0;
439 static void usblp_cleanup(struct usblp *usblp)
441 printk(KERN_INFO "usblp%d: removed\n", usblp->minor);
443 kfree(usblp->readbuf);
444 kfree(usblp->device_id_string);
445 kfree(usblp->statusbuf);
446 kfree(usblp);
449 static void usblp_unlink_urbs(struct usblp *usblp)
451 usb_kill_anchored_urbs(&usblp->urbs);
456 struct usblp *usblp = file->private_data;
458 usblp->flags &= ~LP_ABORT;
461 usblp->used = 0;
462 if (usblp->present) {
463 usblp_unlink_urbs(usblp);
464 usb_autopm_put_interface(usblp->intf);
466 usblp_cleanup(usblp);
477 struct usblp *usblp = file->private_data;
479 poll_wait(file, &usblp->rwait, wait);
480 poll_wait(file, &usblp->wwait, wait);
481 spin_lock_irqsave(&usblp->lock, flags);
482 ret = ((usblp->bidir && usblp->rcomplete) ? POLLIN | POLLRDNORM : 0) |
483 ((usblp->no_paper || usblp->wcomplete) ? POLLOUT | POLLWRNORM : 0);
484 spin_unlock_irqrestore(&usblp->lock, flags);
490 struct usblp *usblp = file->private_data;
497 mutex_lock(&usblp->mut);
498 if (!usblp->present) {
516 length = usblp_cache_device_id_string(usblp);
525 usblp->device_id_string,
540 twoints[0] = usblp->current_protocol;
544 if (usblp->protocol[i].alt_setting >= 0)
565 usblp_dump(usblp);
570 usblp_unlink_urbs(usblp);
571 retval = usblp_set_protocol(usblp, arg);
573 usblp_set_protocol(usblp,
574 usblp->current_protocol);
580 le16_to_cpu(usblp->dev->descriptor.idVendor) != 0x03F0 ||
581 usblp->quirks & USBLP_QUIRK_BIDIR) {
586 err = usblp_hp_channel_change_request(usblp,
589 dev_err(&usblp->dev->dev,
590 "usblp%d: error = %d setting "
592 usblp->minor, err);
597 dbg("usblp%d requested/got HP channel %ld/%d",
598 usblp->minor, arg, newChannel);
608 twoints[0] = usblp->dev->bus->busnum;
609 twoints[1] = usblp->dev->devnum;
617 dbg("usblp%d is bus=%d, device=%d",
618 usblp->minor, twoints[0], twoints[1]);
628 twoints[0] = le16_to_cpu(usblp->dev->descriptor.idVendor);
629 twoints[1] = le16_to_cpu(usblp->dev->descriptor.idProduct);
637 dbg("usblp%d is VID=0x%4.4X, PID=0x%4.4X",
638 usblp->minor, twoints[0], twoints[1]);
646 retval = usblp_reset(usblp);
655 if ((retval = usblp_read_status(usblp, usblp->statusbuf))) {
657 printk(KERN_ERR "usblp%d:"
659 usblp->minor, retval);
663 status = *usblp->statusbuf;
670 usblp->flags |= LP_ABORT;
672 usblp->flags &= ~LP_ABORT;
680 mutex_unlock(&usblp->mut);
684 static struct urb *usblp_new_writeurb(struct usblp *usblp, int transfer_length)
696 usb_fill_bulk_urb(urb, usblp->dev,
697 usb_sndbulkpipe(usblp->dev,
698 usblp->protocol[usblp->current_protocol].epwrite->bEndpointAddress),
699 writebuf, transfer_length, usblp_bulk_write, usblp);
707 struct usblp *usblp = file->private_data;
713 if (mutex_lock_interruptible(&usblp->wmut)) {
717 if ((rv = usblp_wwait(usblp, !!(file->f_flags & O_NONBLOCK))) < 0)
728 if ((writeurb = usblp_new_writeurb(usblp, transfer_length)) == NULL)
730 usb_anchor_urb(writeurb, &usblp->urbs);
738 spin_lock_irq(&usblp->lock);
739 usblp->wcomplete = 0;
740 spin_unlock_irq(&usblp->lock);
742 usblp->wstatus = 0;
743 spin_lock_irq(&usblp->lock);
744 usblp->no_paper = 0;
745 usblp->wcomplete = 1;
746 wake_up(&usblp->wwait);
747 spin_unlock_irq(&usblp->lock);
756 rv = usblp_wwait(usblp, !!(file->f_flags&O_NONBLOCK));
763 spin_lock_irq(&usblp->lock);
764 usblp->no_paper = 1; /* Mark for poll(2) */
765 spin_unlock_irq(&usblp->lock);
772 if (usblp->wstatus < 0) {
780 writecount += usblp->wstatus;
783 mutex_unlock(&usblp->wmut);
793 mutex_unlock(&usblp->wmut);
805 struct usblp *usblp = file->private_data;
810 if (!usblp->bidir)
813 rv = usblp_rwait_and_lock(usblp, !!(file->f_flags & O_NONBLOCK));
817 if ((avail = usblp->rstatus) < 0) {
818 printk(KERN_ERR "usblp%d: error %d reading from printer\n",
819 usblp->minor, (int)avail);
820 usblp_submit_read(usblp);
825 count = len < avail - usblp->readcount ? len : avail - usblp->readcount;
827 copy_to_user(buffer, usblp->readbuf + usblp->readcount, count)) {
832 if ((usblp->readcount += count) == avail) {
833 if (usblp_submit_read(usblp) < 0) {
842 mutex_unlock(&usblp->mut);
857 static int usblp_wwait(struct usblp *usblp, int nonblock)
863 add_wait_queue(&usblp->wwait, &waita);
866 if (mutex_lock_interruptible(&usblp->mut)) {
870 rc = usblp_wtest(usblp, nonblock);
871 mutex_unlock(&usblp->mut);
876 if (usblp->flags & LP_ABORT) {
877 err = usblp_check_status(usblp, err);
884 mutex_lock(&usblp->mut);
885 usblp_read_status(usblp, usblp->statusbuf);
886 mutex_unlock(&usblp->mut);
891 remove_wait_queue(&usblp->wwait, &waita);
895 static int usblp_wtest(struct usblp *usblp, int nonblock)
899 if (!usblp->present)
903 spin_lock_irqsave(&usblp->lock, flags);
904 if (usblp->wcomplete) {
905 spin_unlock_irqrestore(&usblp->lock, flags);
908 spin_unlock_irqrestore(&usblp->lock, flags);
921 static int usblp_rwait_and_lock(struct usblp *usblp, int nonblock)
926 add_wait_queue(&usblp->rwait, &waita);
928 if (mutex_lock_interruptible(&usblp->mut)) {
933 if ((rc = usblp_rtest(usblp, nonblock)) < 0) {
934 mutex_unlock(&usblp->mut);
939 mutex_unlock(&usblp->mut);
943 remove_wait_queue(&usblp->rwait, &waita);
947 static int usblp_rtest(struct usblp *usblp, int nonblock)
951 if (!usblp->present)
955 spin_lock_irqsave(&usblp->lock, flags);
956 if (usblp->rcomplete) {
957 spin_unlock_irqrestore(&usblp->lock, flags);
960 spin_unlock_irqrestore(&usblp->lock, flags);
969 static int usblp_submit_read(struct usblp *usblp)
979 usb_fill_bulk_urb(urb, usblp->dev,
980 usb_rcvbulkpipe(usblp->dev,
981 usblp->protocol[usblp->current_protocol].epread->bEndpointAddress),
982 usblp->readbuf, USBLP_BUF_SIZE_IN,
983 usblp_bulk_read, usblp);
984 usb_anchor_urb(urb, &usblp->urbs);
986 spin_lock_irqsave(&usblp->lock, flags);
987 usblp->readcount = 0;
988 usblp->rcomplete = 0;
989 spin_unlock_irqrestore(&usblp->lock, flags);
992 spin_lock_irqsave(&usblp->lock, flags);
993 usblp->rstatus = rc;
994 usblp->rcomplete = 1;
995 spin_unlock_irqrestore(&usblp->lock, flags);
1063 struct usblp *usblp = usb_get_intfdata(intf);
1065 if (usblp->device_id_string[0] == 0 &&
1066 usblp->device_id_string[1] == 0)
1069 return sprintf(buf, "%s", usblp->device_id_string+2);
1078 struct usblp *usblp;
1082 /* Malloc and start initializing usblp structure so we can use it
1084 usblp = kzalloc(sizeof(struct usblp), GFP_KERNEL);
1085 if (!usblp) {
1089 usblp->dev = dev;
1090 mutex_init(&usblp->wmut);
1091 mutex_init(&usblp->mut);
1092 spin_lock_init(&usblp->lock);
1093 init_waitqueue_head(&usblp->rwait);
1094 init_waitqueue_head(&usblp->wwait);
1095 init_usb_anchor(&usblp->urbs);
1096 usblp->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
1097 usblp->intf = intf;
1102 if (!(usblp->device_id_string = kmalloc(USBLP_DEVICE_ID_SIZE, GFP_KERNEL))) {
1112 if (!(usblp->readbuf = kmalloc(USBLP_BUF_SIZE_IN, GFP_KERNEL))) {
1118 usblp->statusbuf = kmalloc(STATUS_BUF_SIZE, GFP_KERNEL);
1119 if (!usblp->statusbuf) {
1125 usblp->quirks = usblp_quirks(
1130 protocol = usblp_select_alts(usblp);
1140 if (usblp_set_protocol(usblp, protocol) < 0) {
1146 usblp_cache_device_id_string(usblp);
1152 usblp_check_status(usblp, 0);
1155 usb_set_intfdata(intf, usblp);
1157 usblp->present = 1;
1161 printk(KERN_ERR "usblp: Not able to get a minor"
1166 usblp->minor = intf->minor;
1167 printk(KERN_INFO "usblp%d: USB %sdirectional printer dev %d "
1169 usblp->minor, usblp->bidir ? "Bi" : "Uni", dev->devnum,
1170 usblp->ifnum,
1171 usblp->protocol[usblp->current_protocol].alt_setting,
1172 usblp->current_protocol,
1173 le16_to_cpu(usblp->dev->descriptor.idVendor),
1174 le16_to_cpu(usblp->dev->descriptor.idProduct));
1182 kfree(usblp->readbuf);
1183 kfree(usblp->statusbuf);
1184 kfree(usblp->device_id_string);
1185 kfree(usblp);
1209 static int usblp_select_alts(struct usblp *usblp)
1216 if_alt = usblp->intf;
1219 usblp->protocol[p].alt_setting = -1;
1226 if (!(usblp->quirks & USBLP_QUIRK_BAD_CLASS))
1255 } else if (usblp->quirks & USBLP_QUIRK_BIDIR) {
1256 printk(KERN_INFO "usblp%d: Disabling reads from "
1258 usblp->minor);
1262 usblp->protocol[ifd->desc.bInterfaceProtocol].alt_setting =
1264 usblp->protocol[ifd->desc.bInterfaceProtocol].epwrite = epwrite;
1265 usblp->protocol[ifd->desc.bInterfaceProtocol].epread = epread;
1271 usblp->protocol[proto_bias].alt_setting != -1)
1275 if (usblp->protocol[2].alt_setting != -1)
1277 if (usblp->protocol[1].alt_setting != -1)
1279 if (usblp->protocol[3].alt_setting != -1)
1286 static int usblp_set_protocol(struct usblp *usblp, int protocol)
1293 alts = usblp->protocol[protocol].alt_setting;
1296 r = usb_set_interface(usblp->dev, usblp->ifnum, alts);
1298 printk(KERN_ERR "usblp: can't set desired altsetting %d on interface %d\n",
1299 alts, usblp->ifnum);
1303 usblp->bidir = (usblp->protocol[protocol].epread != NULL);
1304 usblp->current_protocol = protocol;
1305 dbg("usblp%d set protocol %d", usblp->minor, protocol);
1312 static int usblp_cache_device_id_string(struct usblp *usblp)
1316 err = usblp_get_id(usblp, 0, usblp->device_id_string, USBLP_DEVICE_ID_SIZE - 1);
1318 dbg("usblp%d: error = %d reading IEEE-1284 Device ID string",
1319 usblp->minor, err);
1320 usblp->device_id_string[0] = usblp->device_id_string[1] = '\0';
1327 length = be16_to_cpu(*((__be16 *)usblp->device_id_string));
1332 usblp->device_id_string[length] = '\0';
1334 dbg("usblp%d Device ID string [len=%d]=\"%s\"",
1335 usblp->minor, length, &usblp->device_id_string[2]);
1342 struct usblp *usblp = usb_get_intfdata(intf);
1346 if (!usblp || !usblp->dev) {
1354 mutex_lock(&usblp->mut);
1355 usblp->present = 0;
1356 wake_up(&usblp->wwait);
1357 wake_up(&usblp->rwait);
1360 usblp_unlink_urbs(usblp);
1361 mutex_unlock(&usblp->mut);
1363 if (!usblp->used)
1364 usblp_cleanup(usblp);
1370 struct usblp *usblp = usb_get_intfdata(intf);
1372 usblp_unlink_urbs(usblp);
1379 struct usblp *usblp = usb_get_intfdata(intf);
1382 r = handle_bidir(usblp);
1401 .name = "usblp",