Hi, On 9-Jun-25 4:49 PM, Hans de Goede wrote: > Hi Niklas, > > On 9-Jun-25 3:45 PM, Niklas Cassel wrote: >> Currently, the match table in ahci_broken_lpm() contains DMI BIOS dates >> of BIOSes that are known to be working. >> >> Having a list of known to be working versions is usually the wrong way to >> do things (as this list could theoretically be infinite). >> >> Refactor this match table to contain DMI BIOS dates of BIOSes that are >> known to not be working, such that this list can be extended with BIOS >> versions (for other boards) that are known to not be working, where there >> is no good BIOS version (because all released versions are broken). >> >> Signed-off-by: Niklas Cassel <cassel@xxxxxxxxxx> >> --- >> drivers/ata/ahci.c | 34 ++++++++++++++++++++++++---------- >> 1 file changed, 24 insertions(+), 10 deletions(-) >> >> diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c >> index 163ac909bd06..a6ce172fa928 100644 >> --- a/drivers/ata/ahci.c >> +++ b/drivers/ata/ahci.c >> @@ -1411,27 +1411,39 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) >> static bool ahci_broken_lpm(struct pci_dev *pdev) >> { >> static const struct dmi_system_id sysids[] = { >> - /* Various Lenovo 50 series have LPM issues with older BIOSen */ >> + /* Table contains DMI BIOS dates of BIOSes with broken LPM. */ >> { >> .matches = { >> DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), >> DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X250"), >> }, >> - .driver_data = "20180406", /* 1.31 */ >> + /* >> + * 1.31, released 20180406, has working LPM, mark any >> + * DMI BIOS date before that as broken. >> + */ > > Note the DMI_BIOS_DATE field is the data the BIOS was build, I would avoid > the word "released" here since release-notes doucments often contain different > dates then the actual build date (e.g. see below). > >> + .driver_data = "20180405", >> }, >> { >> .matches = { >> DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), >> DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L450"), >> }, >> - .driver_data = "20180420", /* 1.28 */ >> + /* >> + * 1.28, released 20180420, has working LPM, mark any >> + * DMI BIOS date before that as broken. >> + */ >> + .driver_data = "20180419", >> }, >> { >> .matches = { >> DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), >> DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T450s"), >> }, >> - .driver_data = "20180315", /* 1.33 */ >> + /* >> + * 1.33, released 20180315, has working LPM, mark any >> + * DMI BIOS date before that as broken. >> + */ >> + .driver_data = "20180314", >> }, >> { >> .matches = { >> @@ -1439,12 +1451,14 @@ static bool ahci_broken_lpm(struct pci_dev *pdev) >> DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W541"), >> }, >> /* >> - * Note date based on release notes, 2.35 has been >> - * reported to be good, but I've been unable to get >> - * a hold of the reporter to get the DMI BIOS date. >> - * TODO: fix this. >> + * Note: according to release notes, version 2.35 has >> + * working LPM, but we do not have the DMI BIOS date for >> + * this version, so the date, 20180310, is based on the >> + * release notes. Mark any DMI BIOS date before that as >> + * broken. >> + * TODO: find with date with DMI BIOS date. >> */ >> - .driver_data = "20180310", /* 2.35 */ >> + .driver_data = "20180309", > > This reminds me that I did eventually got the actual BIOS date from > the reporter. After some digging I managed to find the email. > > The first known working BIOS has a BIOS build date of 04/09/2018 so that > would become "20180409" before your patch / "20180408" after your patch. > > I guess you may want to add a prep patch before the rest of this > series before this patch to make things a bit cleaner. Quick followup on this, the original "20180310" was picked to be one day older then the release-date (which is always after the build-date) of the known broken 2.34 version. Here are the release-dates from the release-notes: https://download.lenovo.com/pccbbs/mobiles/gnuj39us.txt 2.42 (GNUJ39US) 2.42 (GNET94WW) 1.15 (GMHT30WW) 01 2021/06/10 2.41 (GNUJ38US) 2.41 (GNET93WW) 1.15 (GMHT30WW) 01 2020/05/11 2.40 (GNUJ37US) 2.40 (GNET92WW) 1.15 (GMHT30WW) 01 2019/09/12 2.39 (GNUJ36US) 2.39 (GNET91WW) 1.14 (GMHT29WW) 01 2019/06/05 2.38 (GNUJ35US) 2.38 (GNET90WW) 1.14 (GMHT29WW) 01 2019/03/29 2.37 (GNUJ34US) 2.37 (GNET89WW) 1.14 (GMHT29WW) 01 2018/11/30 2.36 (GNUJ33US) 2.36 (GNET88WW) 1.14 (GMHT29WW) 01 2018/06/21 2.35 (GNUJ32US) 2.35 (GNET87WW) 1.14 (GMHT29WW) 01 2018/04/16 2.34 (GNUJ31US) 2.34 (GNET86WW) 1.14 (GMHT29WW) 01 2018/03/09 2.33 (GNUJ30US) 2.33 (GNET85WW) 1.14 (GMHT29WW) 01 2017/12/20 2.32 (GNUJ29US) 2.32 (GNET84WW) 1.14 (GMHT29WW) 01 2017/09/21 2.31 (GNUJ28US) 2.31 (GNET83WW) 1.14 (GMHT29WW) 01 2017/05/11 2.30 (GNUJ27US) 2.30 (GNET82WW) 1.14 (GMHT29WW) 01 2017/04/07 As you can see the known working 2.35 was released at 2018/04/16 so just a few days after its build date of 2018/04/09 . Regards, Hans >> }, >> { } /* terminate list */ >> }; >> @@ -1458,7 +1472,7 @@ static bool ahci_broken_lpm(struct pci_dev *pdev) >> dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); >> snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); >> >> - return strcmp(buf, dmi->driver_data) < 0; >> + return strcmp(buf, dmi->driver_data) <= 0; >> } >> >> static bool ahci_broken_online(struct pci_dev *pdev) >