Lines Matching refs:ps
84 struct usb_dev_state *ps; member
154 static int connected(struct usb_dev_state *ps) in connected() argument
156 return (!list_empty(&ps->list) && in connected()
157 ps->dev->state != USB_STATE_NOTATTACHED); in connected()
187 struct usb_dev_state *ps = file->private_data; in usbdev_read() local
188 struct usb_device *dev = ps->dev; in usbdev_read()
196 if (!connected(ps)) { in usbdev_read()
310 struct usb_dev_state *ps = as->ps; in async_newpending() local
313 spin_lock_irqsave(&ps->lock, flags); in async_newpending()
314 list_add_tail(&as->asynclist, &ps->async_pending); in async_newpending()
315 spin_unlock_irqrestore(&ps->lock, flags); in async_newpending()
320 struct usb_dev_state *ps = as->ps; in async_removepending() local
323 spin_lock_irqsave(&ps->lock, flags); in async_removepending()
325 spin_unlock_irqrestore(&ps->lock, flags); in async_removepending()
328 static struct async *async_getcompleted(struct usb_dev_state *ps) in async_getcompleted() argument
333 spin_lock_irqsave(&ps->lock, flags); in async_getcompleted()
334 if (!list_empty(&ps->async_completed)) { in async_getcompleted()
335 as = list_entry(ps->async_completed.next, struct async, in async_getcompleted()
339 spin_unlock_irqrestore(&ps->lock, flags); in async_getcompleted()
343 static struct async *async_getpending(struct usb_dev_state *ps, in async_getpending() argument
348 list_for_each_entry(as, &ps->async_pending, asynclist) in async_getpending()
451 static void cancel_bulk_urbs(struct usb_dev_state *ps, unsigned bulk_addr) in cancel_bulk_urbs() argument
452 __releases(ps->lock) in cancel_bulk_urbs()
453 __acquires(ps->lock) in cancel_bulk_urbs()
463 list_for_each_entry(as, &ps->async_pending, asynclist) { in cancel_bulk_urbs()
471 ps->disabled_bulk_eps |= (1 << bulk_addr); in cancel_bulk_urbs()
475 list_for_each_entry(as, &ps->async_pending, asynclist) { in cancel_bulk_urbs()
480 spin_unlock(&ps->lock); /* Allow completions */ in cancel_bulk_urbs()
483 spin_lock(&ps->lock); in cancel_bulk_urbs()
492 struct usb_dev_state *ps = as->ps; in async_completed() local
499 spin_lock(&ps->lock); in async_completed()
500 list_move_tail(&as->asynclist, &ps->async_completed); in async_completed()
521 cancel_bulk_urbs(ps, as->bulk_addr); in async_completed()
522 spin_unlock(&ps->lock); in async_completed()
530 wake_up(&ps->wait); in async_completed()
533 static void destroy_async(struct usb_dev_state *ps, struct list_head *list) in destroy_async() argument
539 spin_lock_irqsave(&ps->lock, flags); in destroy_async()
547 spin_unlock_irqrestore(&ps->lock, flags); in destroy_async()
550 spin_lock_irqsave(&ps->lock, flags); in destroy_async()
552 spin_unlock_irqrestore(&ps->lock, flags); in destroy_async()
555 static void destroy_async_on_interface(struct usb_dev_state *ps, in destroy_async_on_interface() argument
562 spin_lock_irqsave(&ps->lock, flags); in destroy_async_on_interface()
563 list_for_each_safe(p, q, &ps->async_pending) in destroy_async_on_interface()
566 spin_unlock_irqrestore(&ps->lock, flags); in destroy_async_on_interface()
567 destroy_async(ps, &hitlist); in destroy_async_on_interface()
570 static void destroy_all_async(struct usb_dev_state *ps) in destroy_all_async() argument
572 destroy_async(ps, &ps->async_pending); in destroy_all_async()
589 struct usb_dev_state *ps = usb_get_intfdata(intf); in driver_disconnect() local
592 if (!ps) in driver_disconnect()
599 if (likely(ifnum < 8*sizeof(ps->ifclaimed))) in driver_disconnect()
600 clear_bit(ifnum, &ps->ifclaimed); in driver_disconnect()
608 destroy_async_on_interface(ps, ifnum); in driver_disconnect()
632 static int claimintf(struct usb_dev_state *ps, unsigned int ifnum) in claimintf() argument
634 struct usb_device *dev = ps->dev; in claimintf()
638 if (ifnum >= 8*sizeof(ps->ifclaimed)) in claimintf()
641 if (test_bit(ifnum, &ps->ifclaimed)) in claimintf()
648 err = usb_driver_claim_interface(&usbfs_driver, intf, ps); in claimintf()
650 set_bit(ifnum, &ps->ifclaimed); in claimintf()
654 static int releaseintf(struct usb_dev_state *ps, unsigned int ifnum) in releaseintf() argument
661 if (ifnum >= 8*sizeof(ps->ifclaimed)) in releaseintf()
663 dev = ps->dev; in releaseintf()
667 else if (test_and_clear_bit(ifnum, &ps->ifclaimed)) { in releaseintf()
674 static int checkintf(struct usb_dev_state *ps, unsigned int ifnum) in checkintf() argument
676 if (ps->dev->state != USB_STATE_CONFIGURED) in checkintf()
678 if (ifnum >= 8*sizeof(ps->ifclaimed)) in checkintf()
680 if (test_bit(ifnum, &ps->ifclaimed)) in checkintf()
683 dev_warn(&ps->dev->dev, "usbfs: process %d (%s) did not claim " in checkintf()
686 return claimintf(ps, ifnum); in checkintf()
714 static int check_ctrlrecip(struct usb_dev_state *ps, unsigned int requesttype, in check_ctrlrecip() argument
720 if (ps->dev->state != USB_STATE_UNAUTHENTICATED in check_ctrlrecip()
721 && ps->dev->state != USB_STATE_ADDRESS in check_ctrlrecip()
722 && ps->dev->state != USB_STATE_CONFIGURED) in check_ctrlrecip()
733 alt_setting = usb_find_alt_setting(ps->dev->actconfig, in check_ctrlrecip()
745 ret = findintfep(ps->dev, index); in check_ctrlrecip()
755 ret = findintfep(ps->dev, index ^ 0x80); in check_ctrlrecip()
757 dev_info(&ps->dev->dev, in check_ctrlrecip()
763 ret = checkintf(ps, ret); in check_ctrlrecip()
767 ret = checkintf(ps, index); in check_ctrlrecip()
782 static int parse_usbdevfs_streams(struct usb_dev_state *ps, in parse_usbdevfs_streams() argument
815 eps[i] = ep_to_host_endpoint(ps->dev, ep); in parse_usbdevfs_streams()
822 ifnum = findintfep(ps->dev, ep); in parse_usbdevfs_streams()
829 ret = checkintf(ps, ifnum); in parse_usbdevfs_streams()
832 intf = usb_ifnum_to_if(ps->dev, ifnum); in parse_usbdevfs_streams()
877 struct usb_dev_state *ps; in usbdev_open() local
881 ps = kmalloc(sizeof(struct usb_dev_state), GFP_KERNEL); in usbdev_open()
882 if (!ps) in usbdev_open()
907 ps->dev = dev; in usbdev_open()
908 ps->file = file; in usbdev_open()
909 spin_lock_init(&ps->lock); in usbdev_open()
910 INIT_LIST_HEAD(&ps->list); in usbdev_open()
911 INIT_LIST_HEAD(&ps->async_pending); in usbdev_open()
912 INIT_LIST_HEAD(&ps->async_completed); in usbdev_open()
913 init_waitqueue_head(&ps->wait); in usbdev_open()
914 ps->discsignr = 0; in usbdev_open()
915 ps->disc_pid = get_pid(task_pid(current)); in usbdev_open()
916 ps->cred = get_current_cred(); in usbdev_open()
917 ps->disccontext = NULL; in usbdev_open()
918 ps->ifclaimed = 0; in usbdev_open()
919 security_task_getsecid(current, &ps->secid); in usbdev_open()
921 list_add_tail(&ps->list, &dev->filelist); in usbdev_open()
922 file->private_data = ps; in usbdev_open()
932 kfree(ps); in usbdev_open()
938 struct usb_dev_state *ps = file->private_data; in usbdev_release() local
939 struct usb_device *dev = ps->dev; in usbdev_release()
944 usb_hub_release_all_ports(dev, ps); in usbdev_release()
946 list_del_init(&ps->list); in usbdev_release()
948 for (ifnum = 0; ps->ifclaimed && ifnum < 8*sizeof(ps->ifclaimed); in usbdev_release()
950 if (test_bit(ifnum, &ps->ifclaimed)) in usbdev_release()
951 releaseintf(ps, ifnum); in usbdev_release()
953 destroy_all_async(ps); in usbdev_release()
957 put_pid(ps->disc_pid); in usbdev_release()
958 put_cred(ps->cred); in usbdev_release()
960 as = async_getcompleted(ps); in usbdev_release()
963 as = async_getcompleted(ps); in usbdev_release()
965 kfree(ps); in usbdev_release()
969 static int proc_control(struct usb_dev_state *ps, void __user *arg) in proc_control() argument
971 struct usb_device *dev = ps->dev; in proc_control()
980 ret = check_ctrlrecip(ps, ctrl.bRequestType, ctrl.bRequest, in proc_control()
1056 static int proc_bulk(struct usb_dev_state *ps, void __user *arg) in proc_bulk() argument
1058 struct usb_device *dev = ps->dev; in proc_bulk()
1067 ret = findintfep(ps->dev, bulk.ep); in proc_bulk()
1070 ret = checkintf(ps, ret); in proc_bulk()
1144 static int proc_resetep(struct usb_dev_state *ps, void __user *arg) in proc_resetep() argument
1151 ret = findintfep(ps->dev, ep); in proc_resetep()
1154 ret = checkintf(ps, ret); in proc_resetep()
1157 check_reset_of_active_ep(ps->dev, ep, "RESETEP"); in proc_resetep()
1158 usb_reset_endpoint(ps->dev, ep); in proc_resetep()
1162 static int proc_clearhalt(struct usb_dev_state *ps, void __user *arg) in proc_clearhalt() argument
1170 ret = findintfep(ps->dev, ep); in proc_clearhalt()
1173 ret = checkintf(ps, ret); in proc_clearhalt()
1176 check_reset_of_active_ep(ps->dev, ep, "CLEAR_HALT"); in proc_clearhalt()
1178 pipe = usb_rcvbulkpipe(ps->dev, ep & 0x7f); in proc_clearhalt()
1180 pipe = usb_sndbulkpipe(ps->dev, ep & 0x7f); in proc_clearhalt()
1182 return usb_clear_halt(ps->dev, pipe); in proc_clearhalt()
1185 static int proc_getdriver(struct usb_dev_state *ps, void __user *arg) in proc_getdriver() argument
1193 intf = usb_ifnum_to_if(ps->dev, gd.interface); in proc_getdriver()
1204 static int proc_connectinfo(struct usb_dev_state *ps, void __user *arg) in proc_connectinfo() argument
1207 .devnum = ps->dev->devnum, in proc_connectinfo()
1208 .slow = ps->dev->speed == USB_SPEED_LOW in proc_connectinfo()
1216 static int proc_resetdevice(struct usb_dev_state *ps) in proc_resetdevice() argument
1218 return usb_reset_device(ps->dev); in proc_resetdevice()
1221 static int proc_setintf(struct usb_dev_state *ps, void __user *arg) in proc_setintf() argument
1228 ret = checkintf(ps, setintf.interface); in proc_setintf()
1232 destroy_async_on_interface(ps, setintf.interface); in proc_setintf()
1234 return usb_set_interface(ps->dev, setintf.interface, in proc_setintf()
1238 static int proc_setconfig(struct usb_dev_state *ps, void __user *arg) in proc_setconfig() argument
1247 actconfig = ps->dev->actconfig; in proc_setconfig()
1258 dev_warn(&ps->dev->dev, in proc_setconfig()
1278 status = usb_reset_configuration(ps->dev); in proc_setconfig()
1280 status = usb_set_configuration(ps->dev, u); in proc_setconfig()
1286 static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb, in proc_do_submiturb() argument
1311 ifnum = findintfep(ps->dev, uurb->endpoint); in proc_do_submiturb()
1314 ret = checkintf(ps, ifnum); in proc_do_submiturb()
1318 ep = ep_to_host_endpoint(ps->dev, uurb->endpoint); in proc_do_submiturb()
1342 ret = check_ctrlrecip(ps, dr->bRequestType, dr->bRequest, in proc_do_submiturb()
1355 snoop(&ps->dev->dev, "control urb: bRequestType=%02x " in proc_do_submiturb()
1376 if (num_sgs == 1 || num_sgs > ps->dev->bus->sg_tablesize) in proc_do_submiturb()
1504 as->urb->dev = ps->dev; in proc_do_submiturb()
1506 __create_pipe(ps->dev, uurb->endpoint & 0xf) | in proc_do_submiturb()
1533 ps->dev->speed == USB_SPEED_HIGH) in proc_do_submiturb()
1546 as->ps = ps; in proc_do_submiturb()
1557 snoop_urb(ps->dev, as->userurb, as->urb->pipe, in proc_do_submiturb()
1566 spin_lock_irq(&ps->lock); in proc_do_submiturb()
1582 ps->disabled_bulk_eps &= ~(1 << as->bulk_addr); in proc_do_submiturb()
1587 if (ps->disabled_bulk_eps & (1 << as->bulk_addr)) in proc_do_submiturb()
1591 spin_unlock_irq(&ps->lock); in proc_do_submiturb()
1597 dev_printk(KERN_DEBUG, &ps->dev->dev, in proc_do_submiturb()
1599 snoop_urb(ps->dev, as->userurb, as->urb->pipe, in proc_do_submiturb()
1614 static int proc_submiturb(struct usb_dev_state *ps, void __user *arg) in proc_submiturb() argument
1621 return proc_do_submiturb(ps, &uurb, in proc_submiturb()
1626 static int proc_unlinkurb(struct usb_dev_state *ps, void __user *arg) in proc_unlinkurb() argument
1632 spin_lock_irqsave(&ps->lock, flags); in proc_unlinkurb()
1633 as = async_getpending(ps, arg); in proc_unlinkurb()
1635 spin_unlock_irqrestore(&ps->lock, flags); in proc_unlinkurb()
1641 spin_unlock_irqrestore(&ps->lock, flags); in proc_unlinkurb()
1686 static struct async *reap_as(struct usb_dev_state *ps) in reap_as() argument
1690 struct usb_device *dev = ps->dev; in reap_as()
1692 add_wait_queue(&ps->wait, &wait); in reap_as()
1695 as = async_getcompleted(ps); in reap_as()
1696 if (as || !connected(ps)) in reap_as()
1704 remove_wait_queue(&ps->wait, &wait); in reap_as()
1709 static int proc_reapurb(struct usb_dev_state *ps, void __user *arg) in proc_reapurb() argument
1711 struct async *as = reap_as(ps); in proc_reapurb()
1722 static int proc_reapurbnonblock(struct usb_dev_state *ps, void __user *arg) in proc_reapurbnonblock() argument
1727 as = async_getcompleted(ps); in proc_reapurbnonblock()
1732 retval = (connected(ps) ? -EAGAIN : -ENODEV); in proc_reapurbnonblock()
1738 static int proc_control_compat(struct usb_dev_state *ps, in proc_control_compat() argument
1748 return proc_control(ps, p); in proc_control_compat()
1751 static int proc_bulk_compat(struct usb_dev_state *ps, in proc_bulk_compat() argument
1766 return proc_bulk(ps, p); in proc_bulk_compat()
1768 static int proc_disconnectsignal_compat(struct usb_dev_state *ps, void __user *arg) in proc_disconnectsignal_compat() argument
1774 ps->discsignr = ds.signr; in proc_disconnectsignal_compat()
1775 ps->disccontext = compat_ptr(ds.context); in proc_disconnectsignal_compat()
1806 static int proc_submiturb_compat(struct usb_dev_state *ps, void __user *arg) in proc_submiturb_compat() argument
1813 return proc_do_submiturb(ps, &uurb, in proc_submiturb_compat()
1852 static int proc_reapurb_compat(struct usb_dev_state *ps, void __user *arg) in proc_reapurb_compat() argument
1854 struct async *as = reap_as(ps); in proc_reapurb_compat()
1865 static int proc_reapurbnonblock_compat(struct usb_dev_state *ps, void __user *arg) in proc_reapurbnonblock_compat() argument
1870 as = async_getcompleted(ps); in proc_reapurbnonblock_compat()
1875 retval = (connected(ps) ? -EAGAIN : -ENODEV); in proc_reapurbnonblock_compat()
1883 static int proc_disconnectsignal(struct usb_dev_state *ps, void __user *arg) in proc_disconnectsignal() argument
1889 ps->discsignr = ds.signr; in proc_disconnectsignal()
1890 ps->disccontext = ds.context; in proc_disconnectsignal()
1894 static int proc_claiminterface(struct usb_dev_state *ps, void __user *arg) in proc_claiminterface() argument
1900 return claimintf(ps, ifnum); in proc_claiminterface()
1903 static int proc_releaseinterface(struct usb_dev_state *ps, void __user *arg) in proc_releaseinterface() argument
1910 ret = releaseintf(ps, ifnum); in proc_releaseinterface()
1913 destroy_async_on_interface (ps, ifnum); in proc_releaseinterface()
1917 static int proc_ioctl(struct usb_dev_state *ps, struct usbdevfs_ioctl *ctl) in proc_ioctl() argument
1941 if (!connected(ps)) { in proc_ioctl()
1946 if (ps->dev->state != USB_STATE_CONFIGURED) in proc_ioctl()
1948 else if (!(intf = usb_ifnum_to_if(ps->dev, ctl->ifno))) in proc_ioctl()
1994 static int proc_ioctl_default(struct usb_dev_state *ps, void __user *arg) in proc_ioctl_default() argument
2000 return proc_ioctl(ps, &ctrl); in proc_ioctl_default()
2004 static int proc_ioctl_compat(struct usb_dev_state *ps, compat_uptr_t arg) in proc_ioctl_compat() argument
2018 return proc_ioctl(ps, &ctrl); in proc_ioctl_compat()
2022 static int proc_claim_port(struct usb_dev_state *ps, void __user *arg) in proc_claim_port() argument
2029 rc = usb_hub_claim_port(ps->dev, portnum, ps); in proc_claim_port()
2031 snoop(&ps->dev->dev, "port %d claimed by process %d: %s\n", in proc_claim_port()
2036 static int proc_release_port(struct usb_dev_state *ps, void __user *arg) in proc_release_port() argument
2042 return usb_hub_release_port(ps->dev, portnum, ps); in proc_release_port()
2045 static int proc_get_capabilities(struct usb_dev_state *ps, void __user *arg) in proc_get_capabilities() argument
2051 if (!ps->dev->bus->no_stop_on_short) in proc_get_capabilities()
2053 if (ps->dev->bus->sg_tablesize) in proc_get_capabilities()
2062 static int proc_disconnect_claim(struct usb_dev_state *ps, void __user *arg) in proc_disconnect_claim() argument
2070 intf = usb_ifnum_to_if(ps->dev, dc.interface); in proc_disconnect_claim()
2091 return claimintf(ps, dc.interface); in proc_disconnect_claim()
2094 static int proc_alloc_streams(struct usb_dev_state *ps, void __user *arg) in proc_alloc_streams() argument
2101 r = parse_usbdevfs_streams(ps, arg, &num_streams, &num_eps, in proc_alloc_streams()
2106 destroy_async_on_interface(ps, in proc_alloc_streams()
2114 static int proc_free_streams(struct usb_dev_state *ps, void __user *arg) in proc_free_streams() argument
2121 r = parse_usbdevfs_streams(ps, arg, NULL, &num_eps, &eps, &intf); in proc_free_streams()
2125 destroy_async_on_interface(ps, in proc_free_streams()
2141 struct usb_dev_state *ps = file->private_data; in usbdev_do_ioctl() local
2143 struct usb_device *dev = ps->dev; in usbdev_do_ioctl()
2155 ret = proc_reapurb(ps, p); in usbdev_do_ioctl()
2160 ret = proc_reapurbnonblock(ps, p); in usbdev_do_ioctl()
2166 ret = proc_reapurb_compat(ps, p); in usbdev_do_ioctl()
2171 ret = proc_reapurbnonblock_compat(ps, p); in usbdev_do_ioctl()
2176 if (!connected(ps)) { in usbdev_do_ioctl()
2184 ret = proc_control(ps, p); in usbdev_do_ioctl()
2191 ret = proc_bulk(ps, p); in usbdev_do_ioctl()
2198 ret = proc_resetep(ps, p); in usbdev_do_ioctl()
2205 ret = proc_resetdevice(ps); in usbdev_do_ioctl()
2210 ret = proc_clearhalt(ps, p); in usbdev_do_ioctl()
2217 ret = proc_getdriver(ps, p); in usbdev_do_ioctl()
2222 ret = proc_connectinfo(ps, p); in usbdev_do_ioctl()
2227 ret = proc_setintf(ps, p); in usbdev_do_ioctl()
2232 ret = proc_setconfig(ps, p); in usbdev_do_ioctl()
2237 ret = proc_submiturb(ps, p); in usbdev_do_ioctl()
2245 ret = proc_control_compat(ps, p); in usbdev_do_ioctl()
2252 ret = proc_bulk_compat(ps, p); in usbdev_do_ioctl()
2259 ret = proc_disconnectsignal_compat(ps, p); in usbdev_do_ioctl()
2264 ret = proc_submiturb_compat(ps, p); in usbdev_do_ioctl()
2271 ret = proc_ioctl_compat(ps, ptr_to_compat(p)); in usbdev_do_ioctl()
2277 ret = proc_unlinkurb(ps, p); in usbdev_do_ioctl()
2282 ret = proc_disconnectsignal(ps, p); in usbdev_do_ioctl()
2287 ret = proc_claiminterface(ps, p); in usbdev_do_ioctl()
2292 ret = proc_releaseinterface(ps, p); in usbdev_do_ioctl()
2297 ret = proc_ioctl_default(ps, p); in usbdev_do_ioctl()
2302 ret = proc_claim_port(ps, p); in usbdev_do_ioctl()
2307 ret = proc_release_port(ps, p); in usbdev_do_ioctl()
2310 ret = proc_get_capabilities(ps, p); in usbdev_do_ioctl()
2313 ret = proc_disconnect_claim(ps, p); in usbdev_do_ioctl()
2316 ret = proc_alloc_streams(ps, p); in usbdev_do_ioctl()
2319 ret = proc_free_streams(ps, p); in usbdev_do_ioctl()
2356 struct usb_dev_state *ps = file->private_data; in usbdev_poll() local
2359 poll_wait(file, &ps->wait, wait); in usbdev_poll()
2360 if (file->f_mode & FMODE_WRITE && !list_empty(&ps->async_completed)) in usbdev_poll()
2362 if (!connected(ps)) in usbdev_poll()
2382 struct usb_dev_state *ps; in usbdev_remove() local
2386 ps = list_entry(udev->filelist.next, struct usb_dev_state, list); in usbdev_remove()
2387 destroy_all_async(ps); in usbdev_remove()
2388 wake_up_all(&ps->wait); in usbdev_remove()
2389 list_del_init(&ps->list); in usbdev_remove()
2390 if (ps->discsignr) { in usbdev_remove()
2392 sinfo.si_signo = ps->discsignr; in usbdev_remove()
2395 sinfo.si_addr = ps->disccontext; in usbdev_remove()
2396 kill_pid_info_as_cred(ps->discsignr, &sinfo, in usbdev_remove()
2397 ps->disc_pid, ps->cred, ps->secid); in usbdev_remove()