树莓派CM4 usb dwc2驱动报:dwc2_hc_chhltd_intr_dma: Channel 7 - ChHltd set, but reason is unknown

问题描述:

  在CM4的USB2.0外置USB口上接了一个realtek的usb2eth网卡,型号如下:

ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter

usb2eth网卡不能稳定工作,dmesg里能看到kernel里dwc2驱动一直报warning。

复制代码
Dec 10 15:11:23 raspberrypi kernel: [ 8505.396473] dwc2 fe980000.usb: dwc2_hc_chhltd_intr_dma: Channel 7 - ChHltd set, but reason is unknown
Dec 10 15:11:23 raspberrypi kernel: [ 8505.396490] dwc2 fe980000.usb: hcint 0x00000002, intsts 0x04400009
Dec 10 15:11:24 raspberrypi kernel: [ 8506.367465] dwc2 fe980000.usb: dwc2_hc_chhltd_intr_dma: Channel 1 - ChHltd set, but reason is unknown
Dec 10 15:11:24 raspberrypi kernel: [ 8506.367472] dwc2 fe980000.usb: hcint 0x00000002, intsts 0x04400001
Dec 10 15:11:30 raspberrypi kernel: [ 8512.359278] dwc2 fe980000.usb: dwc2_hc_chhltd_intr_dma: Channel 5 - ChHltd set, but reason is unknown
Dec 10 15:11:30 raspberrypi kernel: [ 8512.359285] dwc2 fe980000.usb: hcint 0x00000002, intsts 0x04400001
Dec 10 15:11:30 raspberrypi kernel: [ 8512.359415] dwc2 fe980000.usb: dwc2_hc_chhltd_intr_dma: Channel 7 - ChHltd set, but reason is unknown
Dec 10 15:11:30 raspberrypi kernel: [ 8512.359420] dwc2 fe980000.usb: hcint 0x00000002, intsts 0x04400001
Dec 10 15:11:30 raspberrypi kernel: [ 8512.359650] dwc2 fe980000.usb: dwc2_hc_chhltd_intr_dma: Channel 6 - ChHltd set, but reason is unknown
Dec 10 15:11:30 raspberrypi kernel: [ 8512.359654] dwc2 fe980000.usb: hcint 0x00000002, intsts 0x04400001
Dec 10 15:11:30 raspberrypi kernel: [ 8512.359682] dwc2 fe980000.usb: dwc2_hc_chhltd_intr_dma: Channel 3 - ChHltd set, but reason is unknown
Dec 10 15:11:30 raspberrypi kernel: [ 8512.359686] dwc2 fe980000.usb: hcint 0x00000002, intsts 0x04400001
Dec 10 15:11:30 raspberrypi kernel: [ 8512.359774] dwc2 fe980000.usb: dwc2_hc_chhltd_intr_dma: Channel 2 - ChHltd set, but reason is unknown
Dec 10 15:11:30 raspberrypi kernel: [ 8512.359778] dwc2 fe980000.usb: hcint 0x00000002, intsts 0x04400001
Dec 10 15:11:30 raspberrypi kernel: [ 8512.361090] dwc2 fe980000.usb: dwc2_hc_chhltd_intr_dma: Channel 1 - ChHltd set, but reason is unknown
Dec 10 15:11:30 raspberrypi kernel: [ 8512.361095] dwc2 fe980000.usb: hcint 0x00000002, intsts 0x04400001
复制代码

 

解决办法:

复制代码
diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c
index d5f4ec1..4989ec7 100644
--- a/drivers/usb/dwc2/hcd_intr.c
+++ b/drivers/usb/dwc2/hcd_intr.c
@@ -1180,7 +1180,10 @@ static void dwc2_update_urb_state_abn(struct dwc2_hsotg *hsotg,
 
        if (urb->actual_length + xfer_length > urb->length) {
                dev_warn(hsotg->dev, "%s(): trimming xfer length\n", __func__);
-               xfer_length = urb->length - urb->actual_length;
+               if (urb->length & 0x3)
+                       xfer_length = 0;
+               else
+                       xfer_length = urb->length - urb->actual_length;
        }
 
        urb->actual_length += xfer_length;
@@ -2065,8 +2068,6 @@ static void dwc2_hc_n_intr(struct dwc2_hsotg *hsotg, int chnum)
                         hcint, hcintmsk, hcint & hcintmsk);
        }
 
-       dwc2_writel(hsotg, hcint, HCINT(chnum));
-
        /*
         * If we got an interrupt after someone called
         * dwc2_hcd_endpoint_disable() we don't want to crash below
@@ -2079,6 +2080,8 @@ static void dwc2_hc_n_intr(struct dwc2_hsotg *hsotg, int chnum)
        chan->hcint = hcint;
        hcint &= hcintmsk;
 
+       dwc2_writel(hsotg, hcint, HCINT(chnum));
+
        /*
         * If the channel was halted due to a dequeue, the qtd list might
         * be empty or at least the first entry will not be the active qtd.
复制代码

注意:

这个补丁只清除未屏蔽中断,以避免触发未知通道停止中断。然而,如果通道停止中断意外发生,我们需要检查dwc2_update_urb_state_abn()中的urb->length是否为4字节对齐,这可以帮助避免上述警告。

posted @   闹闹爸爸  阅读(1642)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示