linux usb host 读阻塞
来源:互联网 发布:linux怎么退出输入模式 编辑:程序博客网 时间:2024/06/07 06:50
问题:usb host 读数据的时候阻塞在 wait_for_completion(&dev->bulk_in_completion);
解决办法:将 wait_for_completion 替换成用等待队列(waitqueue),步骤如下
@@ -61,11 +61,10 @@ struct usb_skel { __u8bulk_out_endpointAddr;/* the address of the bulk out endpoint */ interrors;/* the last request tanked */ boolongoing_read;/* a read is going on */-boolprocessed_urb;/* indicates we haven't processed the urb */ spinlock_terr_lock;/* lock for errors */ struct krefkref; struct mutexio_mutex;/* synchronize I/O with disconnect */-struct completionbulk_in_completion;/* to wait for an ongoing read */+wait_queue_head_tbulk_in_wait;/* to wait for an ongoing read */ }; #define to_skel_dev(d) container_of(d, struct usb_skel, kref) @@ -185,7 +184,7 @@ static void skel_read_bulk_callback(struct urb *urb) dev->ongoing_read = 0; spin_unlock(&dev->err_lock); -complete(&dev->bulk_in_completion);+wake_up_interruptible(&dev->bulk_in_wait); } static int skel_do_read_io(struct usb_skel *dev, size_t count)@@ -206,13 +205,16 @@ static int skel_do_read_io(struct usb_skel *dev, size_t count) dev->ongoing_read = 1; spin_unlock_irq(&dev->err_lock); +/* submit bulk in urb, which means no data to deliver */+dev->bulk_in_filled = 0;+dev->bulk_in_copied = 0;+ /* do it */ rv = usb_submit_urb(dev->bulk_in_urb, GFP_KERNEL); if (rv < 0) { dev_err(&dev->interface->dev, "%s - failed submitting read urb, error %d\n", __func__, rv);-dev->bulk_in_filled = 0; rv = (rv == -ENOMEM) ? rv : -EIO; spin_lock_irq(&dev->err_lock); dev->ongoing_read = 0;@@ -261,25 +263,9 @@ retry: * IO may take forever * hence wait in an interruptible state */-rv = wait_for_completion_interruptible(&dev->bulk_in_completion);+rv = wait_event_interruptible(dev->bulk_in_wait, (!dev->ongoing_read)); if (rv < 0) goto exit;-/*- * by waiting we also semiprocessed the urb- * we must finish now- */-dev->bulk_in_copied = 0;-dev->processed_urb = 1;-}--if (!dev->processed_urb) {-/*- * the URB hasn't been processed- * do it now- */-wait_for_completion(&dev->bulk_in_completion);-dev->bulk_in_copied = 0;-dev->processed_urb = 1; } /* errors must be reported */@@ -289,8 +275,6 @@ retry: dev->errors = 0; /* to preserve notifications about reset */ rv = (rv == -EPIPE) ? rv : -EIO;-/* no data to deliver */-dev->bulk_in_filled = 0; /* report it */ goto exit; }@@ -526,7 +510,7 @@ static int skel_probe(struct usb_interface *interface, mutex_init(&dev->io_mutex); spin_lock_init(&dev->err_lock); init_usb_anchor(&dev->submitted);-init_completion(&dev->bulk_in_completion);+init_waitqueue_head(&dev->bulk_in_wait); dev->udev = usb_get_dev(interface_to_usbdev(interface)); dev->interface = interface;
阅读全文
0 0
- linux usb host 读阻塞
- Linux USB subsystem --- EHCI host controller register
- Linux USB subsystem --- EHCI host controller register
- linux & android平台USB HOST调试
- linux USB HOST之EHCI和OHCI
- linux usb枚举过程分析【host】
- Linux下USB驱动详解(HOST)
- Linux USB Host 驱动开发入门
- linux usb枚举过程分析【host】
- Linux内核移植 part3:usb host驱动
- usb host
- usb host
- usb-host
- usb host
- USB Host
- 基于S3C2410平台USB Host Driver for Linux 2.6移植
- Linux USB Host-Controller的初始化代码框架分析
- s5pv210-Linux驱动之USB-HOST主机控制器之EHCI
- 最完整的React+Redux+router兼容ie8 修改!!!!
- spring boot mybatis相关问题
- Android开发中几种布局方式介绍
- DEX文件反汇编工具
- lambda 表达式 android
- linux usb host 读阻塞
- NDK学习之增量更新--编译bsdiff得到差分包
- [Linux][小技巧]提示:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
- windows下安装docker的一些经验之谈
- Android 如何在 ListView 中更新 ProgressBar 进度
- EPOLL内核原理极简图文解读
- Kalman 滤波
- The superclass "javax.servlet.http.HttpServlet" was not found on the JavaBean
- 约瑟夫环问题