diff mbox series

usb: renesas-xhci: Prefer firmware loading on unknown ROM state

Message ID 20210819113427.1166-1-tiwai@suse.de (mailing list archive)
State Superseded
Headers show
Series usb: renesas-xhci: Prefer firmware loading on unknown ROM state | expand

Commit Message

Takashi Iwai Aug. 19, 2021, 11:34 a.m. UTC
The recent attempt to handle an unknown ROM state in the commit
d143825baf15 ("usb: renesas-xhci: Fix handling of unknown ROM state")
resulted in a regression and reverted later by the commit 44cf53602f5a
("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"").
The problem of the former fix was that it treated the failure of
firmware loading as a fatal error.  Since the firmware files aren't
included in the standard linux-firmware tree, most users don't have
them, hence they got the non-working system after that.  The revert
fixed the regression, but also it didn't make the firmware loading
triggered even on the devices that do need it.  So we need still a fix
for them.

This is another attempt to handle the unknown ROM state.  Like the
previous fix, this also tries to load the firmware when ROM shows
unknown state.  In this patch, however, the failure of a firmware
loading (such as a missing firmware file) isn't handled as a fatal
error any longer when ROM has been already detected, but it falls back
to the ROM mode like before.  The error is returned only when no ROM
is detected and the firmware loading failed.

Along with it, for simplifying the code flow, the detection and the
check of ROM is factored out from renesas_fw_check_running() and done
in the caller side, renesas_xhci_check_request_fw().  It avoids the
redundant ROM checks.

The patch was tested on Lenovo Thinkpad T14 gen (BIOS 1.34).  Also it
was confirmed that no regression is seen on another Thinkpad T14
machine that has worked without the patch, too.

Fixes: 44cf53602f5a ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"")
BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1189207
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 drivers/usb/host/xhci-pci-renesas.c | 35 +++++++++++++++++++----------
 1 file changed, 23 insertions(+), 12 deletions(-)

Comments

Takashi Iwai Aug. 26, 2021, 10:28 a.m. UTC | #1
On Thu, 19 Aug 2021 13:34:27 +0200,
Takashi Iwai wrote:
> 
> The recent attempt to handle an unknown ROM state in the commit
> d143825baf15 ("usb: renesas-xhci: Fix handling of unknown ROM state")
> resulted in a regression and reverted later by the commit 44cf53602f5a
> ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"").
> The problem of the former fix was that it treated the failure of
> firmware loading as a fatal error.  Since the firmware files aren't
> included in the standard linux-firmware tree, most users don't have
> them, hence they got the non-working system after that.  The revert
> fixed the regression, but also it didn't make the firmware loading
> triggered even on the devices that do need it.  So we need still a fix
> for them.
> 
> This is another attempt to handle the unknown ROM state.  Like the
> previous fix, this also tries to load the firmware when ROM shows
> unknown state.  In this patch, however, the failure of a firmware
> loading (such as a missing firmware file) isn't handled as a fatal
> error any longer when ROM has been already detected, but it falls back
> to the ROM mode like before.  The error is returned only when no ROM
> is detected and the firmware loading failed.
> 
> Along with it, for simplifying the code flow, the detection and the
> check of ROM is factored out from renesas_fw_check_running() and done
> in the caller side, renesas_xhci_check_request_fw().  It avoids the
> redundant ROM checks.
> 
> The patch was tested on Lenovo Thinkpad T14 gen (BIOS 1.34).  Also it
> was confirmed that no regression is seen on another Thinkpad T14
> machine that has worked without the patch, too.
> 
> Fixes: 44cf53602f5a ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"")
> BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1189207
> Signed-off-by: Takashi Iwai <tiwai@suse.de>

A gentle ping to confirm whether this gets a review or not.


thanks,

Takashi


