USB以太网4字节对齐问题

在移植USB以太网时遇到DWC_OTG错误,提示urb->transfer_buffer地址未按4字节对齐。通过分析源码发现,问题在于u16 buf的内存对齐。解决方案是在定义buf时添加__attribute__ ((aligned (16)))使其满足16字节对齐,从而修复网卡无法使用的状况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<6>[   40.917524] DWC_OTG: dwc_otg_hcd_urb_enqueue urb->transfer_buffer address not align to 4-byte 0xde215bf6

在移植usb以太网的时候遇到上面字节对齐问题,导致网卡无法使用,

分析:


u16 buf __attribute__ ((aligned (16)));
buf = *((u16 *)data);
cpu_to_le16s(&buf);
ret = __ax88179_write_cmd(dev, cmd, value, index,
 size, &buf, 1);


static int __ax88179_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
      u16 size, void *data, int in_pm)
{
int ret;

#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16);


BUG_ON(!dev);


if (!in_pm)
fn = usbnet_write_cmd;
else
fn = usbnet_write_cmd_nopm;


ret = fn(dev, cmd, USB_DIR_OUT | USB_TYPE_VENDOR |
USB_RECIP_DEVICE, value, index, data, size);


if (unlikely(ret < 0))
netdev_warn(dev->net, "Failed to write reg index 0x%04x: %d\n",
   index, ret);
#else
//printk("zougui  %s  %i date =  0x%x\n",__func__,__LINE__,data);
ret = usb_control_msg(
dev->udev,
usb_sndctrlpipe(dev->udev, 0),
cmd,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
value,
index,
data,
size,
USB_CTRL_SET_TIMEOUT);


#endif
return ret;
}


上面将会从u16 buf的地址传到dwc_otg_hcd_urb_enqueue

    if((uint32_t)_urb->transfer_buffer & 3){
        retval = -EPERM;
        DWC_PRINT("%s urb->transfer_buffer address not align to 4-byte 0x%x\n", __func__, (uint32_t)_urb->transfer_buffer);
        goto out;
    }

其中urb->transfer_buffer就是buf的地址,


解决方法 把u16 buf ;改为   u16 buf __attribute__ ((aligned (16)));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值