From: "Fabio M. De Francesco" <fmdefrancesco@gmail.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Larry Finger <Larry.Finger@lwfinger.net>,
Phillip Potter <phil@philpotter.co.uk>,
Pavel Skripkin <paskripkin@gmail.com>,
linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 2/3] staging: r8188eu: Shorten calls chain of rtw_read8/16/32()
Date: Thu, 09 Sep 2021 09:53:02 +0200 [thread overview]
Message-ID: <7885982.jm2Fxi49sr@localhost.localdomain> (raw)
In-Reply-To: <YTYgnrvwxNt4+CvR@kroah.com>
On Monday, September 6, 2021 4:07:26 PM CEST Greg Kroah-Hartman wrote:
> On Sun, Sep 05, 2021 at 12:00:47AM +0200, Fabio M. De Francesco wrote:
> > Shorten the calls chain of rtw_read8/16/32() down to the actual reads.
> > For this purpose unify the three usb_read8/16/32 into the new
> > usb_read(); make the latter parameterizable with 'size'; embed most of
> > the code of usbctrl_vendorreq() into usb_read() and use in it the new
> > usb_control_msg_recv() API of USB Core.
> >
> > Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > Co-developed-by: Pavel Skripkin <paskripkin@gmail.com>
> > Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
> > Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
> > ---
> >
> > v2->v3: No changes.
> >
> > v1->v2: No changes.
> >
> > drivers/staging/r8188eu/hal/usb_ops_linux.c | 92 +++++++++++++++++----
> > 1 file changed, 78 insertions(+), 14 deletions(-)
> >
> > diff --git a/drivers/staging/r8188eu/hal/usb_ops_linux.c b/drivers/
staging/r8188eu/hal/usb_ops_linux.c
> > index a87b0d2e87d0..f9c4fd5a2c53 100644
> > --- a/drivers/staging/r8188eu/hal/usb_ops_linux.c
> > +++ b/drivers/staging/r8188eu/hal/usb_ops_linux.c
> > @@ -97,38 +97,102 @@ static int usbctrl_vendorreq(struct intf_hdl
*pintfhdl, u16 value, void *pdata,
> > return status;
> > }
> >
> > +static int usb_read(struct intf_hdl *intfhdl, u32 addr, void *data, u8
size)
> > +{
> > + u16 value = (u16)(addr & 0x0000ffff);
>
> Why not just pass in the address as a 16bit value?
Yes, it should be better. It will be done in v4.
>
>
> > + struct adapter *adapt = intfhdl->padapter;
> > + struct dvobj_priv *dvobjpriv = adapter_to_dvobj(adapt);
> > + struct usb_device *udev = dvobjpriv->pusbdev;
> > + int status;
> > + u8 *io_buf;
> > + int vendorreq_times = 0;
> > +
> > + if (adapt->bSurpriseRemoved || adapt->pwrctrlpriv.pnp_bstop_trx)
{
> > + status = -EPERM;
> > + goto exit;
>
> This is "interesting" to see if it's really even working as they think
> it does, but let's leave it alone for now...
As you suggest, I also prefer to leave it alone for now.
>
> > + }
> > +
> > + mutex_lock(&dvobjpriv->usb_vendor_req_mutex);
> > +
> > + /* Acquire IO memory for vendorreq */
> > + io_buf = dvobjpriv->usb_vendor_req_buf;
> > +
> > + if (!io_buf) {
> > + DBG_88E("[%s] io_buf == NULL\n", __func__);
>
> How can this buffer ever be NULL?
As you noticed a few lines below this, I moved some code around and ignored
and left as was anything that wasn't functional for my purpose..
>
> > + status = -ENOMEM;
> > + goto release_mutex;
> > + }
>
> Why share a buffer at all anyway?
Same answer as above.
>
> > + while (++vendorreq_times <= MAX_USBCTRL_VENDORREQ_TIMES) {
> > + status = usb_control_msg_recv(udev, 0,
REALTEK_USB_VENQT_CMD_REQ,
> > +
REALTEK_USB_VENQT_READ, value,
> > +
REALTEK_USB_VENQT_CMD_IDX, io_buf,
> > + size,
RTW_USB_CONTROL_MSG_TIMEOUT,
> > + GFP_KERNEL);
> > + if (!status) { /* Success this control transfer. */
>
> Comments go on the next line.
This will be fixed in v4, although I'm not sure if this comment and the next
are really necessary. The code seems self-explanatory.
>
> > + rtw_reset_continual_urb_error(dvobjpriv);
> > + memcpy(data, io_buf, size);
> > + } else { /* error cases */
>
> Again, next line for the comment.
Same as above.
>
> > + DBG_88E("reg 0x%x, usb %s %u fail, status:
%d vendorreq_times:%d\n",
> > + value, "read", size, status,
vendorreq_times);
>
> These should be removed eventually...
>
I could use pr_debug() for now or remove it immediately. I'd prefer the
latter but I'm not sure if it is the most appropriate thing to do. Let me
think about it...
> > +
> > + if (status == (-ESHUTDOWN) || status == -
ENODEV) {
> > + adapt->bSurpriseRemoved = true;
>
> Odd, but ok...
>
> > + } else {
> > + struct hal_data_8188e *haldata =
GET_HAL_DATA(adapt);
> > +
> > + haldata-
>srestpriv.wifi_error_status = USB_VEN_REQ_CMD_FAIL;
>
> Why are we not saying the command failed even if the device was removed?
This question is not clear to me. Are you talking about -ENOENT?
I suppose it should be if (status == (-ESHUTDOWN || -ENODEV || -ENOENT)) ...
> But if we do say an error happened, why are we trying to send this out
> again? What would happen to make it work the second time?
There are some errors that are unrecoverable and the loop has no reason to
re-iterate again and again. I'll break this loop on unrecoverable errors.
I see that usb_submit_urb() at the very end of the calls chain may fail for a
lot of different reasons and some of them are a bit obscure to me
(unfortunately, at the moment I have no time to go deeper into the
architecture and the inner workings of the USB subsystem :) )
I hope that I won't overlook any of them - as far as it regards some of all
possible errors I have doubts in telling whether or not they are
unrecoverable and if some can actually happen in this code :(
> > + }
> > +
> > + if
(rtw_inc_and_chk_continual_urb_error(dvobjpriv)) {
> > + adapt->bSurpriseRemoved = true;
>
> So we try to see if the device was removed again?
This must be changed, let me see if I can understand how. At the moment I
don't have the whole picture.
> > + break;
> > + }
> > + }
> > +
> > + /* firmware download is checksummed, don't retry */
> > + if ((value >= FW_8188E_START_ADDRESS && value <=
FW_8188E_END_ADDRESS) || !status)
> > + break;
>
> Nothing like a special case for firmware magic.
This is something that I really cannot understand, so I think I'll leave it
as-is unless I may get some more hints... :)
> Those calls should just use a different write function entirely,
> eventually, to remove this...
>
> Ok, I know you are just moving code around, this is fine, just pointing
> out things that should be fixed up eventually...
Yes, I'm just moving the code around. Anyway I guess that I can fix/change
most of the things you pointed out.
Thanks very much for your review,
Fabio
>
> thanks,
>
> greg k-h
>
next prev parent reply other threads:[~2021-09-09 7:53 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-04 22:00 [PATCH v3 0/3] staging: r8188eu: Shorten and simplify calls chain Fabio M. De Francesco
2021-09-04 22:00 ` [PATCH v3 1/3] staging: r8188eu: remove _io_ops structure Fabio M. De Francesco
2021-09-06 13:56 ` Greg Kroah-Hartman
2021-09-06 14:01 ` Pavel Skripkin
2021-09-06 14:08 ` Greg Kroah-Hartman
2021-09-06 17:19 ` Pavel Skripkin
2021-09-07 5:01 ` Greg Kroah-Hartman
2021-09-04 22:00 ` [PATCH v3 2/3] staging: r8188eu: Shorten calls chain of rtw_read8/16/32() Fabio M. De Francesco
2021-09-06 14:07 ` Greg Kroah-Hartman
2021-09-06 14:22 ` Pavel Skripkin
2021-09-09 7:53 ` Fabio M. De Francesco [this message]
2021-09-10 15:19 ` Fabio M. De Francesco
2021-09-10 19:05 ` Fabio M. De Francesco
2021-09-04 22:00 ` [PATCH v3 3/3] staging: r8188eu: Shorten calls chain of rtw_write8/16/32/N() Fabio M. De Francesco
2021-09-07 10:10 ` David Laight
2021-09-07 10:17 ` Pavel Skripkin
2021-09-09 8:11 ` Fabio M. De Francesco
2021-09-09 8:21 ` David Laight
2021-09-09 8:31 ` Fabio M. De Francesco
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7885982.jm2Fxi49sr@localhost.localdomain \
--to=fmdefrancesco@gmail.com \
--cc=Larry.Finger@lwfinger.net \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-staging@lists.linux.dev \
--cc=paskripkin@gmail.com \
--cc=phil@philpotter.co.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.