> ---
>  drivers/usb/host/xhci-pci-renesas.c | 35 +++++++++++++++++++----------
>  1 file changed, 23 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci-pci-renesas.c b/drivers/usb/host/xhci-pci-renesas.c
> index aa88e57649a9..52599d96634f 100644
> --- a/drivers/usb/host/xhci-pci-renesas.c
> +++ b/drivers/usb/host/xhci-pci-renesas.c
> @@ -207,7 +207,8 @@ static int renesas_check_rom_state(struct pci_dev *pdev)
>  			return 0;
>  
>  		case RENESAS_ROM_STATUS_NO_RESULT: /* No result yet */
> -			return 0;
> +			dev_dbg(&pdev->dev, "Unknown ROM status ...\n");
> +			return -ENOENT;
>  
>  		case RENESAS_ROM_STATUS_ERROR: /* Error State */
>  		default: /* All other states are marked as "Reserved states" */
> @@ -224,14 +225,6 @@ static int renesas_fw_check_running(struct pci_dev *pdev)
>  	u8 fw_state;
>  	int err;
>  
> -	/* Check if device has ROM and loaded, if so skip everything */
> -	err = renesas_check_rom(pdev);
> -	if (err) { /* we have rom */
> -		err = renesas_check_rom_state(pdev);
> -		if (!err)
> -			return err;
> -	}
> -
>  	/*
>  	 * Test if the device is actually needing the firmware. As most
>  	 * BIOSes will initialize the device for us. If the device is
> @@ -591,21 +584,39 @@ int renesas_xhci_check_request_fw(struct pci_dev *pdev,
>  			(struct xhci_driver_data *)id->driver_data;
>  	const char *fw_name = driver_data->firmware;
>  	const struct firmware *fw;
> +	bool has_rom;
>  	int err;
>  
> +	/* Check if device has ROM and loaded, if so skip everything */
> +	has_rom = renesas_check_rom(pdev);
> +	if (has_rom) {
> +		err = renesas_check_rom_state(pdev);
> +		if (!err)
> +			return 0;
> +		else if (err != -ENOENT)
> +			has_rom = false;
> +	}
> +
>  	err = renesas_fw_check_running(pdev);
>  	/* Continue ahead, if the firmware is already running. */
>  	if (!err)
>  		return 0;
>  
> +	/* no firmware interface available */
>  	if (err != 1)
> -		return err;
> +		return has_rom ? 0 : err;
>  
>  	pci_dev_get(pdev);
> -	err = request_firmware(&fw, fw_name, &pdev->dev);
> +	err = firmware_request_nowarn(&fw, fw_name, &pdev->dev);
>  	pci_dev_put(pdev);
>  	if (err) {
> -		dev_err(&pdev->dev, "request_firmware failed: %d\n", err);
> +		if (has_rom) {
> +			dev_info(&pdev->dev, "failed to load firmware %s, fallback to ROM\n",
> +				 fw_name);
> +			return 0;
> +		}
> +		dev_err(&pdev->dev, "failed to load firmware %s: %d\n",
> +			fw_name, err);
>  		return err;
>  	}
>  
> -- 
> 2.26.2
>
Greg Kroah-Hartman Aug. 26, 2021, 11:08 a.m. UTC | #2
On Thu, Aug 26, 2021 at 12:28:21PM +0200, Takashi Iwai wrote:
> On Thu, 19 Aug 2021 13:34:27 +0200,
> Takashi Iwai wrote:
> > 
> > The recent attempt to handle an unknown ROM state in the commit
> > d143825baf15 ("usb: renesas-xhci: Fix handling of unknown ROM state")
> > resulted in a regression and reverted later by the commit 44cf53602f5a
> > ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"").
> > The problem of the former fix was that it treated the failure of
> > firmware loading as a fatal error.  Since the firmware files aren't
> > included in the standard linux-firmware tree, most users don't have
> > them, hence they got the non-working system after that.  The revert
> > fixed the regression, but also it didn't make the firmware loading
> > triggered even on the devices that do need it.  So we need still a fix
> > for them.
> > 
> > This is another attempt to handle the unknown ROM state.  Like the
> > previous fix, this also tries to load the firmware when ROM shows
> > unknown state.  In this patch, however, the failure of a firmware
> > loading (such as a missing firmware file) isn't handled as a fatal
> > error any longer when ROM has been already detected, but it falls back
> > to the ROM mode like before.  The error is returned only when no ROM
> > is detected and the firmware loading failed.
> > 
> > Along with it, for simplifying the code flow, the detection and the
> > check of ROM is factored out from renesas_fw_check_running() and done
> > in the caller side, renesas_xhci_check_request_fw().  It avoids the
> > redundant ROM checks.
> > 
> > The patch was tested on Lenovo Thinkpad T14 gen (BIOS 1.34).  Also it
> > was confirmed that no regression is seen on another Thinkpad T14
> > machine that has worked without the patch, too.
> > 
> > Fixes: 44cf53602f5a ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"")
> > BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1189207
> > Signed-off-by: Takashi Iwai <tiwai@suse.de>
> 
> A gentle ping to confirm whether this gets a review or not.

Given no one else objected, I'll go take it now, thanks.

