<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)));