ath10k: allow loading device specific board files
[deliverable/linux.git] / drivers / net / wireless / ath / ath10k / core.c
index 70f5b7acc41105fbc83360fa6dd5917a3a206e62..987b266278a85915eb0a1936f9c5010386459cf9 100644 (file)
@@ -482,10 +482,26 @@ static int ath10k_fetch_cal_file(struct ath10k *ar)
        return 0;
 }
 
-static int ath10k_core_fetch_board_file(struct ath10k *ar)
+static int ath10k_core_fetch_spec_board_file(struct ath10k *ar)
 {
-       int ret;
+       char filename[100];
+
+       scnprintf(filename, sizeof(filename), "board-%s-%s.bin",
+                 ath10k_bus_str(ar->hif.bus), ar->spec_board_id);
+
+       ar->board = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir, filename);
+       if (IS_ERR(ar->board))
+               return PTR_ERR(ar->board);
+
+       ar->board_data = ar->board->data;
+       ar->board_len = ar->board->size;
+       ar->spec_board_loaded = true;
 
+       return 0;
+}
+
+static int ath10k_core_fetch_generic_board_file(struct ath10k *ar)
+{
        if (!ar->hw_params.fw.board) {
                ath10k_err(ar, "failed to find board file fw entry\n");
                return -EINVAL;
@@ -494,14 +510,39 @@ static int ath10k_core_fetch_board_file(struct ath10k *ar)
        ar->board = ath10k_fetch_fw_file(ar,
                                         ar->hw_params.fw.dir,
                                         ar->hw_params.fw.board);
-       if (IS_ERR(ar->board)) {
-               ret = PTR_ERR(ar->board);
-               ath10k_err(ar, "failed to fetch board data: %d\n", ret);
-               return ret;
-       }
+       if (IS_ERR(ar->board))
+               return PTR_ERR(ar->board);
 
        ar->board_data = ar->board->data;
        ar->board_len = ar->board->size;
+       ar->spec_board_loaded = false;
+
+       return 0;
+}
+
+static int ath10k_core_fetch_board_file(struct ath10k *ar)
+{
+       int ret;
+
+       if (strlen(ar->spec_board_id) > 0) {
+               ret = ath10k_core_fetch_spec_board_file(ar);
+               if (ret) {
+                       ath10k_info(ar, "failed to load spec board file, falling back to generic: %d\n",
+                                   ret);
+                       goto generic;
+               }
+
+               ath10k_dbg(ar, ATH10K_DBG_BOOT, "found specific board file for %s\n",
+                          ar->spec_board_id);
+               return 0;
+       }
+
+generic:
+       ret = ath10k_core_fetch_generic_board_file(ar);
+       if (ret) {
+               ath10k_err(ar, "failed to fetch generic board data: %d\n", ret);
+               return ret;
+       }
 
        return 0;
 }
This page took 0.03434 seconds and 5 git commands to generate.