greg k-h
Greg Kroah-Hartman Aug. 26, 2021, 11:50 a.m. UTC | #3
On Thu, Aug 19, 2021 at 01:34:27PM +0200, Takashi Iwai wrote:
> The recent attempt to handle an unknown ROM state in the commit
> d143825baf15 ("usb: renesas-xhci: Fix handling of unknown ROM state")
> resulted in a regression and reverted later by the commit 44cf53602f5a
> ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"").
> The problem of the former fix was that it treated the failure of
> firmware loading as a fatal error.  Since the firmware files aren't
> included in the standard linux-firmware tree, most users don't have
> them, hence they got the non-working system after that.  The revert
> fixed the regression, but also it didn't make the firmware loading
> triggered even on the devices that do need it.  So we need still a fix
> for them.
> 
> This is another attempt to handle the unknown ROM state.  Like the
> previous fix, this also tries to load the firmware when ROM shows
> unknown state.  In this patch, however, the failure of a firmware
> loading (such as a missing firmware file) isn't handled as a fatal
> error any longer when ROM has been already detected, but it falls back
> to the ROM mode like before.  The error is returned only when no ROM
> is detected and the firmware loading failed.
> 
> Along with it, for simplifying the code flow, the detection and the
> check of ROM is factored out from renesas_fw_check_running() and done
> in the caller side, renesas_xhci_check_request_fw().  It avoids the
> redundant ROM checks.
> 
> The patch was tested on Lenovo Thinkpad T14 gen (BIOS 1.34).  Also it
> was confirmed that no regression is seen on another Thinkpad T14
> machine that has worked without the patch, too.
> 
> Fixes: 44cf53602f5a ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"")
> BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1189207
> Signed-off-by: Takashi Iwai <tiwai@suse.de>
> ---
>  drivers/usb/host/xhci-pci-renesas.c | 35 +++++++++++++++++++----------
>  1 file changed, 23 insertions(+), 12 deletions(-)

This does not apply to my usb-linus branch, are you sure it is still
needed in Linus's tree right now?

thanks,

greg k-h
Takashi Iwai Aug. 26, 2021, 11:55 a.m. UTC | #4
On Thu, 26 Aug 2021 13:50:13 +0200,
Greg Kroah-Hartman wrote:
> 
> On Thu, Aug 19, 2021 at 01:34:27PM +0200, Takashi Iwai wrote:
> > The recent attempt to handle an unknown ROM state in the commit
> > d143825baf15 ("usb: renesas-xhci: Fix handling of unknown ROM state")
> > resulted in a regression and reverted later by the commit 44cf53602f5a
> > ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"").
> > The problem of the former fix was that it treated the failure of
> > firmware loading as a fatal error.  Since the firmware files aren't
> > included in the standard linux-firmware tree, most users don't have
> > them, hence they got the non-working system after that.  The revert
> > fixed the regression, but also it didn't make the firmware loading
> > triggered even on the devices that do need it.  So we need still a fix
> > for them.
> > 
> > This is another attempt to handle the unknown ROM state.  Like the
> > previous fix, this also tries to load the firmware when ROM shows
> > unknown state.  In this patch, however, the failure of a firmware
> > loading (such as a missing firmware file) isn't handled as a fatal
> > error any longer when ROM has been already detected, but it falls back
> > to the ROM mode like before.  The error is returned only when no ROM
> > is detected and the firmware loading failed.
> > 
> > Along with it, for simplifying the code flow, the detection and the
> > check of ROM is factored out from renesas_fw_check_running() and done
> > in the caller side, renesas_xhci_check_request_fw().  It avoids the
> > redundant ROM checks.
> > 
> > The patch was tested on Lenovo Thinkpad T14 gen (BIOS 1.34).  Also it
> > was confirmed that no regression is seen on another Thinkpad T14
> > machine that has worked without the patch, too.
> > 
> > Fixes: 44cf53602f5a ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"")
> > BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1189207
> > Signed-off-by: Takashi Iwai <tiwai@suse.de>
> > ---
> >  drivers/usb/host/xhci-pci-renesas.c | 35 +++++++++++++++++++----------
> >  1 file changed, 23 insertions(+), 12 deletions(-)
> 
> This does not apply to my usb-linus branch, are you sure it is still
> needed in Linus's tree right now?

I guess we can postpone for 5.15.  The patch was written for the code
on linux-next, and I see there have been a few code clean up there.

But the patch itself could be applied to Linus tree with a slight
fuzz, so the stable backport should be fine.

If it's still not cleanly applicable, let me know.  I'll refresh the
patch for whatever preferred branch.


thanks,

