De fato, usbnet
parece ser o mais provável culpado.
/* rx and tx sides can use different message sizes;
* bind() should set rx_urb_size in that case.
*/
dev->hard_mtu = net->mtu + net->hard_header_len;
net->netdev_ops = &usbnet_netdev_ops;
net->watchdog_timeo = TX_TIMEOUT_JIFFIES;
net->ethtool_ops = &usbnet_ethtool_ops;
// allow device-specific bind/init procedures
// NOTE net->name still not usable ...
if (info->bind) {
status = info->bind (dev, udev);
...
}
....
if (!dev->rx_urb_size)
dev->rx_urb_size = dev->hard_mtu;
cdc_ether não define rx_urb_size
em si, até onde eu sei.
Estou supondo que o tamanho do URB seja passado para o controlador USB e que os quadros de ethernet sejam cortados para caber (não me pergunte por que não o outro lado). Quer dizer, espero que sua experiência não esteja causando o hardware em DMA fora dos buffers alocados:).
Mesmo o cdc_ether configurou o rx_urb_size, há um pouco estranho no retorno de chamada ndo_change_mtu
no usbnet. Parece que pode acabar sendo indexado de volta ao mtu, se o mtu já foi definido para o máximo.
Honestamente, eu não sei como isso funciona, só parece estranho à primeira vista.
if (dev->rx_urb_size == old_hard_mtu) { dev->rx_urb_size = dev->hard_mtu;