Lines Matching full:ps

58 /* Mutual exclusion for ps->list in resume vs. release and remove */
91 struct usb_dev_state *ps; member
96 struct usb_dev_state *ps; member
180 static int connected(struct usb_dev_state *ps) in connected() argument
182 return (!list_empty(&ps->list) && in connected()
183 ps->dev->state != USB_STATE_NOTATTACHED); in connected()
188 struct usb_dev_state *ps = usbm->ps; in dec_usb_memory_use_count() local
189 struct usb_hcd *hcd = bus_to_hcd(ps->dev->bus); in dec_usb_memory_use_count()
192 spin_lock_irqsave(&ps->lock, flags); in dec_usb_memory_use_count()
196 spin_unlock_irqrestore(&ps->lock, flags); in dec_usb_memory_use_count()
204 spin_unlock_irqrestore(&ps->lock, flags); in dec_usb_memory_use_count()
213 spin_lock_irqsave(&usbm->ps->lock, flags); in usbdev_vm_open()
215 spin_unlock_irqrestore(&usbm->ps->lock, flags); in usbdev_vm_open()
233 struct usb_dev_state *ps = file->private_data; in usbdev_mmap() local
234 struct usb_hcd *hcd = bus_to_hcd(ps->dev->bus); in usbdev_mmap()
266 usbm->ps = ps; in usbdev_mmap()
297 spin_lock_irqsave(&ps->lock, flags); in usbdev_mmap()
298 list_add_tail(&usbm->memlist, &ps->memory_list); in usbdev_mmap()
299 spin_unlock_irqrestore(&ps->lock, flags); in usbdev_mmap()
314 struct usb_dev_state *ps = file->private_data; in usbdev_read() local
315 struct usb_device *dev = ps->dev; in usbdev_read()
323 if (!connected(ps)) { in usbdev_read()
442 struct usb_dev_state *ps = as->ps; in async_newpending() local
445 spin_lock_irqsave(&ps->lock, flags); in async_newpending()
446 list_add_tail(&as->asynclist, &ps->async_pending); in async_newpending()
447 spin_unlock_irqrestore(&ps->lock, flags); in async_newpending()
452 struct usb_dev_state *ps = as->ps; in async_removepending() local
455 spin_lock_irqsave(&ps->lock, flags); in async_removepending()
457 spin_unlock_irqrestore(&ps->lock, flags); in async_removepending()
460 static struct async *async_getcompleted(struct usb_dev_state *ps) in async_getcompleted() argument
465 spin_lock_irqsave(&ps->lock, flags); in async_getcompleted()
466 if (!list_empty(&ps->async_completed)) { in async_getcompleted()
467 as = list_entry(ps->async_completed.next, struct async, in async_getcompleted()
471 spin_unlock_irqrestore(&ps->lock, flags); in async_getcompleted()
475 static struct async *async_getpending(struct usb_dev_state *ps, in async_getpending() argument
480 list_for_each_entry(as, &ps->async_pending, asynclist) in async_getpending()
585 static void cancel_bulk_urbs(struct usb_dev_state *ps, unsigned bulk_addr) in cancel_bulk_urbs() argument
586 __releases(ps->lock) in cancel_bulk_urbs()
587 __acquires(ps->lock) in cancel_bulk_urbs()
597 list_for_each_entry(as, &ps->async_pending, asynclist) { in cancel_bulk_urbs()
605 ps->disabled_bulk_eps |= (1 << bulk_addr); in cancel_bulk_urbs()
609 list_for_each_entry_reverse(as, &ps->async_pending, asynclist) { in cancel_bulk_urbs()
614 spin_unlock(&ps->lock); /* Allow completions */ in cancel_bulk_urbs()
617 spin_lock(&ps->lock); in cancel_bulk_urbs()
626 struct usb_dev_state *ps = as->ps; in async_completed() local
633 spin_lock_irqsave(&ps->lock, flags); in async_completed()
634 list_move_tail(&as->asynclist, &ps->async_completed); in async_completed()
651 cancel_bulk_urbs(ps, as->bulk_addr); in async_completed()
653 wake_up(&ps->wait); in async_completed()
654 spin_unlock_irqrestore(&ps->lock, flags); in async_completed()
663 static void destroy_async(struct usb_dev_state *ps, struct list_head *list) in destroy_async() argument
669 spin_lock_irqsave(&ps->lock, flags); in destroy_async()
677 spin_unlock_irqrestore(&ps->lock, flags); in destroy_async()
680 spin_lock_irqsave(&ps->lock, flags); in destroy_async()
682 spin_unlock_irqrestore(&ps->lock, flags); in destroy_async()
685 static void destroy_async_on_interface(struct usb_dev_state *ps, in destroy_async_on_interface() argument
692 spin_lock_irqsave(&ps->lock, flags); in destroy_async_on_interface()
693 list_for_each_safe(p, q, &ps->async_pending) in destroy_async_on_interface()
696 spin_unlock_irqrestore(&ps->lock, flags); in destroy_async_on_interface()
697 destroy_async(ps, &hitlist); in destroy_async_on_interface()
700 static void destroy_all_async(struct usb_dev_state *ps) in destroy_all_async() argument
702 destroy_async(ps, &ps->async_pending); in destroy_all_async()
719 struct usb_dev_state *ps = usb_get_intfdata(intf); in driver_disconnect() local
722 if (!ps) in driver_disconnect()
729 if (likely(ifnum < 8*sizeof(ps->ifclaimed))) in driver_disconnect()
730 clear_bit(ifnum, &ps->ifclaimed); in driver_disconnect()
738 destroy_async_on_interface(ps, ifnum); in driver_disconnect()
761 struct usb_dev_state *ps; in usbfs_notify_resume() local
765 list_for_each_entry(ps, &udev->filelist, list) { in usbfs_notify_resume()
766 WRITE_ONCE(ps->not_yet_resumed, 0); in usbfs_notify_resume()
767 wake_up_all(&ps->wait_for_resume); in usbfs_notify_resume()
782 static int claimintf(struct usb_dev_state *ps, unsigned int ifnum) in claimintf() argument
784 struct usb_device *dev = ps->dev; in claimintf()
788 if (ifnum >= 8*sizeof(ps->ifclaimed)) in claimintf()
791 if (test_bit(ifnum, &ps->ifclaimed)) in claimintf()
794 if (ps->privileges_dropped && in claimintf()
795 !test_bit(ifnum, &ps->interface_allowed_mask)) in claimintf()
807 err = usb_driver_claim_interface(&usbfs_driver, intf, ps); in claimintf()
811 set_bit(ifnum, &ps->ifclaimed); in claimintf()
815 static int releaseintf(struct usb_dev_state *ps, unsigned int ifnum) in releaseintf() argument
822 if (ifnum >= 8*sizeof(ps->ifclaimed)) in releaseintf()
824 dev = ps->dev; in releaseintf()
828 else if (test_and_clear_bit(ifnum, &ps->ifclaimed)) { in releaseintf()
841 static int checkintf(struct usb_dev_state *ps, unsigned int ifnum) in checkintf() argument
843 if (ps->dev->state != USB_STATE_CONFIGURED) in checkintf()
845 if (ifnum >= 8*sizeof(ps->ifclaimed)) in checkintf()
847 if (test_bit(ifnum, &ps->ifclaimed)) in checkintf()
850 dev_warn(&ps->dev->dev, "usbfs: process %d (%s) did not claim " in checkintf()
853 return claimintf(ps, ifnum); in checkintf()
881 static int check_ctrlrecip(struct usb_dev_state *ps, unsigned int requesttype, in check_ctrlrecip() argument
887 if (ps->dev->state != USB_STATE_UNAUTHENTICATED in check_ctrlrecip()
888 && ps->dev->state != USB_STATE_ADDRESS in check_ctrlrecip()
889 && ps->dev->state != USB_STATE_CONFIGURED) in check_ctrlrecip()
900 alt_setting = usb_find_alt_setting(ps->dev->actconfig, in check_ctrlrecip()
912 ret = findintfep(ps->dev, index); in check_ctrlrecip()
922 ret = findintfep(ps->dev, index ^ 0x80); in check_ctrlrecip()
924 dev_info(&ps->dev->dev, in check_ctrlrecip()
930 ret = checkintf(ps, ret); in check_ctrlrecip()
934 ret = checkintf(ps, index); in check_ctrlrecip()
949 static int parse_usbdevfs_streams(struct usb_dev_state *ps, in parse_usbdevfs_streams() argument
982 eps[i] = ep_to_host_endpoint(ps->dev, ep); in parse_usbdevfs_streams()
989 ifnum = findintfep(ps->dev, ep); in parse_usbdevfs_streams()
996 ret = checkintf(ps, ifnum); in parse_usbdevfs_streams()
999 intf = usb_ifnum_to_if(ps->dev, ifnum); in parse_usbdevfs_streams()
1038 struct usb_dev_state *ps; in usbdev_open() local
1042 ps = kzalloc(sizeof(struct usb_dev_state), GFP_KERNEL); in usbdev_open()
1043 if (!ps) in usbdev_open()
1062 ps->dev = dev; in usbdev_open()
1063 ps->file = file; in usbdev_open()
1064 ps->interface_allowed_mask = 0xFFFFFFFF; /* 32 bits */ in usbdev_open()
1065 spin_lock_init(&ps->lock); in usbdev_open()
1066 INIT_LIST_HEAD(&ps->list); in usbdev_open()
1067 INIT_LIST_HEAD(&ps->async_pending); in usbdev_open()
1068 INIT_LIST_HEAD(&ps->async_completed); in usbdev_open()
1069 INIT_LIST_HEAD(&ps->memory_list); in usbdev_open()
1070 init_waitqueue_head(&ps->wait); in usbdev_open()
1071 init_waitqueue_head(&ps->wait_for_resume); in usbdev_open()
1072 ps->disc_pid = get_pid(task_pid(current)); in usbdev_open()
1073 ps->cred = get_current_cred(); in usbdev_open()
1077 list_add_tail(&ps->list, &dev->filelist); in usbdev_open()
1078 file->private_data = ps; in usbdev_open()
1088 kfree(ps); in usbdev_open()
1094 struct usb_dev_state *ps = file->private_data; in usbdev_release() local
1095 struct usb_device *dev = ps->dev; in usbdev_release()
1100 usb_hub_release_all_ports(dev, ps); in usbdev_release()
1104 list_del_init(&ps->list); in usbdev_release()
1107 for (ifnum = 0; ps->ifclaimed && ifnum < 8*sizeof(ps->ifclaimed); in usbdev_release()
1109 if (test_bit(ifnum, &ps->ifclaimed)) in usbdev_release()
1110 releaseintf(ps, ifnum); in usbdev_release()
1112 destroy_all_async(ps); in usbdev_release()
1113 if (!ps->suspend_allowed) in usbdev_release()
1117 put_pid(ps->disc_pid); in usbdev_release()
1118 put_cred(ps->cred); in usbdev_release()
1120 as = async_getcompleted(ps); in usbdev_release()
1123 as = async_getcompleted(ps); in usbdev_release()
1126 kfree(ps); in usbdev_release()
1169 static int do_proc_control(struct usb_dev_state *ps, in do_proc_control() argument
1172 struct usb_device *dev = ps->dev; in do_proc_control()
1180 ret = check_ctrlrecip(ps, ctrl->bRequestType, ctrl->bRequest, in do_proc_control()
1274 static int proc_control(struct usb_dev_state *ps, void __user *arg) in proc_control() argument
1280 return do_proc_control(ps, &ctrl); in proc_control()
1283 static int do_proc_bulk(struct usb_dev_state *ps, in do_proc_bulk() argument
1286 struct usb_device *dev = ps->dev; in do_proc_bulk()
1293 ret = findintfep(ps->dev, bulk->ep); in do_proc_bulk()
1296 ret = checkintf(ps, ret); in do_proc_bulk()
1373 static int proc_bulk(struct usb_dev_state *ps, void __user *arg) in proc_bulk() argument
1379 return do_proc_bulk(ps, &bulk); in proc_bulk()
1396 static int proc_resetep(struct usb_dev_state *ps, void __user *arg) in proc_resetep() argument
1403 ret = findintfep(ps->dev, ep); in proc_resetep()
1406 ret = checkintf(ps, ret); in proc_resetep()
1409 check_reset_of_active_ep(ps->dev, ep, "RESETEP"); in proc_resetep()
1410 usb_reset_endpoint(ps->dev, ep); in proc_resetep()
1414 static int proc_clearhalt(struct usb_dev_state *ps, void __user *arg) in proc_clearhalt() argument
1422 ret = findintfep(ps->dev, ep); in proc_clearhalt()
1425 ret = checkintf(ps, ret); in proc_clearhalt()
1428 check_reset_of_active_ep(ps->dev, ep, "CLEAR_HALT"); in proc_clearhalt()
1430 pipe = usb_rcvbulkpipe(ps->dev, ep & 0x7f); in proc_clearhalt()
1432 pipe = usb_sndbulkpipe(ps->dev, ep & 0x7f); in proc_clearhalt()
1434 return usb_clear_halt(ps->dev, pipe); in proc_clearhalt()
1437 static int proc_getdriver(struct usb_dev_state *ps, void __user *arg) in proc_getdriver() argument
1445 intf = usb_ifnum_to_if(ps->dev, gd.interface); in proc_getdriver()
1456 static int proc_connectinfo(struct usb_dev_state *ps, void __user *arg) in proc_connectinfo() argument
1461 ci.devnum = ps->dev->devnum; in proc_connectinfo()
1462 ci.slow = ps->dev->speed == USB_SPEED_LOW; in proc_connectinfo()
1469 static int proc_conninfo_ex(struct usb_dev_state *ps, in proc_conninfo_ex() argument
1473 struct usb_device *udev = ps->dev; in proc_conninfo_ex()
1502 static int proc_resetdevice(struct usb_dev_state *ps) in proc_resetdevice() argument
1504 struct usb_host_config *actconfig = ps->dev->actconfig; in proc_resetdevice()
1512 if (ps->privileges_dropped && actconfig) { in proc_resetdevice()
1517 !test_bit(number, &ps->ifclaimed)) { in proc_resetdevice()
1518 dev_warn(&ps->dev->dev, in proc_resetdevice()
1526 return usb_reset_device(ps->dev); in proc_resetdevice()
1529 static int proc_setintf(struct usb_dev_state *ps, void __user *arg) in proc_setintf() argument
1536 ret = checkintf(ps, setintf.interface); in proc_setintf()
1540 destroy_async_on_interface(ps, setintf.interface); in proc_setintf()
1542 return usb_set_interface(ps->dev, setintf.interface, in proc_setintf()
1546 static int proc_setconfig(struct usb_dev_state *ps, void __user *arg) in proc_setconfig() argument
1555 actconfig = ps->dev->actconfig; in proc_setconfig()
1566 dev_warn(&ps->dev->dev, in proc_setconfig()
1586 status = usb_reset_configuration(ps->dev); in proc_setconfig()
1588 status = usb_set_configuration(ps->dev, u); in proc_setconfig()
1595 find_memory_area(struct usb_dev_state *ps, const struct usbdevfs_urb *uurb) in find_memory_area() argument
1601 spin_lock_irqsave(&ps->lock, flags); in find_memory_area()
1602 list_for_each_entry(iter, &ps->memory_list, memlist) { in find_memory_area()
1615 spin_unlock_irqrestore(&ps->lock, flags); in find_memory_area()
1619 static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb, in proc_do_submiturb() argument
1653 ifnum = findintfep(ps->dev, uurb->endpoint); in proc_do_submiturb()
1656 ret = checkintf(ps, ifnum); in proc_do_submiturb()
1660 ep = ep_to_host_endpoint(ps->dev, uurb->endpoint); in proc_do_submiturb()
1684 ret = check_ctrlrecip(ps, dr->bRequestType, dr->bRequest, in proc_do_submiturb()
1699 snoop(&ps->dev->dev, "control urb: bRequestType=%02x " in proc_do_submiturb()
1724 if (num_sgs == 1 || num_sgs > ps->dev->bus->sg_tablesize) in proc_do_submiturb()
1786 as->usbm = find_memory_area(ps, uurb); in proc_do_submiturb()
1869 as->urb->dev = ps->dev; in proc_do_submiturb()
1871 __create_pipe(ps->dev, uurb->endpoint & 0xf) | in proc_do_submiturb()
1890 dev_warn(&ps->dev->dev, "Requested nonsensical USBDEVFS_URB_SHORT_NOT_OK.\n"); in proc_do_submiturb()
1892 dev_warn(&ps->dev->dev, "Requested nonsensical USBDEVFS_URB_ZERO_PACKET.\n"); in proc_do_submiturb()
1903 ps->dev->speed == USB_SPEED_HIGH || in proc_do_submiturb()
1904 ps->dev->speed >= USB_SPEED_SUPER) in proc_do_submiturb()
1920 as->ps = ps; in proc_do_submiturb()
1935 snoop_urb(ps->dev, as->userurb, as->urb->pipe, in proc_do_submiturb()
1944 spin_lock_irq(&ps->lock); in proc_do_submiturb()
1960 ps->disabled_bulk_eps &= ~(1 << as->bulk_addr); in proc_do_submiturb()
1965 if (ps->disabled_bulk_eps & (1 << as->bulk_addr)) in proc_do_submiturb()
1969 spin_unlock_irq(&ps->lock); in proc_do_submiturb()
1975 dev_printk(KERN_DEBUG, &ps->dev->dev, in proc_do_submiturb()
1977 snoop_urb(ps->dev, as->userurb, as->urb->pipe, in proc_do_submiturb()
1992 static int proc_submiturb(struct usb_dev_state *ps, void __user *arg) in proc_submiturb() argument
2003 return proc_do_submiturb(ps, &uurb, in proc_submiturb()
2008 static int proc_unlinkurb(struct usb_dev_state *ps, void __user *arg) in proc_unlinkurb() argument
2014 spin_lock_irqsave(&ps->lock, flags); in proc_unlinkurb()
2015 as = async_getpending(ps, arg); in proc_unlinkurb()
2017 spin_unlock_irqrestore(&ps->lock, flags); in proc_unlinkurb()
2023 spin_unlock_irqrestore(&ps->lock, flags); in proc_unlinkurb()
2081 static struct async *reap_as(struct usb_dev_state *ps) in reap_as() argument
2085 struct usb_device *dev = ps->dev; in reap_as()
2087 add_wait_queue(&ps->wait, &wait); in reap_as()
2090 as = async_getcompleted(ps); in reap_as()
2091 if (as || !connected(ps)) in reap_as()
2099 remove_wait_queue(&ps->wait, &wait); in reap_as()
2104 static int proc_reapurb(struct usb_dev_state *ps, void __user *arg) in proc_reapurb() argument
2106 struct async *as = reap_as(ps); in proc_reapurb()
2111 snoop(&ps->dev->dev, "reap %px\n", as->userurb); in proc_reapurb()
2121 static int proc_reapurbnonblock(struct usb_dev_state *ps, void __user *arg) in proc_reapurbnonblock() argument
2126 as = async_getcompleted(ps); in proc_reapurbnonblock()
2128 snoop(&ps->dev->dev, "reap %px\n", as->userurb); in proc_reapurbnonblock()
2132 retval = (connected(ps) ? -EAGAIN : -ENODEV); in proc_reapurbnonblock()
2138 static int proc_control_compat(struct usb_dev_state *ps, in proc_control_compat() argument
2148 return do_proc_control(ps, &ctrl); in proc_control_compat()
2151 static int proc_bulk_compat(struct usb_dev_state *ps, in proc_bulk_compat() argument
2163 return do_proc_bulk(ps, &bulk); in proc_bulk_compat()
2166 static int proc_disconnectsignal_compat(struct usb_dev_state *ps, void __user *arg) in proc_disconnectsignal_compat() argument
2172 ps->discsignr = ds.signr; in proc_disconnectsignal_compat()
2173 ps->disccontext.sival_int = ds.context; in proc_disconnectsignal_compat()
2198 static int proc_submiturb_compat(struct usb_dev_state *ps, void __user *arg) in proc_submiturb_compat() argument
2209 return proc_do_submiturb(ps, &uurb, in proc_submiturb_compat()
2249 static int proc_reapurb_compat(struct usb_dev_state *ps, void __user *arg) in proc_reapurb_compat() argument
2251 struct async *as = reap_as(ps); in proc_reapurb_compat()
2256 snoop(&ps->dev->dev, "reap %px\n", as->userurb); in proc_reapurb_compat()
2266 static int proc_reapurbnonblock_compat(struct usb_dev_state *ps, void __user *arg) in proc_reapurbnonblock_compat() argument
2271 as = async_getcompleted(ps); in proc_reapurbnonblock_compat()
2273 snoop(&ps->dev->dev, "reap %px\n", as->userurb); in proc_reapurbnonblock_compat()
2277 retval = (connected(ps) ? -EAGAIN : -ENODEV); in proc_reapurbnonblock_compat()
2285 static int proc_disconnectsignal(struct usb_dev_state *ps, void __user *arg) in proc_disconnectsignal() argument
2291 ps->discsignr = ds.signr; in proc_disconnectsignal()
2292 ps->disccontext.sival_ptr = ds.context; in proc_disconnectsignal()
2296 static int proc_claiminterface(struct usb_dev_state *ps, void __user *arg) in proc_claiminterface() argument
2302 return claimintf(ps, ifnum); in proc_claiminterface()
2305 static int proc_releaseinterface(struct usb_dev_state *ps, void __user *arg) in proc_releaseinterface() argument
2312 ret = releaseintf(ps, ifnum); in proc_releaseinterface()
2315 destroy_async_on_interface(ps, ifnum); in proc_releaseinterface()
2319 static int proc_ioctl(struct usb_dev_state *ps, struct usbdevfs_ioctl *ctl) in proc_ioctl() argument
2327 if (ps->privileges_dropped) in proc_ioctl()
2330 if (!connected(ps)) in proc_ioctl()
2349 if (ps->dev->state != USB_STATE_CONFIGURED) in proc_ioctl()
2351 else if (!(intf = usb_ifnum_to_if(ps->dev, ctl->ifno))) in proc_ioctl()
2397 static int proc_ioctl_default(struct usb_dev_state *ps, void __user *arg) in proc_ioctl_default() argument
2403 return proc_ioctl(ps, &ctrl); in proc_ioctl_default()
2407 static int proc_ioctl_compat(struct usb_dev_state *ps, compat_uptr_t arg) in proc_ioctl_compat() argument
2417 return proc_ioctl(ps, &ctrl); in proc_ioctl_compat()
2421 static int proc_claim_port(struct usb_dev_state *ps, void __user *arg) in proc_claim_port() argument
2428 rc = usb_hub_claim_port(ps->dev, portnum, ps); in proc_claim_port()
2430 snoop(&ps->dev->dev, "port %d claimed by process %d: %s\n", in proc_claim_port()
2435 static int proc_release_port(struct usb_dev_state *ps, void __user *arg) in proc_release_port() argument
2441 return usb_hub_release_port(ps->dev, portnum, ps); in proc_release_port()
2444 static int proc_get_capabilities(struct usb_dev_state *ps, void __user *arg) in proc_get_capabilities() argument
2452 if (!ps->dev->bus->no_stop_on_short) in proc_get_capabilities()
2454 if (ps->dev->bus->sg_tablesize) in proc_get_capabilities()
2463 static int proc_disconnect_claim(struct usb_dev_state *ps, void __user *arg) in proc_disconnect_claim() argument
2471 intf = usb_ifnum_to_if(ps->dev, dc.interface); in proc_disconnect_claim()
2478 if (ps->privileges_dropped) in proc_disconnect_claim()
2495 return claimintf(ps, dc.interface); in proc_disconnect_claim()
2498 static int proc_alloc_streams(struct usb_dev_state *ps, void __user *arg) in proc_alloc_streams() argument
2505 r = parse_usbdevfs_streams(ps, arg, &num_streams, &num_eps, in proc_alloc_streams()
2510 destroy_async_on_interface(ps, in proc_alloc_streams()
2518 static int proc_free_streams(struct usb_dev_state *ps, void __user *arg) in proc_free_streams() argument
2525 r = parse_usbdevfs_streams(ps, arg, NULL, &num_eps, &eps, &intf); in proc_free_streams()
2529 destroy_async_on_interface(ps, in proc_free_streams()
2537 static int proc_drop_privileges(struct usb_dev_state *ps, void __user *arg) in proc_drop_privileges() argument
2548 ps->interface_allowed_mask &= data; in proc_drop_privileges()
2549 ps->privileges_dropped = true; in proc_drop_privileges()
2554 static int proc_forbid_suspend(struct usb_dev_state *ps) in proc_forbid_suspend() argument
2558 if (ps->suspend_allowed) { in proc_forbid_suspend()
2559 ret = usb_autoresume_device(ps->dev); in proc_forbid_suspend()
2561 ps->suspend_allowed = false; in proc_forbid_suspend()
2568 static int proc_allow_suspend(struct usb_dev_state *ps) in proc_allow_suspend() argument
2570 if (!connected(ps)) in proc_allow_suspend()
2573 WRITE_ONCE(ps->not_yet_resumed, 1); in proc_allow_suspend()
2574 if (!ps->suspend_allowed) { in proc_allow_suspend()
2575 usb_autosuspend_device(ps->dev); in proc_allow_suspend()
2576 ps->suspend_allowed = true; in proc_allow_suspend()
2581 static int proc_wait_for_resume(struct usb_dev_state *ps) in proc_wait_for_resume() argument
2585 usb_unlock_device(ps->dev); in proc_wait_for_resume()
2586 ret = wait_event_interruptible(ps->wait_for_resume, in proc_wait_for_resume()
2587 READ_ONCE(ps->not_yet_resumed) == 0); in proc_wait_for_resume()
2588 usb_lock_device(ps->dev); in proc_wait_for_resume()
2592 return proc_forbid_suspend(ps); in proc_wait_for_resume()
2603 struct usb_dev_state *ps = file->private_data; in usbdev_do_ioctl() local
2605 struct usb_device *dev = ps->dev; in usbdev_do_ioctl()
2617 ret = proc_reapurb(ps, p); in usbdev_do_ioctl()
2622 ret = proc_reapurbnonblock(ps, p); in usbdev_do_ioctl()
2628 ret = proc_reapurb_compat(ps, p); in usbdev_do_ioctl()
2633 ret = proc_reapurbnonblock_compat(ps, p); in usbdev_do_ioctl()
2638 if (!connected(ps)) { in usbdev_do_ioctl()
2646 ret = proc_control(ps, p); in usbdev_do_ioctl()
2654 ret = proc_bulk(ps, p); in usbdev_do_ioctl()
2662 ret = proc_resetep(ps, p); in usbdev_do_ioctl()
2670 ret = proc_resetdevice(ps); in usbdev_do_ioctl()
2675 ret = proc_clearhalt(ps, p); in usbdev_do_ioctl()
2683 ret = proc_getdriver(ps, p); in usbdev_do_ioctl()
2688 ret = proc_connectinfo(ps, p); in usbdev_do_ioctl()
2693 ret = proc_setintf(ps, p); in usbdev_do_ioctl()
2698 ret = proc_setconfig(ps, p); in usbdev_do_ioctl()
2703 ret = proc_submiturb(ps, p); in usbdev_do_ioctl()
2712 ret = proc_control_compat(ps, p); in usbdev_do_ioctl()
2720 ret = proc_bulk_compat(ps, p); in usbdev_do_ioctl()
2728 ret = proc_disconnectsignal_compat(ps, p); in usbdev_do_ioctl()
2733 ret = proc_submiturb_compat(ps, p); in usbdev_do_ioctl()
2741 ret = proc_ioctl_compat(ps, ptr_to_compat(p)); in usbdev_do_ioctl()
2747 ret = proc_unlinkurb(ps, p); in usbdev_do_ioctl()
2752 ret = proc_disconnectsignal(ps, p); in usbdev_do_ioctl()
2757 ret = proc_claiminterface(ps, p); in usbdev_do_ioctl()
2762 ret = proc_releaseinterface(ps, p); in usbdev_do_ioctl()
2767 ret = proc_ioctl_default(ps, p); in usbdev_do_ioctl()
2772 ret = proc_claim_port(ps, p); in usbdev_do_ioctl()
2777 ret = proc_release_port(ps, p); in usbdev_do_ioctl()
2780 ret = proc_get_capabilities(ps, p); in usbdev_do_ioctl()
2783 ret = proc_disconnect_claim(ps, p); in usbdev_do_ioctl()
2786 ret = proc_alloc_streams(ps, p); in usbdev_do_ioctl()
2789 ret = proc_free_streams(ps, p); in usbdev_do_ioctl()
2792 ret = proc_drop_privileges(ps, p); in usbdev_do_ioctl()
2795 ret = ps->dev->speed; in usbdev_do_ioctl()
2798 ret = proc_forbid_suspend(ps); in usbdev_do_ioctl()
2801 ret = proc_allow_suspend(ps); in usbdev_do_ioctl()
2804 ret = proc_wait_for_resume(ps); in usbdev_do_ioctl()
2811 ret = proc_conninfo_ex(ps, p, _IOC_SIZE(cmd)); in usbdev_do_ioctl()
2836 struct usb_dev_state *ps = file->private_data; in usbdev_poll() local
2839 poll_wait(file, &ps->wait, wait); in usbdev_poll()
2840 if (file->f_mode & FMODE_WRITE && !list_empty(&ps->async_completed)) in usbdev_poll()
2842 if (!connected(ps)) in usbdev_poll()
2844 if (list_empty(&ps->list)) in usbdev_poll()
2863 struct usb_dev_state *ps; in usbdev_remove() local
2868 ps = list_entry(udev->filelist.next, struct usb_dev_state, list); in usbdev_remove()
2869 destroy_all_async(ps); in usbdev_remove()
2870 wake_up_all(&ps->wait); in usbdev_remove()
2871 WRITE_ONCE(ps->not_yet_resumed, 0); in usbdev_remove()
2872 wake_up_all(&ps->wait_for_resume); in usbdev_remove()
2873 list_del_init(&ps->list); in usbdev_remove()
2874 if (ps->discsignr) in usbdev_remove()
2875 kill_pid_usb_asyncio(ps->discsignr, EPIPE, ps->disccontext, in usbdev_remove()
2876 ps->disc_pid, ps->cred); in usbdev_remove()