Takashi
Greg Kroah-Hartman Aug. 26, 2021, 12:21 p.m. UTC | #5
On Thu, Aug 26, 2021 at 01:55:54PM +0200, Takashi Iwai wrote:
> On Thu, 26 Aug 2021 13:50:13 +0200,
> Greg Kroah-Hartman wrote:
> > 
> > On Thu, Aug 19, 2021 at 01:34:27PM +0200, Takashi Iwai wrote:
> > > The recent attempt to handle an unknown ROM state in the commit
> > > d143825baf15 ("usb: renesas-xhci: Fix handling of unknown ROM state")
> > > resulted in a regression and reverted later by the commit 44cf53602f5a
> > > ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"").
> > > The problem of the former fix was that it treated the failure of
> > > firmware loading as a fatal error.  Since the firmware files aren't
> > > included in the standard linux-firmware tree, most users don't have
> > > them, hence they got the non-working system after that.  The revert
> > > fixed the regression, but also it didn't make the firmware loading
> > > triggered even on the devices that do need it.  So we need still a fix
> > > for them.
> > > 
> > > This is another attempt to handle the unknown ROM state.  Like the
> > > previous fix, this also tries to load the firmware when ROM shows
> > > unknown state.  In this patch, however, the failure of a firmware
> > > loading (such as a missing firmware file) isn't handled as a fatal
> > > error any longer when ROM has been already detected, but it falls back
> > > to the ROM mode like before.  The error is returned only when no ROM
> > > is detected and the firmware loading failed.
> > > 
> > > Along with it, for simplifying the code flow, the detection and the
> > > check of ROM is factored out from renesas_fw_check_running() and done
> > > in the caller side, renesas_xhci_check_request_fw().  It avoids the
> > > redundant ROM checks.
> > > 
> > > The patch was tested on Lenovo Thinkpad T14 gen (BIOS 1.34).  Also it
> > > was confirmed that no regression is seen on another Thinkpad T14
> > > machine that has worked without the patch, too.
> > > 
> > > Fixes: 44cf53602f5a ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"")
> > > BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1189207
> > > Signed-off-by: Takashi Iwai <tiwai@suse.de>
> > > ---
> > >  drivers/usb/host/xhci-pci-renesas.c | 35 +++++++++++++++++++----------
> > >  1 file changed, 23 insertions(+), 12 deletions(-)
> > 
> > This does not apply to my usb-linus branch, are you sure it is still
> > needed in Linus's tree right now?
> 
> I guess we can postpone for 5.15.  The patch was written for the code
> on linux-next, and I see there have been a few code clean up there.
> 
> But the patch itself could be applied to Linus tree with a slight
> fuzz, so the stable backport should be fine.
> 
> If it's still not cleanly applicable, let me know.  I'll refresh the
> patch for whatever preferred branch.

It was not cleanly applicable, 'git am' did not like it against my
usb-linus branch (which is 5.14-rc7 + a few other USB patches not in
this driver).

So if you want to rebase it against that, I will be glad to take it for
5.14-final to resolve this issue.

thanks,

greg k-h
Takashi Iwai Aug. 26, 2021, 12:37 p.m. UTC | #6
On Thu, 26 Aug 2021 14:21:46 +0200,
Greg Kroah-Hartman wrote:
> 
> On Thu, Aug 26, 2021 at 01:55:54PM +0200, Takashi Iwai wrote:
> > On Thu, 26 Aug 2021 13:50:13 +0200,
> > Greg Kroah-Hartman wrote:
> > > 
> > > On Thu, Aug 19, 2021 at 01:34:27PM +0200, Takashi Iwai wrote:
> > > > The recent attempt to handle an unknown ROM state in the commit
> > > > d143825baf15 ("usb: renesas-xhci: Fix handling of unknown ROM state")
> > > > resulted in a regression and reverted later by the commit 44cf53602f5a
> > > > ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"").
> > > > The problem of the former fix was that it treated the failure of
> > > > firmware loading as a fatal error.  Since the firmware files aren't
> > > > included in the standard linux-firmware tree, most users don't have
> > > > them, hence they got the non-working system after that.  The revert
> > > > fixed the regression, but also it didn't make the firmware loading
> > > > triggered even on the devices that do need it.  So we need still a fix
> > > > for them.
> > > > 
> > > > This is another attempt to handle the unknown ROM state.  Like the
> > > > previous fix, this also tries to load the firmware when ROM shows
> > > > unknown state.  In this patch, however, the failure of a firmware
> > > > loading (such as a missing firmware file) isn't handled as a fatal
> > > > error any longer when ROM has been already detected, but it falls back
> > > > to the ROM mode like before.  The error is returned only when no ROM
> > > > is detected and the firmware loading failed.
> > > > 
> > > > Along with it, for simplifying the code flow, the detection and the
> > > > check of ROM is factored out from renesas_fw_check_running() and done
> > > > in the caller side, renesas_xhci_check_request_fw().  It avoids the
> > > > redundant ROM checks.
> > > > 
> > > > The patch was tested on Lenovo Thinkpad T14 gen (BIOS 1.34).  Also it
> > > > was confirmed that no regression is seen on another Thinkpad T14
> > > > machine that has worked without the patch, too.
> > > > 
> > > > Fixes: 44cf53602f5a ("Revert "usb: renesas-xhci: Fix handling of unknown ROM state"")
> > > > BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1189207
> > > > Signed-off-by: Takashi Iwai <tiwai@suse.de>
> > > > ---
> > > >  drivers/usb/host/xhci-pci-renesas.c | 35 +++++++++++++++++++----------
> > > >  1 file changed, 23 insertions(+), 12 deletions(-)
> > > 
> > > This does not apply to my usb-linus branch, are you sure it is still
> > > needed in Linus's tree right now?
> > 
> > I guess we can postpone for 5.15.  The patch was written for the code
> > on linux-next, and I see there have been a few code clean up there.
> > 
> > But the patch itself could be applied to Linus tree with a slight
> > fuzz, so the stable backport should be fine.
> > 
> > If it's still not cleanly applicable, let me know.  I'll refresh the
> > patch for whatever preferred branch.
> 
> It was not cleanly applicable, 'git am' did not like it against my
> usb-linus branch (which is 5.14-rc7 + a few other USB patches not in
> this driver).
> 
> So if you want to rebase it against that, I will be glad to take it for
> 5.14-final to resolve this issue.

