Replying again ... Thanks for the review Jeff, I have replied below and will address these comments in next iteration. I will wait for a day more to get some more reviews and collectively make the change. On Mon, May 9, 2022 at 10:22 AM Jeff Johnson <quic_jjohnson@xxxxxxxxxxx> wrote: > > On 5/8/2022 7:26 PM, Abhishek Kumar wrote: > > Board data files wrapped inside board-2.bin files are > > identified based on a combination of bus architecture, > > chip-id, board-id or variants. Here is one such example > > of a BDF entry in board-2.bin file: > > bus=snoc,qmi-board-id=67,qmi-chip-id=320,variant=GO_XXXX > > It is possible for few platforms none of the combinations > > of bus,qmi-board,chip-id or variants match, e.g. if > > board-id is not programmed and thus reads board-id=0xff, > > there won't be any matching BDF to be found. In such > > situations, the wlan will fail to enumerate. > > > > Currently, to search for BDF, there are two fallback > > boardnames creates to search for BDFs in case the full BDF > > is not found. It is still possible that even the fallback > > boardnames do not match. > > > > As an improvement, search for BDF with full BDF combination > > and perform the fallback searches by stripping down the last > > elements until a BDF entry is found or none is found for all > > possible BDF combinations.e.g. > > Search for initial BDF first then followed by reduced BDF > > names as follows: > > bus=snoc,qmi-board-id=67,qmi-chip-id=320,variant=GO_XXXX > > bus=snoc,qmi-board-id=67,qmi-chip-id=320 > > bus=snoc,qmi-board-id=67 > > bus=snoc > > <No BDF found> > > > > Tested-on: WCN3990/hw1.0 WLAN.HL.3.2.2.c10-00754-QCAHLSWMTPL-1 > > Signed-off-by: Abhishek Kumar <kuabhs@xxxxxxxxxxxx> > > --- > > > > Changes in v3: > > - As discussed, instead of adding support for default BDF in DT, added > > a method to drop the last elements from full BDF until a BDF is found. > > - Previous patch was "ath10k: search for default BDF name provided in DT" > > > > drivers/net/wireless/ath/ath10k/core.c | 65 +++++++++++++------------- > > 1 file changed, 32 insertions(+), 33 deletions(-) > > > > diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c > > index 688177453b07..ebb0d2a02c28 100644 > > --- a/drivers/net/wireless/ath/ath10k/core.c > > +++ b/drivers/net/wireless/ath/ath10k/core.c > > @@ -1426,15 +1426,31 @@ static int ath10k_core_search_bd(struct ath10k *ar, > > return ret; > > } > > > > +static bool ath10k_create_reduced_boardname(struct ath10k *ar, char *boardname) > > +{ > > + /* Find last BDF element */ > > + char *last_field = strrchr(boardname, ','); > > + > > + if (last_field) { > > + /* Drop the last BDF element */ > > + last_field[0] = '\0'; > > + ath10k_dbg(ar, ATH10K_DBG_BOOT, > > + "boardname =%s\n", boardname); > > nit: strange spacing in the message. i'd expect consistent spacing on > both side of "=", either one space on both sides or no space on both > sides. also the use of "=" here is inconsistent with the use of ":" in > a log later below Ack, will fix this in the next iteration. > > > > + return 0; > > + } > > + return -ENODATA; > > +} > > + > > static int ath10k_core_fetch_board_data_api_n(struct ath10k *ar, > > const char *boardname, > > - const char *fallback_boardname1, > > - const char *fallback_boardname2, > > const char *filename) > > { > > - size_t len, magic_len; > > + size_t len, magic_len, board_len; > > const u8 *data; > > int ret; > > + char temp_boardname[100]; > > + > > + board_len = 100 * sizeof(temp_boardname[0]); > > > > /* Skip if already fetched during board data download */ > > if (!ar->normal_mode_fw.board) > > @@ -1474,20 +1490,24 @@ static int ath10k_core_fetch_board_data_api_n(struct ath10k *ar, > > data += magic_len; > > len -= magic_len; > > > > - /* attempt to find boardname in the IE list */ > > - ret = ath10k_core_search_bd(ar, boardname, data, len); > > + memcpy(temp_boardname, boardname, board_len); > > + ath10k_dbg(ar, ATH10K_DBG_BOOT, "boardname :%s\n", boardname); > > nit: use of ":" inconsistent with use of "=" noted above. > also expect space after ":, not before: "boardname: %s\n" > Ack, will remove the extra space. > > > > > > - /* if we didn't find it and have a fallback name, try that */ > > - if (ret == -ENOENT && fallback_boardname1) > > - ret = ath10k_core_search_bd(ar, fallback_boardname1, data, len); > > +retry_search: > > + /* attempt to find boardname in the IE list */ > > + ret = ath10k_core_search_bd(ar, temp_boardname, data, len); > > > > - if (ret == -ENOENT && fallback_boardname2) > > - ret = ath10k_core_search_bd(ar, fallback_boardname2, data, len); > > + /* If the full BDF entry was not found then drop the last element and > > + * recheck until a BDF is found or until all options are exhausted. > > + */ > > + if (ret == -ENOENT) > > + if (!ath10k_create_reduced_boardname(ar, temp_boardname)) > > + goto retry_search; > > > > if (ret == -ENOENT) { > > note that ath10k_create_reduced_boardname() returns -ENODATA when > truncation fails and hence you won't log this error when that occurs Hmmm, I think it makes sense to log each failure to find as a debug log and log as err only if nothing matches (when ENODATA is returned). > > > > ath10k_err(ar, > > "failed to fetch board data for %s from %s/%s\n", > > - boardname, ar->hw_params.fw.dir, filename); > > + temp_boardname, ar->hw_params.fw.dir, filename); > > does it really make sense to log the last name tried, temp_boardname? or > does it make more sense to still log the original name, boardname? Thinking about it a bit more, it makes sense to log the original name rather than last name. > > > maybe log each failure in the loop, before calling > ath10k_create_reduced_boardname()? As mentioned above, it makes sense to log as debug for each failure to find and log as error if nothing matches, will make this change in the next iteration. > ret = -ENODATA; > } > > @@ -1566,7 +1586,7 @@ static int ath10k_core_create_eboard_name(struct ath10k *ar, char *name, > > int ath10k_core_fetch_board_file(struct ath10k *ar, int bd_ie_type) > { > - char boardname[100], fallback_boardname1[100], fallback_boardname2[100]; > + char boardname[100]; > int ret; > > if (bd_ie_type == ATH10K_BD_IE_BOARD) { > @@ -1579,25 +1599,6 @@ int ath10k_core_fetch_board_file(struct ath10k *ar, int bd_ie_type) > return ret; > } > > - /* Without variant and only chip-id */ > - ret = ath10k_core_create_board_name(ar, fallback_boardname1, > - sizeof(boardname), false, > - true); > - if (ret) { > - ath10k_err(ar, "failed to create 1st fallback board name: %d", > - ret); > - return ret; > - } > - > - /* Without variant and without chip-id */ > - ret = ath10k_core_create_board_name(ar, fallback_boardname2, > - sizeof(boardname), false, > - false); > - if (ret) { > - ath10k_err(ar, "failed to create 2nd fallback board name: %d", > - ret); > - return ret; > - } > } else if (bd_ie_type == ATH10K_BD_IE_BOARD_EXT) { > ret = ath10k_core_create_eboard_name(ar, boardname, > sizeof(boardname)); > @@ -1609,8 +1610,6 @@ int ath10k_core_fetch_board_file(struct ath10k *ar, int bd_ie_type) > > ar->bd_api = 2; > ret = ath10k_core_fetch_board_data_api_n(ar, boardname, > - fallback_boardname1, > - fallback_boardname2, > ATH10K_BOARD_API2_FILE); > if (!ret) > goto success; -Abhishek On Mon, May 9, 2022 at 7:04 PM Abhishek Kumar <kuabhs@xxxxxxxxxx> wrote: > > Thanks for the review Jeff, I have replied below and will address these comments in next iteration. I will wait for a day more to get some more reviews and collectively make the change. > > On Mon, May 9, 2022 at 10:22 AM Jeff Johnson <quic_jjohnson@xxxxxxxxxxx> wrote: >> >> On 5/8/2022 7:26 PM, Abhishek Kumar wrote: >> > Board data files wrapped inside board-2.bin files are >> > identified based on a combination of bus architecture, >> > chip-id, board-id or variants. Here is one such example >> > of a BDF entry in board-2.bin file: >> > bus=snoc,qmi-board-id=67,qmi-chip-id=320,variant=GO_XXXX >> > It is possible for few platforms none of the combinations >> > of bus,qmi-board,chip-id or variants match, e.g. if >> > board-id is not programmed and thus reads board-id=0xff, >> > there won't be any matching BDF to be found. In such >> > situations, the wlan will fail to enumerate. >> > >> > Currently, to search for BDF, there are two fallback >> > boardnames creates to search for BDFs in case the full BDF >> > is not found. It is still possible that even the fallback >> > boardnames do not match. >> > >> > As an improvement, search for BDF with full BDF combination >> > and perform the fallback searches by stripping down the last >> > elements until a BDF entry is found or none is found for all >> > possible BDF combinations.e.g. >> > Search for initial BDF first then followed by reduced BDF >> > names as follows: >> > bus=snoc,qmi-board-id=67,qmi-chip-id=320,variant=GO_XXXX >> > bus=snoc,qmi-board-id=67,qmi-chip-id=320 >> > bus=snoc,qmi-board-id=67 >> > bus=snoc >> > <No BDF found> >> > >> > Tested-on: WCN3990/hw1.0 WLAN.HL.3.2.2.c10-00754-QCAHLSWMTPL-1 >> > Signed-off-by: Abhishek Kumar <kuabhs@xxxxxxxxxxxx> >> > --- >> > >> > Changes in v3: >> > - As discussed, instead of adding support for default BDF in DT, added >> > a method to drop the last elements from full BDF until a BDF is found. >> > - Previous patch was "ath10k: search for default BDF name provided in DT" >> > >> > drivers/net/wireless/ath/ath10k/core.c | 65 +++++++++++++------------- >> > 1 file changed, 32 insertions(+), 33 deletions(-) >> > >> > diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c >> > index 688177453b07..ebb0d2a02c28 100644 >> > --- a/drivers/net/wireless/ath/ath10k/core.c >> > +++ b/drivers/net/wireless/ath/ath10k/core.c >> > @@ -1426,15 +1426,31 @@ static int ath10k_core_search_bd(struct ath10k *ar, >> > return ret; >> > } >> > >> > +static bool ath10k_create_reduced_boardname(struct ath10k *ar, char *boardname) >> > +{ >> > + /* Find last BDF element */ >> > + char *last_field = strrchr(boardname, ','); >> > + >> > + if (last_field) { >> > + /* Drop the last BDF element */ >> > + last_field[0] = '\0'; >> > + ath10k_dbg(ar, ATH10K_DBG_BOOT, >> > + "boardname =%s\n", boardname); >> >> nit: strange spacing in the message. i'd expect consistent spacing on >> both side of "=", either one space on both sides or no space on both >> sides. also the use of "=" here is inconsistent with the use of ":" in >> a log later below > > Ack, will fix this in the next iteration. >> >> >> > + return 0; >> > + } >> > + return -ENODATA; >> > +} >> > + >> > static int ath10k_core_fetch_board_data_api_n(struct ath10k *ar, >> > const char *boardname, >> > - const char *fallback_boardname1, >> > - const char *fallback_boardname2, >> > const char *filename) >> > { >> > - size_t len, magic_len; >> > + size_t len, magic_len, board_len; >> > const u8 *data; >> > int ret; >> > + char temp_boardname[100]; >> > + >> > + board_len = 100 * sizeof(temp_boardname[0]); >> > >> > /* Skip if already fetched during board data download */ >> > if (!ar->normal_mode_fw.board) >> > @@ -1474,20 +1490,24 @@ static int ath10k_core_fetch_board_data_api_n(struct ath10k *ar, >> > data += magic_len; >> > len -= magic_len; >> > >> > - /* attempt to find boardname in the IE list */ >> > - ret = ath10k_core_search_bd(ar, boardname, data, len); >> > + memcpy(temp_boardname, boardname, board_len); >> > + ath10k_dbg(ar, ATH10K_DBG_BOOT, "boardname :%s\n", boardname); >> >> nit: use of ":" inconsistent with use of "=" noted above. >> also expect space after ":, not before: "boardname: %s\n" >> > Ack, will remove the extra space. >> >> >> > >> > - /* if we didn't find it and have a fallback name, try that */ >> > - if (ret == -ENOENT && fallback_boardname1) >> > - ret = ath10k_core_search_bd(ar, fallback_boardname1, data, len); >> > +retry_search: >> > + /* attempt to find boardname in the IE list */ >> > + ret = ath10k_core_search_bd(ar, temp_boardname, data, len); >> > >> > - if (ret == -ENOENT && fallback_boardname2) >> > - ret = ath10k_core_search_bd(ar, fallback_boardname2, data, len); >> > + /* If the full BDF entry was not found then drop the last element and >> > + * recheck until a BDF is found or until all options are exhausted. >> > + */ >> > + if (ret == -ENOENT) >> > + if (!ath10k_create_reduced_boardname(ar, temp_boardname)) >> > + goto retry_search; >> > >> > if (ret == -ENOENT) { >> >> note that ath10k_create_reduced_boardname() returns -ENODATA when >> truncation fails and hence you won't log this error when that occurs > > Hmmm, I think it makes sense to log each failure to find as a debug log and log as err only if nothing matches (when ENODATA is returned). >> >> >> > ath10k_err(ar, >> > "failed to fetch board data for %s from %s/%s\n", >> > - boardname, ar->hw_params.fw.dir, filename); >> > + temp_boardname, ar->hw_params.fw.dir, filename); >> >> does it really make sense to log the last name tried, temp_boardname? or >> does it make more sense to still log the original name, boardname? > > Thinking about it a bit more, it makes sense to log the original name rather than last name. >> >> >> maybe log each failure in the loop, before calling >> ath10k_create_reduced_boardname()? > > As mentioned above, it makes sense to log as debug for each failure to find and log as error if nothing matches, will make this change in next iteration. >> >> >> > ret = -ENODATA; >> > } >> > >> > @@ -1566,7 +1586,7 @@ static int ath10k_core_create_eboard_name(struct ath10k *ar, char *name, >> > >> > int ath10k_core_fetch_board_file(struct ath10k *ar, int bd_ie_type) >> > { >> > - char boardname[100], fallback_boardname1[100], fallback_boardname2[100]; >> > + char boardname[100]; >> > int ret; >> > >> > if (bd_ie_type == ATH10K_BD_IE_BOARD) { >> > @@ -1579,25 +1599,6 @@ int ath10k_core_fetch_board_file(struct ath10k *ar, int bd_ie_type) >> > return ret; >> > } >> > >> > - /* Without variant and only chip-id */ >> > - ret = ath10k_core_create_board_name(ar, fallback_boardname1, >> > - sizeof(boardname), false, >> > - true); >> > - if (ret) { >> > - ath10k_err(ar, "failed to create 1st fallback board name: %d", >> > - ret); >> > - return ret; >> > - } >> > - >> > - /* Without variant and without chip-id */ >> > - ret = ath10k_core_create_board_name(ar, fallback_boardname2, >> > - sizeof(boardname), false, >> > - false); >> > - if (ret) { >> > - ath10k_err(ar, "failed to create 2nd fallback board name: %d", >> > - ret); >> > - return ret; >> > - } >> > } else if (bd_ie_type == ATH10K_BD_IE_BOARD_EXT) { >> > ret = ath10k_core_create_eboard_name(ar, boardname, >> > sizeof(boardname)); >> > @@ -1609,8 +1610,6 @@ int ath10k_core_fetch_board_file(struct ath10k *ar, int bd_ie_type) >> > >> > ar->bd_api = 2; >> > ret = ath10k_core_fetch_board_data_api_n(ar, boardname, >> > - fallback_boardname1, >> > - fallback_boardname2, >> > ATH10K_BOARD_API2_FILE); >> > if (!ret) >> > goto success; > > -Abhishek