|
@@ -1035,9 +1035,20 @@ int usb_stor_Bulk_max_lun(struct us_data *us)
|
|
|
usb_stor_dbg(us, "GetMaxLUN command result is %d, data is %d\n",
|
|
|
result, us->iobuf[0]);
|
|
|
|
|
|
- /* if we have a successful request, return the result */
|
|
|
- if (result > 0)
|
|
|
- return us->iobuf[0];
|
|
|
+ /*
|
|
|
+ * If we have a successful request, return the result if valid. The
|
|
|
+ * CBW LUN field is 4 bits wide, so the value reported by the device
|
|
|
+ * should fit into that.
|
|
|
+ */
|
|
|
+ if (result > 0) {
|
|
|
+ if (us->iobuf[0] < 16) {
|
|
|
+ return us->iobuf[0];
|
|
|
+ } else {
|
|
|
+ dev_info(&us->pusb_intf->dev,
|
|
|
+ "Max LUN %d is not valid, using 0 instead",
|
|
|
+ us->iobuf[0]);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Some devices don't like GetMaxLUN. They may STALL the control
|