OK, then let me resubmit.  Wait for a minute...


thanks,

Takashi
diff mbox series

Patch

diff --git a/drivers/usb/host/xhci-pci-renesas.c b/drivers/usb/host/xhci-pci-renesas.c
index aa88e57649a9..52599d96634f 100644
--- a/drivers/usb/host/xhci-pci-renesas.c
+++ b/drivers/usb/host/xhci-pci-renesas.c
@@ -207,7 +207,8 @@  static int renesas_check_rom_state(struct pci_dev *pdev)
 			return 0;
 
 		case RENESAS_ROM_STATUS_NO_RESULT: /* No result yet */
-			return 0;
+			dev_dbg(&pdev->dev, "Unknown ROM status ...\n");
+			return -ENOENT;
 
 		case RENESAS_ROM_STATUS_ERROR: /* Error State */
 		default: /* All other states are marked as "Reserved states" */
@@ -224,14 +225,6 @@  static int renesas_fw_check_running(struct pci_dev *pdev)
 	u8 fw_state;
 	int err;
 
-	/* Check if device has ROM and loaded, if so skip everything */
-	err = renesas_check_rom(pdev);
-	if (err) { /* we have rom */
-		err = renesas_check_rom_state(pdev);
-		if (!err)
-			return err;
-	}
-
 	/*
 	 * Test if the device is actually needing the firmware. As most
 	 * BIOSes will initialize the device for us. If the device is
@@ -591,21 +584,39 @@  int renesas_xhci_check_request_fw(struct pci_dev *pdev,
 			(struct xhci_driver_data *)id->driver_data;
 	const char *fw_name = driver_data->firmware;
 	const struct firmware *fw;
+	bool has_rom;
 	int err;
 
+	/* Check if device has ROM and loaded, if so skip everything */
+	has_rom = renesas_check_rom(pdev);
+	if (has_rom) {
+		err = renesas_check_rom_state(pdev);
+		if (!err)
+			return 0;
+		else if (err != -ENOENT)
+			has_rom = false;
+	}
+
 	err = renesas_fw_check_running(pdev);
 	/* Continue ahead, if the firmware is already running. */
 	if (!err)
 		return 0;
 
+	/* no firmware interface available */
 	if (err != 1)
-		return err;
+		return has_rom ? 0 : err;
 
 	pci_dev_get(pdev);
-	err = request_firmware(&fw, fw_name, &pdev->dev);
+	err = firmware_request_nowarn(&fw, fw_name, &pdev->dev);
 	pci_dev_put(pdev);
 	if (err) {
-		dev_err(&pdev->dev, "request_firmware failed: %d\n", err);
+		if (has_rom) {
+			dev_info(&pdev->dev, "failed to load firmware %s, fallback to ROM\n",
+				 fw_name);
+			return 0;
+		}
+		dev_err(&pdev->dev, "failed to load firmware %s: %d\n",
+			fw_name, err);
 		return err;
 	}