diff options
| author | Michal Marek <mmarek@suse.cz> | 2010-08-20 07:53:08 -0400 |
|---|---|---|
| committer | Michal Marek <mmarek@suse.cz> | 2010-08-20 07:53:08 -0400 |
| commit | e981b060767b3c4ac9393ad8d2558d648e35dfcb (patch) | |
| tree | 9c05eaec3072be3645dda61d35085d152b9d5954 /drivers/usb/class | |
| parent | 3c955b407a084810f57260d61548cc92c14bc627 (diff) | |
| parent | da5cabf80e2433131bf0ed8993abc0f7ea618c73 (diff) | |
Merge commit 'v2.6.36-rc1' into kbuild/rc-fixes
Diffstat (limited to 'drivers/usb/class')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 14 | ||||
| -rw-r--r-- | drivers/usb/class/usblp.c | 373 |
2 files changed, 190 insertions, 197 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 162c95a088ed..1833b3a71515 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * cdc-acm.c | 2 | * cdc-acm.c |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 1999 Armin Fuerst <fuerst@in.tum.de> | 4 | * Copyright (c) 1999 Armin Fuerst <fuerst@in.tum.de> |
| 5 | * Copyright (c) 1999 Pavel Machek <pavel@suse.cz> | 5 | * Copyright (c) 1999 Pavel Machek <pavel@ucw.cz> |
| 6 | * Copyright (c) 1999 Johannes Erdfelt <johannes@erdfelt.com> | 6 | * Copyright (c) 1999 Johannes Erdfelt <johannes@erdfelt.com> |
| 7 | * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz> | 7 | * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz> |
| 8 | * Copyright (c) 2004 Oliver Neukum <oliver@neukum.name> | 8 | * Copyright (c) 2004 Oliver Neukum <oliver@neukum.name> |
| @@ -636,19 +636,13 @@ static void acm_tty_unregister(struct acm *acm) | |||
| 636 | 636 | ||
| 637 | static int acm_tty_chars_in_buffer(struct tty_struct *tty); | 637 | static int acm_tty_chars_in_buffer(struct tty_struct *tty); |
| 638 | 638 | ||
| 639 | static void acm_port_down(struct acm *acm, int drain) | 639 | static void acm_port_down(struct acm *acm) |
| 640 | { | 640 | { |
| 641 | int i, nr = acm->rx_buflimit; | 641 | int i, nr = acm->rx_buflimit; |
| 642 | mutex_lock(&open_mutex); | 642 | mutex_lock(&open_mutex); |
| 643 | if (acm->dev) { | 643 | if (acm->dev) { |
| 644 | usb_autopm_get_interface(acm->control); | 644 | usb_autopm_get_interface(acm->control); |
| 645 | acm_set_control(acm, acm->ctrlout = 0); | 645 | acm_set_control(acm, acm->ctrlout = 0); |
| 646 | /* try letting the last writes drain naturally */ | ||
| 647 | if (drain) { | ||
| 648 | wait_event_interruptible_timeout(acm->drain_wait, | ||
| 649 | (ACM_NW == acm_wb_is_avail(acm)) || !acm->dev, | ||
| 650 | ACM_CLOSE_TIMEOUT * HZ); | ||
| 651 | } | ||
| 652 | usb_kill_urb(acm->ctrlurb); | 646 | usb_kill_urb(acm->ctrlurb); |
| 653 | for (i = 0; i < ACM_NW; i++) | 647 | for (i = 0; i < ACM_NW; i++) |
| 654 | usb_kill_urb(acm->wb[i].urb); | 648 | usb_kill_urb(acm->wb[i].urb); |
| @@ -664,7 +658,7 @@ static void acm_tty_hangup(struct tty_struct *tty) | |||
| 664 | { | 658 | { |
| 665 | struct acm *acm = tty->driver_data; | 659 | struct acm *acm = tty->driver_data; |
| 666 | tty_port_hangup(&acm->port); | 660 | tty_port_hangup(&acm->port); |
| 667 | acm_port_down(acm, 0); | 661 | acm_port_down(acm); |
| 668 | } | 662 | } |
| 669 | 663 | ||
| 670 | static void acm_tty_close(struct tty_struct *tty, struct file *filp) | 664 | static void acm_tty_close(struct tty_struct *tty, struct file *filp) |
| @@ -685,7 +679,7 @@ static void acm_tty_close(struct tty_struct *tty, struct file *filp) | |||
| 685 | mutex_unlock(&open_mutex); | 679 | mutex_unlock(&open_mutex); |
| 686 | return; | 680 | return; |
| 687 | } | 681 | } |
| 688 | acm_port_down(acm, 0); | 682 | acm_port_down(acm); |
| 689 | tty_port_close_end(&acm->port, tty); | 683 | tty_port_close_end(&acm->port, tty); |
| 690 | tty_port_tty_set(&acm->port, NULL); | 684 | tty_port_tty_set(&acm->port, NULL); |
| 691 | } | 685 | } |
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index 2250095db0a0..e325162859b0 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * usblp.c | 2 | * usblp.c |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 1999 Michael Gee <michael@linuxspecific.com> | 4 | * Copyright (c) 1999 Michael Gee <michael@linuxspecific.com> |
| 5 | * Copyright (c) 1999 Pavel Machek <pavel@suse.cz> | 5 | * Copyright (c) 1999 Pavel Machek <pavel@ucw.cz> |
| 6 | * Copyright (c) 2000 Randy Dunlap <rdunlap@xenotime.net> | 6 | * Copyright (c) 2000 Randy Dunlap <rdunlap@xenotime.net> |
| 7 | * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz> | 7 | * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz> |
| 8 | # Copyright (c) 2001 Pete Zaitcev <zaitcev@redhat.com> | 8 | # Copyright (c) 2001 Pete Zaitcev <zaitcev@redhat.com> |
| @@ -135,7 +135,7 @@ MFG:HEWLETT-PACKARD;MDL:DESKJET 970C;CMD:MLC,PCL,PML;CLASS:PRINTER;DESCRIPTION:H | |||
| 135 | * ->lock locks what interrupt accesses. | 135 | * ->lock locks what interrupt accesses. |
| 136 | */ | 136 | */ |
| 137 | struct usblp { | 137 | struct usblp { |
| 138 | struct usb_device *dev; /* USB device */ | 138 | struct usb_device *dev; /* USB device */ |
| 139 | struct mutex wmut; | 139 | struct mutex wmut; |
| 140 | struct mutex mut; | 140 | struct mutex mut; |
| 141 | spinlock_t lock; /* locks rcomplete, wcomplete */ | 141 | spinlock_t lock; /* locks rcomplete, wcomplete */ |
| @@ -169,7 +169,8 @@ struct usblp { | |||
| 169 | }; | 169 | }; |
| 170 | 170 | ||
| 171 | #ifdef DEBUG | 171 | #ifdef DEBUG |
| 172 | static void usblp_dump(struct usblp *usblp) { | 172 | static void usblp_dump(struct usblp *usblp) |
| 173 | { | ||
| 173 | int p; | 174 | int p; |
| 174 | 175 | ||
| 175 | dbg("usblp=0x%p", usblp); | 176 | dbg("usblp=0x%p", usblp); |
| @@ -216,8 +217,8 @@ static const struct quirk_printer_struct quirk_printers[] = { | |||
| 216 | { 0x03f0, 0x0304, USBLP_QUIRK_BIDIR }, /* HP DeskJet 810C/812C */ | 217 | { 0x03f0, 0x0304, USBLP_QUIRK_BIDIR }, /* HP DeskJet 810C/812C */ |
| 217 | { 0x03f0, 0x0404, USBLP_QUIRK_BIDIR }, /* HP DeskJet 830C */ | 218 | { 0x03f0, 0x0404, USBLP_QUIRK_BIDIR }, /* HP DeskJet 830C */ |
| 218 | { 0x03f0, 0x0504, USBLP_QUIRK_BIDIR }, /* HP DeskJet 885C */ | 219 | { 0x03f0, 0x0504, USBLP_QUIRK_BIDIR }, /* HP DeskJet 885C */ |
| 219 | { 0x03f0, 0x0604, USBLP_QUIRK_BIDIR }, /* HP DeskJet 840C */ | 220 | { 0x03f0, 0x0604, USBLP_QUIRK_BIDIR }, /* HP DeskJet 840C */ |
| 220 | { 0x03f0, 0x0804, USBLP_QUIRK_BIDIR }, /* HP DeskJet 816C */ | 221 | { 0x03f0, 0x0804, USBLP_QUIRK_BIDIR }, /* HP DeskJet 816C */ |
| 221 | { 0x03f0, 0x1104, USBLP_QUIRK_BIDIR }, /* HP Deskjet 959C */ | 222 | { 0x03f0, 0x1104, USBLP_QUIRK_BIDIR }, /* HP Deskjet 959C */ |
| 222 | { 0x0409, 0xefbe, USBLP_QUIRK_BIDIR }, /* NEC Picty900 (HP OEM) */ | 223 | { 0x0409, 0xefbe, USBLP_QUIRK_BIDIR }, /* NEC Picty900 (HP OEM) */ |
| 223 | { 0x0409, 0xbef4, USBLP_QUIRK_BIDIR }, /* NEC Picty760 (HP OEM) */ | 224 | { 0x0409, 0xbef4, USBLP_QUIRK_BIDIR }, /* NEC Picty760 (HP OEM) */ |
| @@ -254,9 +255,8 @@ static int usblp_ctrl_msg(struct usblp *usblp, int request, int type, int dir, i | |||
| 254 | /* High byte has the interface index. | 255 | /* High byte has the interface index. |
| 255 | Low byte has the alternate setting. | 256 | Low byte has the alternate setting. |
| 256 | */ | 257 | */ |
| 257 | if ((request == USBLP_REQ_GET_ID) && (type == USB_TYPE_CLASS)) { | 258 | if ((request == USBLP_REQ_GET_ID) && (type == USB_TYPE_CLASS)) |
| 258 | index = (usblp->ifnum<<8)|usblp->protocol[usblp->current_protocol].alt_setting; | 259 | index = (usblp->ifnum<<8)|usblp->protocol[usblp->current_protocol].alt_setting; |
| 259 | } | ||
| 260 | 260 | ||
| 261 | retval = usb_control_msg(usblp->dev, | 261 | retval = usb_control_msg(usblp->dev, |
| 262 | dir ? usb_rcvctrlpipe(usblp->dev, 0) : usb_sndctrlpipe(usblp->dev, 0), | 262 | dir ? usb_rcvctrlpipe(usblp->dev, 0) : usb_sndctrlpipe(usblp->dev, 0), |
| @@ -372,7 +372,7 @@ static int usblp_check_status(struct usblp *usblp, int err) | |||
| 372 | return newerr; | 372 | return newerr; |
| 373 | } | 373 | } |
| 374 | 374 | ||
| 375 | static int handle_bidir (struct usblp *usblp) | 375 | static int handle_bidir(struct usblp *usblp) |
| 376 | { | 376 | { |
| 377 | if (usblp->bidir && usblp->used) { | 377 | if (usblp->bidir && usblp->used) { |
| 378 | if (usblp_submit_read(usblp) < 0) | 378 | if (usblp_submit_read(usblp) < 0) |
| @@ -395,14 +395,13 @@ static int usblp_open(struct inode *inode, struct file *file) | |||
| 395 | if (minor < 0) | 395 | if (minor < 0) |
| 396 | return -ENODEV; | 396 | return -ENODEV; |
| 397 | 397 | ||
| 398 | mutex_lock (&usblp_mutex); | 398 | mutex_lock(&usblp_mutex); |
| 399 | 399 | ||
| 400 | retval = -ENODEV; | 400 | retval = -ENODEV; |
| 401 | intf = usb_find_interface(&usblp_driver, minor); | 401 | intf = usb_find_interface(&usblp_driver, minor); |
| 402 | if (!intf) { | 402 | if (!intf) |
| 403 | goto out; | 403 | goto out; |
| 404 | } | 404 | usblp = usb_get_intfdata(intf); |
| 405 | usblp = usb_get_intfdata (intf); | ||
| 406 | if (!usblp || !usblp->dev || !usblp->present) | 405 | if (!usblp || !usblp->dev || !usblp->present) |
| 407 | goto out; | 406 | goto out; |
| 408 | 407 | ||
| @@ -433,18 +432,18 @@ static int usblp_open(struct inode *inode, struct file *file) | |||
| 433 | retval = -EIO; | 432 | retval = -EIO; |
| 434 | } | 433 | } |
| 435 | out: | 434 | out: |
| 436 | mutex_unlock (&usblp_mutex); | 435 | mutex_unlock(&usblp_mutex); |
| 437 | return retval; | 436 | return retval; |
| 438 | } | 437 | } |
| 439 | 438 | ||
| 440 | static void usblp_cleanup (struct usblp *usblp) | 439 | static void usblp_cleanup(struct usblp *usblp) |
| 441 | { | 440 | { |
| 442 | printk(KERN_INFO "usblp%d: removed\n", usblp->minor); | 441 | printk(KERN_INFO "usblp%d: removed\n", usblp->minor); |
| 443 | 442 | ||
| 444 | kfree(usblp->readbuf); | 443 | kfree(usblp->readbuf); |
| 445 | kfree (usblp->device_id_string); | 444 | kfree(usblp->device_id_string); |
| 446 | kfree (usblp->statusbuf); | 445 | kfree(usblp->statusbuf); |
| 447 | kfree (usblp); | 446 | kfree(usblp); |
| 448 | } | 447 | } |
| 449 | 448 | ||
| 450 | static void usblp_unlink_urbs(struct usblp *usblp) | 449 | static void usblp_unlink_urbs(struct usblp *usblp) |
| @@ -458,14 +457,14 @@ static int usblp_release(struct inode *inode, struct file *file) | |||
| 458 | 457 | ||
| 459 | usblp->flags &= ~LP_ABORT; | 458 | usblp->flags &= ~LP_ABORT; |
| 460 | 459 | ||
| 461 | mutex_lock (&usblp_mutex); | 460 | mutex_lock(&usblp_mutex); |
| 462 | usblp->used = 0; | 461 | usblp->used = 0; |
| 463 | if (usblp->present) { | 462 | if (usblp->present) { |
| 464 | usblp_unlink_urbs(usblp); | 463 | usblp_unlink_urbs(usblp); |
| 465 | usb_autopm_put_interface(usblp->intf); | 464 | usb_autopm_put_interface(usblp->intf); |
| 466 | } else /* finish cleanup from disconnect */ | 465 | } else /* finish cleanup from disconnect */ |
| 467 | usblp_cleanup (usblp); | 466 | usblp_cleanup(usblp); |
| 468 | mutex_unlock (&usblp_mutex); | 467 | mutex_unlock(&usblp_mutex); |
| 469 | return 0; | 468 | return 0; |
| 470 | } | 469 | } |
| 471 | 470 | ||
| @@ -495,190 +494,190 @@ static long usblp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 495 | int twoints[2]; | 494 | int twoints[2]; |
| 496 | int retval = 0; | 495 | int retval = 0; |
| 497 | 496 | ||
| 498 | mutex_lock (&usblp->mut); | 497 | mutex_lock(&usblp->mut); |
| 499 | if (!usblp->present) { | 498 | if (!usblp->present) { |
| 500 | retval = -ENODEV; | 499 | retval = -ENODEV; |
| 501 | goto done; | 500 | goto done; |
| 502 | } | 501 | } |
| 503 | 502 | ||
| 504 | dbg("usblp_ioctl: cmd=0x%x (%c nr=%d len=%d dir=%d)", cmd, _IOC_TYPE(cmd), | 503 | dbg("usblp_ioctl: cmd=0x%x (%c nr=%d len=%d dir=%d)", cmd, _IOC_TYPE(cmd), |
| 505 | _IOC_NR(cmd), _IOC_SIZE(cmd), _IOC_DIR(cmd) ); | 504 | _IOC_NR(cmd), _IOC_SIZE(cmd), _IOC_DIR(cmd)); |
| 506 | 505 | ||
| 507 | if (_IOC_TYPE(cmd) == 'P') /* new-style ioctl number */ | 506 | if (_IOC_TYPE(cmd) == 'P') /* new-style ioctl number */ |
| 508 | 507 | ||
| 509 | switch (_IOC_NR(cmd)) { | 508 | switch (_IOC_NR(cmd)) { |
| 510 | 509 | ||
| 511 | case IOCNR_GET_DEVICE_ID: /* get the DEVICE_ID string */ | 510 | case IOCNR_GET_DEVICE_ID: /* get the DEVICE_ID string */ |
| 512 | if (_IOC_DIR(cmd) != _IOC_READ) { | 511 | if (_IOC_DIR(cmd) != _IOC_READ) { |
| 513 | retval = -EINVAL; | 512 | retval = -EINVAL; |
| 514 | goto done; | 513 | goto done; |
| 515 | } | 514 | } |
| 516 | 515 | ||
| 517 | length = usblp_cache_device_id_string(usblp); | 516 | length = usblp_cache_device_id_string(usblp); |
| 518 | if (length < 0) { | 517 | if (length < 0) { |
| 519 | retval = length; | 518 | retval = length; |
| 520 | goto done; | 519 | goto done; |
| 521 | } | 520 | } |
| 522 | if (length > _IOC_SIZE(cmd)) | 521 | if (length > _IOC_SIZE(cmd)) |
| 523 | length = _IOC_SIZE(cmd); /* truncate */ | 522 | length = _IOC_SIZE(cmd); /* truncate */ |
| 524 | 523 | ||
| 525 | if (copy_to_user((void __user *) arg, | 524 | if (copy_to_user((void __user *) arg, |
| 526 | usblp->device_id_string, | 525 | usblp->device_id_string, |
| 527 | (unsigned long) length)) { | 526 | (unsigned long) length)) { |
| 528 | retval = -EFAULT; | 527 | retval = -EFAULT; |
| 529 | goto done; | 528 | goto done; |
| 530 | } | 529 | } |
| 531 | 530 | ||
| 532 | break; | 531 | break; |
| 533 | 532 | ||
| 534 | case IOCNR_GET_PROTOCOLS: | 533 | case IOCNR_GET_PROTOCOLS: |
| 535 | if (_IOC_DIR(cmd) != _IOC_READ || | 534 | if (_IOC_DIR(cmd) != _IOC_READ || |
| 536 | _IOC_SIZE(cmd) < sizeof(twoints)) { | 535 | _IOC_SIZE(cmd) < sizeof(twoints)) { |
| 537 | retval = -EINVAL; | 536 | retval = -EINVAL; |
| 538 | goto done; | 537 | goto done; |
| 539 | } | 538 | } |
| 540 | 539 | ||
| 541 | twoints[0] = usblp->current_protocol; | 540 | twoints[0] = usblp->current_protocol; |
| 542 | twoints[1] = 0; | 541 | twoints[1] = 0; |
| 543 | for (i = USBLP_FIRST_PROTOCOL; | 542 | for (i = USBLP_FIRST_PROTOCOL; |
| 544 | i <= USBLP_LAST_PROTOCOL; i++) { | 543 | i <= USBLP_LAST_PROTOCOL; i++) { |
| 545 | if (usblp->protocol[i].alt_setting >= 0) | 544 | if (usblp->protocol[i].alt_setting >= 0) |
| 546 | twoints[1] |= (1<<i); | 545 | twoints[1] |= (1<<i); |
| 547 | } | 546 | } |
| 548 | 547 | ||
| 549 | if (copy_to_user((void __user *)arg, | 548 | if (copy_to_user((void __user *)arg, |
| 550 | (unsigned char *)twoints, | 549 | (unsigned char *)twoints, |
| 551 | sizeof(twoints))) { | 550 | sizeof(twoints))) { |
| 552 | retval = -EFAULT; | 551 | retval = -EFAULT; |
| 553 | goto done; | 552 | goto done; |
| 554 | } | 553 | } |
| 555 | 554 | ||
| 556 | break; | 555 | break; |
| 557 | 556 | ||
| 558 | case IOCNR_SET_PROTOCOL: | 557 | case IOCNR_SET_PROTOCOL: |
| 559 | if (_IOC_DIR(cmd) != _IOC_WRITE) { | 558 | if (_IOC_DIR(cmd) != _IOC_WRITE) { |
| 560 | retval = -EINVAL; | 559 | retval = -EINVAL; |
| 561 | goto done; | 560 | goto done; |
| 562 | } | 561 | } |
| 563 | 562 | ||
| 564 | #ifdef DEBUG | 563 | #ifdef DEBUG |
| 565 | if (arg == -10) { | 564 | if (arg == -10) { |
| 566 | usblp_dump(usblp); | 565 | usblp_dump(usblp); |
| 567 | break; | 566 | break; |
| 568 | } | 567 | } |
| 569 | #endif | 568 | #endif |
| 570 | 569 | ||
| 571 | usblp_unlink_urbs(usblp); | 570 | usblp_unlink_urbs(usblp); |
| 572 | retval = usblp_set_protocol(usblp, arg); | 571 | retval = usblp_set_protocol(usblp, arg); |
| 573 | if (retval < 0) { | 572 | if (retval < 0) { |
| 574 | usblp_set_protocol(usblp, | 573 | usblp_set_protocol(usblp, |
| 575 | usblp->current_protocol); | 574 | usblp->current_protocol); |
| 576 | } | 575 | } |
| 577 | break; | 576 | break; |
| 578 | 577 | ||
| 579 | case IOCNR_HP_SET_CHANNEL: | 578 | case IOCNR_HP_SET_CHANNEL: |
| 580 | if (_IOC_DIR(cmd) != _IOC_WRITE || | 579 | if (_IOC_DIR(cmd) != _IOC_WRITE || |
| 581 | le16_to_cpu(usblp->dev->descriptor.idVendor) != 0x03F0 || | 580 | le16_to_cpu(usblp->dev->descriptor.idVendor) != 0x03F0 || |
| 582 | usblp->quirks & USBLP_QUIRK_BIDIR) { | 581 | usblp->quirks & USBLP_QUIRK_BIDIR) { |
| 583 | retval = -EINVAL; | 582 | retval = -EINVAL; |
| 584 | goto done; | 583 | goto done; |
| 585 | } | 584 | } |
| 586 | 585 | ||
| 587 | err = usblp_hp_channel_change_request(usblp, | 586 | err = usblp_hp_channel_change_request(usblp, |
| 588 | arg, &newChannel); | 587 | arg, &newChannel); |
| 589 | if (err < 0) { | 588 | if (err < 0) { |
| 590 | dev_err(&usblp->dev->dev, | 589 | dev_err(&usblp->dev->dev, |
| 591 | "usblp%d: error = %d setting " | 590 | "usblp%d: error = %d setting " |
| 592 | "HP channel\n", | 591 | "HP channel\n", |
| 593 | usblp->minor, err); | 592 | usblp->minor, err); |
| 594 | retval = -EIO; | 593 | retval = -EIO; |
| 595 | goto done; | 594 | goto done; |
| 596 | } | 595 | } |
| 597 | 596 | ||
| 598 | dbg("usblp%d requested/got HP channel %ld/%d", | 597 | dbg("usblp%d requested/got HP channel %ld/%d", |
| 599 | usblp->minor, arg, newChannel); | 598 | usblp->minor, arg, newChannel); |
| 600 | break; | 599 | break; |
| 601 | 600 | ||
| 602 | case IOCNR_GET_BUS_ADDRESS: | 601 | case IOCNR_GET_BUS_ADDRESS: |
| 603 | if (_IOC_DIR(cmd) != _IOC_READ || | 602 | if (_IOC_DIR(cmd) != _IOC_READ || |
| 604 | _IOC_SIZE(cmd) < sizeof(twoints)) { | 603 | _IOC_SIZE(cmd) < sizeof(twoints)) { |
| 605 | retval = -EINVAL; | 604 | retval = -EINVAL; |
| 606 | goto done; | 605 | goto done; |
| 607 | } | 606 | } |
| 608 | 607 | ||
| 609 | twoints[0] = usblp->dev->bus->busnum; | 608 | twoints[0] = usblp->dev->bus->busnum; |
| 610 | twoints[1] = usblp->dev->devnum; | 609 | twoints[1] = usblp->dev->devnum; |
| 611 | if (copy_to_user((void __user *)arg, | 610 | if (copy_to_user((void __user *)arg, |
| 612 | (unsigned char *)twoints, | 611 | (unsigned char *)twoints, |
| 613 | sizeof(twoints))) { | 612 | sizeof(twoints))) { |
| 614 | retval = -EFAULT; | 613 | retval = -EFAULT; |
| 615 | goto done; | 614 | goto done; |
| 616 | } | 615 | } |
| 617 | 616 | ||
| 618 | dbg("usblp%d is bus=%d, device=%d", | 617 | dbg("usblp%d is bus=%d, device=%d", |
| 619 | usblp->minor, twoints[0], twoints[1]); | 618 | usblp->minor, twoints[0], twoints[1]); |
| 620 | break; | 619 | break; |
| 621 | 620 | ||
| 622 | case IOCNR_GET_VID_PID: | 621 | case IOCNR_GET_VID_PID: |
| 623 | if (_IOC_DIR(cmd) != _IOC_READ || | 622 | if (_IOC_DIR(cmd) != _IOC_READ || |
| 624 | _IOC_SIZE(cmd) < sizeof(twoints)) { | 623 | _IOC_SIZE(cmd) < sizeof(twoints)) { |
| 625 | retval = -EINVAL; | 624 | retval = -EINVAL; |
| 626 | goto done; | 625 | goto done; |
| 627 | } | 626 | } |
| 628 | 627 | ||
| 629 | twoints[0] = le16_to_cpu(usblp->dev->descriptor.idVendor); | 628 | twoints[0] = le16_to_cpu(usblp->dev->descriptor.idVendor); |
| 630 | twoints[1] = le16_to_cpu(usblp->dev->descriptor.idProduct); | 629 | twoints[1] = le16_to_cpu(usblp->dev->descriptor.idProduct); |
| 631 | if (copy_to_user((void __user *)arg, | 630 | if (copy_to_user((void __user *)arg, |
| 632 | (unsigned char *)twoints, | 631 | (unsigned char *)twoints, |
| 633 | sizeof(twoints))) { | 632 | sizeof(twoints))) { |
| 634 | retval = -EFAULT; | 633 | retval = -EFAULT; |
| 635 | goto done; | 634 | goto done; |
| 636 | } | 635 | } |
| 637 | 636 | ||
| 638 | dbg("usblp%d is VID=0x%4.4X, PID=0x%4.4X", | 637 | dbg("usblp%d is VID=0x%4.4X, PID=0x%4.4X", |
| 639 | usblp->minor, twoints[0], twoints[1]); | 638 | usblp->minor, twoints[0], twoints[1]); |
| 640 | break; | 639 | break; |
| 641 | 640 | ||
| 642 | case IOCNR_SOFT_RESET: | 641 | case IOCNR_SOFT_RESET: |
| 643 | if (_IOC_DIR(cmd) != _IOC_NONE) { | 642 | if (_IOC_DIR(cmd) != _IOC_NONE) { |
| 644 | retval = -EINVAL; | 643 | retval = -EINVAL; |
| 645 | goto done; | 644 | goto done; |
| 646 | } | 645 | } |
| 647 | retval = usblp_reset(usblp); | 646 | retval = usblp_reset(usblp); |
| 648 | break; | 647 | break; |
| 649 | default: | 648 | default: |
| 650 | retval = -ENOTTY; | 649 | retval = -ENOTTY; |
| 651 | } | 650 | } |
| 652 | else /* old-style ioctl value */ | 651 | else /* old-style ioctl value */ |
| 653 | switch (cmd) { | 652 | switch (cmd) { |
| 654 | 653 | ||
| 655 | case LPGETSTATUS: | 654 | case LPGETSTATUS: |
| 656 | if ((retval = usblp_read_status(usblp, usblp->statusbuf))) { | 655 | if ((retval = usblp_read_status(usblp, usblp->statusbuf))) { |
| 657 | if (printk_ratelimit()) | 656 | if (printk_ratelimit()) |
| 658 | printk(KERN_ERR "usblp%d:" | 657 | printk(KERN_ERR "usblp%d:" |
| 659 | "failed reading printer status (%d)\n", | 658 | "failed reading printer status (%d)\n", |
| 660 | usblp->minor, retval); | 659 | usblp->minor, retval); |
| 661 | retval = -EIO; | 660 | retval = -EIO; |
| 662 | goto done; | 661 | goto done; |
| 663 | } | 662 | } |
| 664 | status = *usblp->statusbuf; | 663 | status = *usblp->statusbuf; |
| 665 | if (copy_to_user ((void __user *)arg, &status, sizeof(int))) | 664 | if (copy_to_user((void __user *)arg, &status, sizeof(int))) |
| 666 | retval = -EFAULT; | 665 | retval = -EFAULT; |
| 667 | break; | 666 | break; |
| 668 | 667 | ||
| 669 | case LPABORT: | 668 | case LPABORT: |
| 670 | if (arg) | 669 | if (arg) |
| 671 | usblp->flags |= LP_ABORT; | 670 | usblp->flags |= LP_ABORT; |
| 672 | else | 671 | else |
| 673 | usblp->flags &= ~LP_ABORT; | 672 | usblp->flags &= ~LP_ABORT; |
| 674 | break; | 673 | break; |
| 675 | 674 | ||
| 676 | default: | 675 | default: |
| 677 | retval = -ENOTTY; | 676 | retval = -ENOTTY; |
| 678 | } | 677 | } |
| 679 | 678 | ||
| 680 | done: | 679 | done: |
| 681 | mutex_unlock (&usblp->mut); | 680 | mutex_unlock(&usblp->mut); |
| 682 | return retval; | 681 | return retval; |
| 683 | } | 682 | } |
| 684 | 683 | ||
| @@ -840,7 +839,7 @@ static ssize_t usblp_read(struct file *file, char __user *buffer, size_t len, lo | |||
| 840 | } | 839 | } |
| 841 | 840 | ||
| 842 | done: | 841 | done: |
| 843 | mutex_unlock (&usblp->mut); | 842 | mutex_unlock(&usblp->mut); |
| 844 | return count; | 843 | return count; |
| 845 | } | 844 | } |
| 846 | 845 | ||
| @@ -1023,7 +1022,7 @@ raise_urb: | |||
| 1023 | * while you are sending print data, and you don't try to query the | 1022 | * while you are sending print data, and you don't try to query the |
| 1024 | * printer status every couple of milliseconds, you will probably be OK. | 1023 | * printer status every couple of milliseconds, you will probably be OK. |
| 1025 | */ | 1024 | */ |
| 1026 | static unsigned int usblp_quirks (__u16 vendor, __u16 product) | 1025 | static unsigned int usblp_quirks(__u16 vendor, __u16 product) |
| 1027 | { | 1026 | { |
| 1028 | int i; | 1027 | int i; |
| 1029 | 1028 | ||
| @@ -1031,7 +1030,7 @@ static unsigned int usblp_quirks (__u16 vendor, __u16 product) | |||
| 1031 | if (vendor == quirk_printers[i].vendorId && | 1030 | if (vendor == quirk_printers[i].vendorId && |
| 1032 | product == quirk_printers[i].productId) | 1031 | product == quirk_printers[i].productId) |
| 1033 | return quirk_printers[i].quirks; | 1032 | return quirk_printers[i].quirks; |
| 1034 | } | 1033 | } |
| 1035 | return 0; | 1034 | return 0; |
| 1036 | } | 1035 | } |
| 1037 | 1036 | ||
| @@ -1061,7 +1060,7 @@ static struct usb_class_driver usblp_class = { | |||
| 1061 | static ssize_t usblp_show_ieee1284_id(struct device *dev, struct device_attribute *attr, char *buf) | 1060 | static ssize_t usblp_show_ieee1284_id(struct device *dev, struct device_attribute *attr, char *buf) |
| 1062 | { | 1061 | { |
| 1063 | struct usb_interface *intf = to_usb_interface(dev); | 1062 | struct usb_interface *intf = to_usb_interface(dev); |
| 1064 | struct usblp *usblp = usb_get_intfdata (intf); | 1063 | struct usblp *usblp = usb_get_intfdata(intf); |
| 1065 | 1064 | ||
| 1066 | if (usblp->device_id_string[0] == 0 && | 1065 | if (usblp->device_id_string[0] == 0 && |
| 1067 | usblp->device_id_string[1] == 0) | 1066 | usblp->device_id_string[1] == 0) |
| @@ -1075,7 +1074,7 @@ static DEVICE_ATTR(ieee1284_id, S_IRUGO, usblp_show_ieee1284_id, NULL); | |||
| 1075 | static int usblp_probe(struct usb_interface *intf, | 1074 | static int usblp_probe(struct usb_interface *intf, |
| 1076 | const struct usb_device_id *id) | 1075 | const struct usb_device_id *id) |
| 1077 | { | 1076 | { |
| 1078 | struct usb_device *dev = interface_to_usbdev (intf); | 1077 | struct usb_device *dev = interface_to_usbdev(intf); |
| 1079 | struct usblp *usblp; | 1078 | struct usblp *usblp; |
| 1080 | int protocol; | 1079 | int protocol; |
| 1081 | int retval; | 1080 | int retval; |
| @@ -1089,7 +1088,7 @@ static int usblp_probe(struct usb_interface *intf, | |||
| 1089 | } | 1088 | } |
| 1090 | usblp->dev = dev; | 1089 | usblp->dev = dev; |
| 1091 | mutex_init(&usblp->wmut); | 1090 | mutex_init(&usblp->wmut); |
| 1092 | mutex_init (&usblp->mut); | 1091 | mutex_init(&usblp->mut); |
| 1093 | spin_lock_init(&usblp->lock); | 1092 | spin_lock_init(&usblp->lock); |
| 1094 | init_waitqueue_head(&usblp->rwait); | 1093 | init_waitqueue_head(&usblp->rwait); |
| 1095 | init_waitqueue_head(&usblp->wwait); | 1094 | init_waitqueue_head(&usblp->wwait); |
| @@ -1153,7 +1152,7 @@ static int usblp_probe(struct usb_interface *intf, | |||
| 1153 | usblp_check_status(usblp, 0); | 1152 | usblp_check_status(usblp, 0); |
| 1154 | #endif | 1153 | #endif |
| 1155 | 1154 | ||
| 1156 | usb_set_intfdata (intf, usblp); | 1155 | usb_set_intfdata(intf, usblp); |
| 1157 | 1156 | ||
| 1158 | usblp->present = 1; | 1157 | usblp->present = 1; |
| 1159 | 1158 | ||
| @@ -1177,7 +1176,7 @@ static int usblp_probe(struct usb_interface *intf, | |||
| 1177 | return 0; | 1176 | return 0; |
| 1178 | 1177 | ||
| 1179 | abort_intfdata: | 1178 | abort_intfdata: |
| 1180 | usb_set_intfdata (intf, NULL); | 1179 | usb_set_intfdata(intf, NULL); |
| 1181 | device_remove_file(&intf->dev, &dev_attr_ieee1284_id); | 1180 | device_remove_file(&intf->dev, &dev_attr_ieee1284_id); |
| 1182 | abort: | 1181 | abort: |
| 1183 | kfree(usblp->readbuf); | 1182 | kfree(usblp->readbuf); |
| @@ -1340,35 +1339,35 @@ static int usblp_cache_device_id_string(struct usblp *usblp) | |||
| 1340 | 1339 | ||
| 1341 | static void usblp_disconnect(struct usb_interface *intf) | 1340 | static void usblp_disconnect(struct usb_interface *intf) |
| 1342 | { | 1341 | { |
| 1343 | struct usblp *usblp = usb_get_intfdata (intf); | 1342 | struct usblp *usblp = usb_get_intfdata(intf); |
| 1344 | 1343 | ||
| 1345 | usb_deregister_dev(intf, &usblp_class); | 1344 | usb_deregister_dev(intf, &usblp_class); |
| 1346 | 1345 | ||
| 1347 | if (!usblp || !usblp->dev) { | 1346 | if (!usblp || !usblp->dev) { |
| 1348 | dev_err(&intf->dev, "bogus disconnect\n"); | 1347 | dev_err(&intf->dev, "bogus disconnect\n"); |
| 1349 | BUG (); | 1348 | BUG(); |
| 1350 | } | 1349 | } |
| 1351 | 1350 | ||
| 1352 | device_remove_file(&intf->dev, &dev_attr_ieee1284_id); | 1351 | device_remove_file(&intf->dev, &dev_attr_ieee1284_id); |
| 1353 | 1352 | ||
| 1354 | mutex_lock (&usblp_mutex); | 1353 | mutex_lock(&usblp_mutex); |
| 1355 | mutex_lock (&usblp->mut); | 1354 | mutex_lock(&usblp->mut); |
| 1356 | usblp->present = 0; | 1355 | usblp->present = 0; |
| 1357 | wake_up(&usblp->wwait); | 1356 | wake_up(&usblp->wwait); |
| 1358 | wake_up(&usblp->rwait); | 1357 | wake_up(&usblp->rwait); |
| 1359 | usb_set_intfdata (intf, NULL); | 1358 | usb_set_intfdata(intf, NULL); |
| 1360 | 1359 | ||
| 1361 | usblp_unlink_urbs(usblp); | 1360 | usblp_unlink_urbs(usblp); |
| 1362 | mutex_unlock (&usblp->mut); | 1361 | mutex_unlock(&usblp->mut); |
| 1363 | 1362 | ||
| 1364 | if (!usblp->used) | 1363 | if (!usblp->used) |
| 1365 | usblp_cleanup (usblp); | 1364 | usblp_cleanup(usblp); |
| 1366 | mutex_unlock (&usblp_mutex); | 1365 | mutex_unlock(&usblp_mutex); |
| 1367 | } | 1366 | } |
| 1368 | 1367 | ||
| 1369 | static int usblp_suspend(struct usb_interface *intf, pm_message_t message) | 1368 | static int usblp_suspend(struct usb_interface *intf, pm_message_t message) |
| 1370 | { | 1369 | { |
| 1371 | struct usblp *usblp = usb_get_intfdata (intf); | 1370 | struct usblp *usblp = usb_get_intfdata(intf); |
| 1372 | 1371 | ||
| 1373 | usblp_unlink_urbs(usblp); | 1372 | usblp_unlink_urbs(usblp); |
| 1374 | #if 0 /* XXX Do we want this? What if someone is reading, should we fail? */ | 1373 | #if 0 /* XXX Do we want this? What if someone is reading, should we fail? */ |
| @@ -1382,10 +1381,10 @@ static int usblp_suspend(struct usb_interface *intf, pm_message_t message) | |||
| 1382 | 1381 | ||
| 1383 | static int usblp_resume(struct usb_interface *intf) | 1382 | static int usblp_resume(struct usb_interface *intf) |
| 1384 | { | 1383 | { |
| 1385 | struct usblp *usblp = usb_get_intfdata (intf); | 1384 | struct usblp *usblp = usb_get_intfdata(intf); |
| 1386 | int r; | 1385 | int r; |
| 1387 | 1386 | ||
| 1388 | r = handle_bidir (usblp); | 1387 | r = handle_bidir(usblp); |
| 1389 | 1388 | ||
| 1390 | return r; | 1389 | return r; |
| 1391 | } | 1390 | } |
| @@ -1401,7 +1400,7 @@ static const struct usb_device_id usblp_ids[] = { | |||
| 1401 | { } /* Terminating entry */ | 1400 | { } /* Terminating entry */ |
| 1402 | }; | 1401 | }; |
| 1403 | 1402 | ||
| 1404 | MODULE_DEVICE_TABLE (usb, usblp_ids); | 1403 | MODULE_DEVICE_TABLE(usb, usblp_ids); |
| 1405 | 1404 | ||
| 1406 | static struct usb_driver usblp_driver = { | 1405 | static struct usb_driver usblp_driver = { |
| 1407 | .name = "usblp", | 1406 | .name = "usblp", |
| @@ -1426,8 +1425,8 @@ static void __exit usblp_exit(void) | |||
| 1426 | module_init(usblp_init); | 1425 | module_init(usblp_init); |
| 1427 | module_exit(usblp_exit); | 1426 | module_exit(usblp_exit); |
| 1428 | 1427 | ||
| 1429 | MODULE_AUTHOR( DRIVER_AUTHOR ); | 1428 | MODULE_AUTHOR(DRIVER_AUTHOR); |
| 1430 | MODULE_DESCRIPTION( DRIVER_DESC ); | 1429 | MODULE_DESCRIPTION(DRIVER_DESC); |
| 1431 | module_param(proto_bias, int, S_IRUGO | S_IWUSR); | 1430 | module_param(proto_bias, int, S_IRUGO | S_IWUSR); |
| 1432 | MODULE_PARM_DESC(proto_bias, "Favourite protocol number"); | 1431 | MODULE_PARM_DESC(proto_bias, "Favourite protocol number"); |
| 1433 | MODULE_LICENSE("GPL"); | 1432 | MODULE_LICENSE("GPL"); |
