树莓派-4; pl2303_read_int_callback - usb_submit_urb 失败,结果为 -1

时间:2021-01-08 13:49:45

标签: serial-port usb raspberry-pi4

我正在尝试使用 Raspberry Pi-4、Model-B、2GB RAM 控制 5V 4 通道继电器模块 http://www.icstation.com/icstation-micro-channel-relay-module-control-relay-module-icse012a-p-4012.html

但有时我观察到“pl2303 ttyUSB0: pl2303_read_int_callback - usb_submit_urb failed with result -1”错误并且中继没有执行所需的操作。

如果能从本论坛上的专业人士那里了解此问题的根本原因或原因,那就太好了。 任何提示/线索都会非常有帮助和赞赏:) .

再次感谢。

1 个答案:

答案 0 :(得分:0)

TL;DR:pl2303 驱动程序中似乎存在由竞争或多次连接/断开连接后的错误状态引起的缺陷。只需重新加载 pl2303 内核模型即可解决此问题。

内核 USB 堆栈中的错误 '-1' (EPERM) 很少见:我只能在 urb 提交路径中找到一次,例如: https://elixir.bootlin.com/linux/v5.4.99/source/drivers/usb/core/hcd.c#L1152

除此之外,usb_kill_urb 上的内核文档说:

To cancel an URB synchronously, call usb_kill_urb():

void usb_kill_urb(struct urb *urb)
It does everything usb_unlink_urb() does, and in addition it waits until after
the URB has been returned and the completion handler has finished. It also marks
the URB as temporarily unusable, so that if the completion handler or anyone
else tries to resubmit it they will get a -EPERM error

所以基本上驱动程序试图在它被杀死后提交 INT IN URB。查看 pl2303 驱动程序代码,您只能看到 INT IN URB 中毒的 2 个地方,例如: https://elixir.bootlin.com/linux/v5.4.65/source/drivers/usb/serial/pl2303.c#L756 https://elixir.bootlin.com/linux/v5.4.65/source/drivers/usb/serial/pl2303.c#L788

在这两种情况下,这都会发生在 USB 串行设备的 close() 或不成功的 open() 上。

正确的解决方法是:

  1. 检查是否在 usb_serial_generic_open() 函数上打开失败
  2. 检查 INT IN URB 杀戮是否正确完成,并且没有竞争
  3. 检查 pl2303 代码是否与最近的 USB 串行驱动程序逻辑一致

快速修复正在运行的系统只是 rmmod pl2303 && modprobe pl2303