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()
1143 static int proc_resetep(struct usb_dev_state *ps, void __user *arg) in proc_resetep() argument
1150 ret = findintfep(ps->dev, ep); in proc_resetep()
1153 ret = checkintf(ps, ret); in proc_resetep()
1156 check_reset_of_active_ep(ps->dev, ep, "RESETEP"); in proc_resetep()
1157 usb_reset_endpoint(ps->dev, ep); in proc_resetep()
1161 static int proc_clearhalt(struct usb_dev_state *ps, void __user *arg) in proc_clearhalt() argument
1169 ret = findintfep(ps->dev, ep); in proc_clearhalt()
1172 ret = checkintf(ps, ret); in proc_clearhalt()
1175 check_reset_of_active_ep(ps->dev, ep, "CLEAR_HALT"); in proc_clearhalt()
1177 pipe = usb_rcvbulkpipe(ps->dev, ep & 0x7f); in proc_clearhalt()
1179 pipe = usb_sndbulkpipe(ps->dev, ep & 0x7f); in proc_clearhalt()
1181 return usb_clear_halt(ps->dev, pipe); in proc_clearhalt()
1184 static int proc_getdriver(struct usb_dev_state *ps, void __user *arg) in proc_getdriver() argument
1192 intf = usb_ifnum_to_if(ps->dev, gd.interface); in proc_getdriver()
1203 static int proc_connectinfo(struct usb_dev_state *ps, void __user *arg) in proc_connectinfo() argument
1206 .devnum = ps->dev->devnum, in proc_connectinfo()
1207 .slow = ps->dev->speed == USB_SPEED_LOW in proc_connectinfo()
1215 static int proc_resetdevice(struct usb_dev_state *ps) in proc_resetdevice() argument
1217 return usb_reset_device(ps->dev); in proc_resetdevice()
1220 static int proc_setintf(struct usb_dev_state *ps, void __user *arg) in proc_setintf() argument
1227 if ((ret = checkintf(ps, setintf.interface))) in proc_setintf()
1230 destroy_async_on_interface(ps, setintf.interface); in proc_setintf()
1232 return usb_set_interface(ps->dev, setintf.interface, in proc_setintf()
1236 static int proc_setconfig(struct usb_dev_state *ps, void __user *arg) in proc_setconfig() argument
1245 actconfig = ps->dev->actconfig; in proc_setconfig()
1256 dev_warn(&ps->dev->dev, in proc_setconfig()
1276 status = usb_reset_configuration(ps->dev); in proc_setconfig()
1278 status = usb_set_configuration(ps->dev, u); in proc_setconfig()
1284 static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb, in proc_do_submiturb() argument
1309 ifnum = findintfep(ps->dev, uurb->endpoint); in proc_do_submiturb()
1312 ret = checkintf(ps, ifnum); in proc_do_submiturb()
1316 ep = ep_to_host_endpoint(ps->dev, uurb->endpoint); in proc_do_submiturb()
1340 ret = check_ctrlrecip(ps, dr->bRequestType, dr->bRequest, in proc_do_submiturb()
1353 snoop(&ps->dev->dev, "control urb: bRequestType=%02x " in proc_do_submiturb()
1374 if (num_sgs == 1 || num_sgs > ps->dev->bus->sg_tablesize) in proc_do_submiturb()
1501 as->urb->dev = ps->dev; in proc_do_submiturb()
1503 __create_pipe(ps->dev, uurb->endpoint & 0xf) | in proc_do_submiturb()
1530 ps->dev->speed == USB_SPEED_HIGH) in proc_do_submiturb()
1543 as->ps = ps; in proc_do_submiturb()
1554 snoop_urb(ps->dev, as->userurb, as->urb->pipe, in proc_do_submiturb()
1563 spin_lock_irq(&ps->lock); in proc_do_submiturb()
1579 ps->disabled_bulk_eps &= ~(1 << as->bulk_addr); in proc_do_submiturb()
1584 if (ps->disabled_bulk_eps & (1 << as->bulk_addr)) in proc_do_submiturb()
1588 spin_unlock_irq(&ps->lock); in proc_do_submiturb()
1594 dev_printk(KERN_DEBUG, &ps->dev->dev, in proc_do_submiturb()
1596 snoop_urb(ps->dev, as->userurb, as->urb->pipe, in proc_do_submiturb()
1611 static int proc_submiturb(struct usb_dev_state *ps, void __user *arg) in proc_submiturb() argument
1618 return proc_do_submiturb(ps, &uurb, in proc_submiturb()
1623 static int proc_unlinkurb(struct usb_dev_state *ps, void __user *arg) in proc_unlinkurb() argument
1629 spin_lock_irqsave(&ps->lock, flags); in proc_unlinkurb()
1630 as = async_getpending(ps, arg); in proc_unlinkurb()
1632 spin_unlock_irqrestore(&ps->lock, flags); in proc_unlinkurb()
1638 spin_unlock_irqrestore(&ps->lock, flags); in proc_unlinkurb()
1683 static struct async *reap_as(struct usb_dev_state *ps) in reap_as() argument
1687 struct usb_device *dev = ps->dev; in reap_as()
1689 add_wait_queue(&ps->wait, &wait); in reap_as()
1692 as = async_getcompleted(ps); in reap_as()
1693 if (as || !connected(ps)) in reap_as()
1701 remove_wait_queue(&ps->wait, &wait); in reap_as()
1706 static int proc_reapurb(struct usb_dev_state *ps, void __user *arg) in proc_reapurb() argument
1708 struct async *as = reap_as(ps); in proc_reapurb()
1719 static int proc_reapurbnonblock(struct usb_dev_state *ps, void __user *arg) in proc_reapurbnonblock() argument
1724 as = async_getcompleted(ps); in proc_reapurbnonblock()
1729 retval = (connected(ps) ? -EAGAIN : -ENODEV); in proc_reapurbnonblock()
1735 static int proc_control_compat(struct usb_dev_state *ps, in proc_control_compat() argument
1745 return proc_control(ps, p); in proc_control_compat()
1748 static int proc_bulk_compat(struct usb_dev_state *ps, in proc_bulk_compat() argument
1763 return proc_bulk(ps, p); in proc_bulk_compat()
1765 static int proc_disconnectsignal_compat(struct usb_dev_state *ps, void __user *arg) in proc_disconnectsignal_compat() argument
1771 ps->discsignr = ds.signr; in proc_disconnectsignal_compat()
1772 ps->disccontext = compat_ptr(ds.context); in proc_disconnectsignal_compat()
1803 static int proc_submiturb_compat(struct usb_dev_state *ps, void __user *arg) in proc_submiturb_compat() argument
1810 return proc_do_submiturb(ps, &uurb, in proc_submiturb_compat()
1849 static int proc_reapurb_compat(struct usb_dev_state *ps, void __user *arg) in proc_reapurb_compat() argument
1851 struct async *as = reap_as(ps); in proc_reapurb_compat()
1862 static int proc_reapurbnonblock_compat(struct usb_dev_state *ps, void __user *arg) in proc_reapurbnonblock_compat() argument
1867 as = async_getcompleted(ps); in proc_reapurbnonblock_compat()
1872 retval = (connected(ps) ? -EAGAIN : -ENODEV); in proc_reapurbnonblock_compat()
1880 static int proc_disconnectsignal(struct usb_dev_state *ps, void __user *arg) in proc_disconnectsignal() argument
1886 ps->discsignr = ds.signr; in proc_disconnectsignal()
1887 ps->disccontext = ds.context; in proc_disconnectsignal()
1891 static int proc_claiminterface(struct usb_dev_state *ps, void __user *arg) in proc_claiminterface() argument
1897 return claimintf(ps, ifnum); in proc_claiminterface()
1900 static int proc_releaseinterface(struct usb_dev_state *ps, void __user *arg) in proc_releaseinterface() argument
1907 if ((ret = releaseintf(ps, ifnum)) < 0) in proc_releaseinterface()
1909 destroy_async_on_interface (ps, ifnum); in proc_releaseinterface()
1913 static int proc_ioctl(struct usb_dev_state *ps, struct usbdevfs_ioctl *ctl) in proc_ioctl() argument
1936 if (!connected(ps)) { in proc_ioctl()
1941 if (ps->dev->state != USB_STATE_CONFIGURED) in proc_ioctl()
1943 else if (!(intf = usb_ifnum_to_if(ps->dev, ctl->ifno))) in proc_ioctl()
1989 static int proc_ioctl_default(struct usb_dev_state *ps, void __user *arg) in proc_ioctl_default() argument
1995 return proc_ioctl(ps, &ctrl); in proc_ioctl_default()
1999 static int proc_ioctl_compat(struct usb_dev_state *ps, compat_uptr_t arg) in proc_ioctl_compat() argument
2013 return proc_ioctl(ps, &ctrl); in proc_ioctl_compat()
2017 static int proc_claim_port(struct usb_dev_state *ps, void __user *arg) in proc_claim_port() argument
2024 rc = usb_hub_claim_port(ps->dev, portnum, ps); in proc_claim_port()
2026 snoop(&ps->dev->dev, "port %d claimed by process %d: %s\n", in proc_claim_port()
2031 static int proc_release_port(struct usb_dev_state *ps, void __user *arg) in proc_release_port() argument
2037 return usb_hub_release_port(ps->dev, portnum, ps); in proc_release_port()
2040 static int proc_get_capabilities(struct usb_dev_state *ps, void __user *arg) in proc_get_capabilities() argument
2046 if (!ps->dev->bus->no_stop_on_short) in proc_get_capabilities()
2048 if (ps->dev->bus->sg_tablesize) in proc_get_capabilities()
2057 static int proc_disconnect_claim(struct usb_dev_state *ps, void __user *arg) in proc_disconnect_claim() argument
2065 intf = usb_ifnum_to_if(ps->dev, dc.interface); in proc_disconnect_claim()
2086 return claimintf(ps, dc.interface); in proc_disconnect_claim()
2089 static int proc_alloc_streams(struct usb_dev_state *ps, void __user *arg) in proc_alloc_streams() argument
2096 r = parse_usbdevfs_streams(ps, arg, &num_streams, &num_eps, in proc_alloc_streams()
2101 destroy_async_on_interface(ps, in proc_alloc_streams()
2109 static int proc_free_streams(struct usb_dev_state *ps, void __user *arg) in proc_free_streams() argument
2116 r = parse_usbdevfs_streams(ps, arg, NULL, &num_eps, &eps, &intf); in proc_free_streams()
2120 destroy_async_on_interface(ps, in proc_free_streams()
2136 struct usb_dev_state *ps = file->private_data; in usbdev_do_ioctl() local
2138 struct usb_device *dev = ps->dev; in usbdev_do_ioctl()
2150 ret = proc_reapurb(ps, p); in usbdev_do_ioctl()
2155 ret = proc_reapurbnonblock(ps, p); in usbdev_do_ioctl()
2161 ret = proc_reapurb_compat(ps, p); in usbdev_do_ioctl()
2166 ret = proc_reapurbnonblock_compat(ps, p); in usbdev_do_ioctl()
2171 if (!connected(ps)) { in usbdev_do_ioctl()
2179 ret = proc_control(ps, p); in usbdev_do_ioctl()
2186 ret = proc_bulk(ps, p); in usbdev_do_ioctl()
2193 ret = proc_resetep(ps, p); in usbdev_do_ioctl()
2200 ret = proc_resetdevice(ps); in usbdev_do_ioctl()
2205 ret = proc_clearhalt(ps, p); in usbdev_do_ioctl()
2212 ret = proc_getdriver(ps, p); in usbdev_do_ioctl()
2217 ret = proc_connectinfo(ps, p); in usbdev_do_ioctl()
2222 ret = proc_setintf(ps, p); in usbdev_do_ioctl()
2227 ret = proc_setconfig(ps, p); in usbdev_do_ioctl()
2232 ret = proc_submiturb(ps, p); in usbdev_do_ioctl()
2240 ret = proc_control_compat(ps, p); in usbdev_do_ioctl()
2247 ret = proc_bulk_compat(ps, p); in usbdev_do_ioctl()
2254 ret = proc_disconnectsignal_compat(ps, p); in usbdev_do_ioctl()
2259 ret = proc_submiturb_compat(ps, p); in usbdev_do_ioctl()
2266 ret = proc_ioctl_compat(ps, ptr_to_compat(p)); in usbdev_do_ioctl()
2272 ret = proc_unlinkurb(ps, p); in usbdev_do_ioctl()
2277 ret = proc_disconnectsignal(ps, p); in usbdev_do_ioctl()
2282 ret = proc_claiminterface(ps, p); in usbdev_do_ioctl()
2287 ret = proc_releaseinterface(ps, p); in usbdev_do_ioctl()
2292 ret = proc_ioctl_default(ps, p); in usbdev_do_ioctl()
2297 ret = proc_claim_port(ps, p); in usbdev_do_ioctl()
2302 ret = proc_release_port(ps, p); in usbdev_do_ioctl()
2305 ret = proc_get_capabilities(ps, p); in usbdev_do_ioctl()
2308 ret = proc_disconnect_claim(ps, p); in usbdev_do_ioctl()
2311 ret = proc_alloc_streams(ps, p); in usbdev_do_ioctl()
2314 ret = proc_free_streams(ps, p); in usbdev_do_ioctl()
2351 struct usb_dev_state *ps = file->private_data; in usbdev_poll() local
2354 poll_wait(file, &ps->wait, wait); in usbdev_poll()
2355 if (file->f_mode & FMODE_WRITE && !list_empty(&ps->async_completed)) in usbdev_poll()
2357 if (!connected(ps)) in usbdev_poll()
2377 struct usb_dev_state *ps; in usbdev_remove() local
2381 ps = list_entry(udev->filelist.next, struct usb_dev_state, list); in usbdev_remove()
2382 destroy_all_async(ps); in usbdev_remove()
2383 wake_up_all(&ps->wait); in usbdev_remove()
2384 list_del_init(&ps->list); in usbdev_remove()
2385 if (ps->discsignr) { in usbdev_remove()
2387 sinfo.si_signo = ps->discsignr; in usbdev_remove()
2390 sinfo.si_addr = ps->disccontext; in usbdev_remove()
2391 kill_pid_info_as_cred(ps->discsignr, &sinfo, in usbdev_remove()
2392 ps->disc_pid, ps->cred, ps->secid); in usbdev_remove()