diff --git a/src/drivers/net/axge.c b/src/drivers/net/axge.c index 1106c1e6f..fb274d24f 100644 --- a/src/drivers/net/axge.c +++ b/src/drivers/net/axge.c @@ -531,6 +531,13 @@ static int axge_open ( struct net_device *netdev ) { uint16_t rcr; int rc; + /* Reapply device configuration to avoid transaction errors */ + if ( ( rc = usb_set_configuration ( axge->usb, axge->config ) ) != 0 ) { + DBGC ( axge, "AXGE %p could not set configuration: %s\n", + axge, strerror ( rc ) ); + goto err_set_configuration; + } + /* Open USB network device */ if ( ( rc = usbnet_open ( &axge->usbnet ) ) != 0 ) { DBGC ( axge, "AXGE %p could not open: %s\n", @@ -567,6 +574,7 @@ static int axge_open ( struct net_device *netdev ) { err_write_mac: usbnet_close ( &axge->usbnet ); err_open: + err_set_configuration: return rc; } @@ -674,6 +682,7 @@ static int axge_probe ( struct usb_function *func, axge->usb = usb; axge->bus = usb->port->hub->bus; axge->netdev = netdev; + axge->config = config->config; usbnet_init ( &axge->usbnet, func, &axge_intr_operations, &axge_in_operations, &axge_out_operations ); usb_refill_init ( &axge->usbnet.intr, 0, 0, AXGE_INTR_MAX_FILL ); diff --git a/src/drivers/net/axge.h b/src/drivers/net/axge.h index 6183b4e70..e22e0ec47 100644 --- a/src/drivers/net/axge.h +++ b/src/drivers/net/axge.h @@ -145,6 +145,8 @@ struct axge_device { struct net_device *netdev; /** USB network device */ struct usbnet_device usbnet; + /** Device configuration */ + unsigned int config; /** Link state has changed */ int check_link; };