On Tuesday, August 24, 2021 9:27:35 AM CEST Pavel Skripkin wrote:
_rtw_read16 function can fail in case of usb transfer failure. But
previous function prototype wasn't designed to return an error to
caller. It can cause a lot uninit value bugs all across the driver code,
since rtw_read16() returns local stack variable to caller.
Fix it by changing the prototype of this function. Now it returns an
int: 0 on success, negative error value on failure and callers should pass
the pointer to storage location for register value.
Signed-off-by: Pavel Skripkin <paskripkin@xxxxxxxxx>
[...]
-static u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr)
+static int usb_read16(struct intf_hdl *pintfhdl, u32 addr, u16 *data)
{
u8 requesttype;
u16 wvalue;
u16 len;
- __le32 data;
+ int res;
+ __le32 tmp;
+
+ if (WARN_ON(unlikely(!data)))
+ return -EINVAL;
requesttype = 0x01;/* read_in */
wvalue = (u16)(addr & 0x0000ffff);
len = 2;
- usbctrl_vendorreq(pintfhdl, wvalue, &data, len, requesttype);
+ res = usbctrl_vendorreq(pintfhdl, wvalue, &tmp, len, requesttype);
+ if (res < 0) {
+ dev_err(dvobj_to_dev(pintfhdl->pintf_dev), "Failed to read 16 bytes: %d\n", res);
+ return res;
+ } else if (res != len) {
Dear Pavel,
Please note that if and when my patch "Use usb_control_msg_recv / send () in
usbctrl_vendorreq ()" will be merged, "if (res! = len)" will always evaluate 'true'
and usb_read16 () will always return -EIO even if usbctrl_vendorreq () succeeds.