| From f9420f4757752f056144896024d5ea89e5a611f1 Mon Sep 17 00:00:00 2001 |
| From: Marek Vasut <marek.vasut+renesas@mailbox.org> |
| Date: Sun, 3 Aug 2025 00:55:20 +0200 |
| Subject: usb: renesas-xhci: Fix External ROM access timeouts |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Marek Vasut <marek.vasut+renesas@mailbox.org> |
| |
| commit f9420f4757752f056144896024d5ea89e5a611f1 upstream. |
| |
| Increase the External ROM access timeouts to prevent failures during |
| programming of External SPI EEPROM chips. The current timeouts are |
| too short for some SPI EEPROMs used with uPD720201 controllers. |
| |
| The current timeout for Chip Erase in renesas_rom_erase() is 100 ms , |
| the current timeout for Sector Erase issued by the controller before |
| Page Program in renesas_fw_download_image() is also 100 ms. Neither |
| timeout is sufficient for e.g. the Macronix MX25L5121E or MX25V5126F. |
| |
| MX25L5121E reference manual [1] page 35 section "ERASE AND PROGRAMMING |
| PERFORMANCE" and page 23 section "Table 8. AC CHARACTERISTICS (Temperature |
| = 0°C to 70°C for Commercial grade, VCC = 2.7V ~ 3.6V)" row "tCE" indicate |
| that the maximum time required for Chip Erase opcode to complete is 2 s, |
| and for Sector Erase it is 300 ms . |
| |
| MX25V5126F reference manual [2] page 47 section "13. ERASE AND PROGRAMMING |
| PERFORMANCE (2.3V - 3.6V)" and page 42 section "Table 8. AC CHARACTERISTICS |
| (Temperature = -40°C to 85°C for Industrial grade, VCC = 2.3V - 3.6V)" row |
| "tCE" indicate that the maximum time required for Chip Erase opcode to |
| complete is 3.2 s, and for Sector Erase it is 400 ms . |
| |
| Update the timeouts such, that Chip Erase timeout is set to 5 seconds, |
| and Sector Erase timeout is set to 500 ms. Such lengthy timeouts ought |
| to be sufficient for majority of SPI EEPROM chips. |
| |
| [1] https://www.macronix.com/Lists/Datasheet/Attachments/8634/MX25L5121E,%203V,%20512Kb,%20v1.3.pdf |
| [2] https://www.macronix.com/Lists/Datasheet/Attachments/8750/MX25V5126F,%202.5V,%20512Kb,%20v1.1.pdf |
| |
| Fixes: 2478be82de44 ("usb: renesas-xhci: Add ROM loader for uPD720201") |
| Cc: stable <stable@kernel.org> |
| Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org> |
| Link: https://lore.kernel.org/r/20250802225526.25431-1-marek.vasut+renesas@mailbox.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/usb/host/xhci-pci-renesas.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/usb/host/xhci-pci-renesas.c |
| +++ b/drivers/usb/host/xhci-pci-renesas.c |
| @@ -47,8 +47,9 @@ |
| #define RENESAS_ROM_ERASE_MAGIC 0x5A65726F |
| #define RENESAS_ROM_WRITE_MAGIC 0x53524F4D |
| |
| -#define RENESAS_RETRY 10000 |
| -#define RENESAS_DELAY 10 |
| +#define RENESAS_RETRY 50000 /* 50000 * RENESAS_DELAY ~= 500ms */ |
| +#define RENESAS_CHIP_ERASE_RETRY 500000 /* 500000 * RENESAS_DELAY ~= 5s */ |
| +#define RENESAS_DELAY 10 |
| |
| static int renesas_fw_download_image(struct pci_dev *dev, |
| const u32 *fw, size_t step, bool rom) |
| @@ -405,7 +406,7 @@ static void renesas_rom_erase(struct pci |
| /* sleep a bit while ROM is erased */ |
| msleep(20); |
| |
| - for (i = 0; i < RENESAS_RETRY; i++) { |
| + for (i = 0; i < RENESAS_CHIP_ERASE_RETRY; i++) { |
| retval = pci_read_config_byte(pdev, RENESAS_ROM_STATUS, |
| &status); |
| status &= RENESAS_ROM_STATUS_ERASE; |