Don't rely on usb_control_msg() returning -EPIPE in absence of working firmware. In some cases, no error is returned, but no data is read. Interpret short reads as an error, return -EIO. Signed-off-by: Pavel Roskin <proski@xxxxxxx> --- drivers/net/wireless/at76_usb.c | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/at76_usb.c b/drivers/net/wireless/at76_usb.c index d5e939e..f2a74d4 100644 --- a/drivers/net/wireless/at76_usb.c +++ b/drivers/net/wireless/at76_usb.c @@ -578,7 +578,10 @@ static int at76_get_op_mode(struct usb_device *udev) USB_CTRL_GET_TIMEOUT); if (ret < 0) return ret; - return op_mode; + else if (ret < 1) + return -EIO; + else + return op_mode; } /* Load a block of the second ("external") part of the firmware */ @@ -695,10 +698,15 @@ static struct reg_domain const *at76_get_reg_domain(u16 code) static inline int at76_get_mib(struct usb_device *udev, u16 mib, void *buf, int buf_size) { - return usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x33, - USB_TYPE_VENDOR | USB_DIR_IN | - USB_RECIP_INTERFACE, mib << 8, 0, buf, buf_size, - USB_CTRL_GET_TIMEOUT); + int ret; + + ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x33, + USB_TYPE_VENDOR | USB_DIR_IN | + USB_RECIP_INTERFACE, mib << 8, 0, buf, buf_size, + USB_CTRL_GET_TIMEOUT); + if (ret >= 0 && ret != buf_size) + return -EIO; + return ret; } /* Return positive number for status, negative for an error */ - To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html