Messages in this thread | | | Subject | Re: [PATCH v3 4/6] staging: r8188eu: add error handling of rtw_read16 | From | Pavel Skripkin <> | Date | Wed, 25 Aug 2021 11:22:16 +0300 |
| |
On 8/25/21 7:35 AM, Fabio M. De Francesco wrote: > 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@gmail.com> >> >> [...] >> >> -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. >
Yep, thank you, but it depends on which series will go in first :)
There is a chance, that you will need to clean up this part, if mine will be merged before yours
With regards, Pavel Skripkin
| |