On Tuesday, September 14, 2021 11:32:58 AM CEST Dan Carpenter wrote: > On Mon, Sep 13, 2021 at 08:10:01PM +0200, Fabio M. De Francesco wrote: > > diff --git a/drivers/staging/r8188eu/hal/usb_ops_linux.c b/drivers/ staging/r8188eu/hal/usb_ops_linux.c > > index 04402bab805e..75475b0083db 100644 > > --- a/drivers/staging/r8188eu/hal/usb_ops_linux.c > > +++ b/drivers/staging/r8188eu/hal/usb_ops_linux.c > > @@ -89,6 +89,56 @@ static int usbctrl_vendorreq(struct intf_hdl *intfhdl, u16 value, void *data, u1 > > return status; > > } > > > > +static int usb_read(struct intf_hdl *intfhdl, u16 addr, void *data, u8 size) > > +{ > > + int status; > > + u8 *io_buf; /* pointer to I/O buffer */ > > + struct adapter *adapt = intfhdl->padapter; > > + struct dvobj_priv *dvobjpriv = adapter_to_dvobj(adapt); > > + struct usb_device *udev = dvobjpriv->pusbdev; > > + > > + if (adapt->bSurpriseRemoved || adapt->pwrctrlpriv.pnp_bstop_trx) { > > + status = -EPERM; > > + goto exit; > > + } > > Just return directly. > > if (adapt->bSurpriseRemoved || adapt->pwrctrlpriv.pnp_bstop_trx) > return -EPERM; Dear Dan, I agree with you, I'll return it directly in v5. > > + > > + mutex_lock(&dvobjpriv->usb_vendor_req_mutex); > > + > > + io_buf = dvobjpriv->usb_vendor_req_buf; > > + > > + status = usb_control_msg_recv(udev, 0, REALTEK_USB_VENQT_CMD_REQ, > > + REALTEK_USB_VENQT_READ, addr, > > + REALTEK_USB_VENQT_CMD_IDX, io_buf, > > + size, RTW_USB_CONTROL_MSG_TIMEOUT, > > + GFP_KERNEL); > > + if (!status) { > > + /* Success this control transfer. */ > > It's always better to do error handling instead of success handling. Yes, you're right again. I blindly followed the style that was in the parts of the code of usbctrl_vendorreq() that I'm reusing here. > if (status) { > > Remove the comment because now it's in the standard format. OK, those comments are not necessary: I'll remove them. > > + rtw_reset_continual_urb_error(dvobjpriv); > > + memcpy(data, io_buf, size); > > + goto mutex_unlock; > > + } > > + /* error cases */ > > + if (status == (-ESHUTDOWN || -ENODEV || -ENOENT)) { > > if (status == -ESHUTDOWN || > status == -ENODEV || > status == -ENOENT) { This is a stupid mistake and Pavel soon noticed it. Yesterday I sent a message to ask reviewers for disregarding v4 and wait for v5 with the fix of this test. :( However, I noticed that usb_control_msg_recv() might return in "status" some recoverable errors (like -ENOMEM and others); so I guess that the code must retry in a while loop (exactly as it did with usb_control_msg() in usbctrl_vendorreq()). Actually I'm not 100% sure that the "while" loop is needed. What I know is that I've been using this version (with _no_ loop) for about a week, not less than 12 hours a day and I didn't notice any problem... Can you please tell if a loop for retries is *really* necessary? > > > + /* > > + * device or controller has been disabled due to > > + * some problem that could not be worked around, > > + * device or bus doesn’t exist, endpoint does not > > + * exist or is not enabled. > > + */ > > + adapt->bSurpriseRemoved = true; > > + goto mutex_unlock; > > Indented wrong. Yes, it must be fixed. Regards, Fabio > > > + } > > + GET_HAL_DATA(adapt)->srestpriv.wifi_error_status = USB_VEN_REQ_CMD_FAIL; > > + if (rtw_inc_and_chk_continual_urb_error(dvobjpriv)) { > > + adapt->bSurpriseRemoved = true; > > + goto mutex_unlock; > > + } > > +mutex_unlock: > > + mutex_unlock(&dvobjpriv->usb_vendor_req_mutex); > > +exit: > > + return status; > > +} > > regards, > dan carpenter >