Lines Matching refs:wil
11 #define wil_err_fw(wil, fmt, arg...) wil_err(wil, "ERR[ FW ]" fmt, ##arg)
12 #define wil_dbg_fw(wil, fmt, arg...) wil_dbg(wil, "DBG[ FW ]" fmt, ##arg)
19 static bool wil_fw_addr_check(struct wil6210_priv *wil,
23 *ioaddr = wmi_buffer_block(wil, val, size);
25 wil_err_fw(wil, "bad %s: 0x%08x\n", msg, le32_to_cpu(val));
39 static int wil_fw_verify(struct wil6210_priv *wil, const u8 *data, size_t size)
48 wil_err_fw(wil, "image size not aligned: %zu\n", size);
53 wil_err_fw(wil, "file too short: %zu bytes\n", size);
59 wil_err_fw(wil, "no file header\n");
67 wil_err_fw(wil, "data length not aligned: %lu\n", (ulong)dlen);
71 wil_err_fw(wil, "file truncated at %zu/%lu\n",
76 wil_err_fw(wil, "data length too short: %lu\n", (ulong)dlen);
82 wil_err_fw(wil, "bad header signature: 0x%08x\n",
89 wil_err_fw(wil, "unsupported header version: %d\n",
105 wil_err_fw(wil, "checksum mismatch:"
114 static int fw_ignore_section(struct wil6210_priv *wil, const void *data,
121 fw_handle_capabilities(struct wil6210_priv *wil, const void *data,
128 wil_err_fw(wil, "capabilities record too short: %zu\n", size);
135 bitmap_zero(wil->fw_capabilities, WMI_FW_CAPABILITY_MAX);
136 memcpy(wil->fw_capabilities, rec->capabilities,
137 min_t(size_t, sizeof(wil->fw_capabilities), capa_size));
144 fw_handle_brd_file(struct wil6210_priv *wil, const void *data,
151 wil_err(wil, "board record too short, size %zu\n", size);
159 wil_err(wil, "brd info entries are missing\n");
163 wil->brd_info = kcalloc(max_num_ent, sizeof(struct wil_brd_info),
165 if (!wil->brd_info)
169 wil->brd_info[i].file_addr =
171 wil->brd_info[i].file_max_size =
174 if (!wil->brd_info[i].file_addr)
177 wil_dbg_fw(wil,
179 i, wil->brd_info[i].file_addr,
180 wil->brd_info[i].file_max_size);
183 wil->num_of_brd_entries = i;
184 if (wil->num_of_brd_entries == 0) {
185 kfree(wil->brd_info);
186 wil->brd_info = NULL;
187 wil_dbg_fw(wil,
191 wil_dbg_fw(wil, "num of brd info entries %d\n",
192 wil->num_of_brd_entries);
199 fw_handle_concurrency(struct wil6210_priv *wil, const void *data,
209 wil_err_fw(wil, "concurrency record too short: %zu\n", size);
230 return wil_cfg80211_iface_combinations_from_fw(wil, rec);
232 wil_err_fw(wil, "concurrency record truncated\n");
237 fw_handle_comment(struct wil6210_priv *wil, const void *data,
251 wil_dbg_fw(wil, "magic is WIL_FW_CAPABILITIES_MAGIC\n");
252 rc = fw_handle_capabilities(wil, data, size);
255 wil_dbg_fw(wil, "magic is WIL_BRD_FILE_MAGIC\n");
256 rc = fw_handle_brd_file(wil, data, size);
259 wil_dbg_fw(wil, "magic is WIL_FW_CONCURRENCY_MAGIC\n");
260 rc = fw_handle_concurrency(wil, data, size);
270 static int __fw_handle_data(struct wil6210_priv *wil, const void *data,
278 wil_err_fw(wil, "data record too short: %zu\n", size);
282 if (!wil_fw_addr_check(wil, &dst, addr, s, "address"))
284 wil_dbg_fw(wil, "write [0x%08x] <== %zu bytes\n", le32_to_cpu(addr), s);
291 static int fw_handle_data(struct wil6210_priv *wil, const void *data,
296 return __fw_handle_data(wil, data, size, d->addr);
299 static int fw_handle_fill(struct wil6210_priv *wil, const void *data,
308 wil_err_fw(wil, "bad size for fill record: %zu\n", size);
313 wil_err_fw(wil, "fill size too short: %zu\n", s);
318 wil_err_fw(wil, "fill size not aligned: %zu\n", s);
322 if (!wil_fw_addr_check(wil, &dst, d->addr, s, "address"))
326 wil_dbg_fw(wil, "fill [0x%08x] <== 0x%08x, %zu bytes\n",
334 static int fw_handle_file_header(struct wil6210_priv *wil, const void *data,
340 wil_err_fw(wil, "file header length incorrect: %zu\n", size);
344 wil_dbg_fw(wil, "new file, ver. %d, %i bytes\n",
351 memcpy(wil->fw_version,
354 sizeof(wil->fw_version) - 1));
359 static int fw_handle_direct_write(struct wil6210_priv *wil, const void *data,
367 wil_err_fw(wil, "record size not aligned on %zu: %zu\n",
379 if (!wil_fw_addr_check(wil, &dst, block[i].addr, 0, "address"))
384 wil_dbg_fw(wil, "write [0x%08x] <== 0x%08x "
394 static int gw_write(struct wil6210_priv *wil, void __iomem *gwa_addr,
408 wil_err_fw(wil, "gw timeout\n");
416 static int fw_handle_gateway_data(struct wil6210_priv *wil, const void *data,
429 wil_err_fw(wil, "gateway record too short: %zu\n", size);
434 wil_err_fw(wil, "gateway record data size"
443 wil_dbg_fw(wil, "gw write record [%3d] blocks, cmd 0x%08x\n",
446 if (!wil_fw_addr_check(wil, &gwa_addr, d->gateway_addr_addr, 0,
448 !wil_fw_addr_check(wil, &gwa_val, d->gateway_value_addr, 0,
450 !wil_fw_addr_check(wil, &gwa_cmd, d->gateway_cmd_addr, 0,
452 !wil_fw_addr_check(wil, &gwa_ctl, d->gateway_ctrl_address, 0,
456 wil_dbg_fw(wil, "gw addresses: addr 0x%08x val 0x%08x"
468 wil_dbg_fw(wil, " gw write[%3d] [0x%08x] <== 0x%08x\n",
472 rc = gw_write(wil, gwa_addr, gwa_cmd, gwa_ctl, gw_cmd, a);
480 static int fw_handle_gateway_data4(struct wil6210_priv *wil, const void *data,
493 wil_err_fw(wil, "gateway4 record too short: %zu\n", size);
498 wil_err_fw(wil, "gateway4 record data size"
507 wil_dbg_fw(wil, "gw4 write record [%3d] blocks, cmd 0x%08x\n",
510 if (!wil_fw_addr_check(wil, &gwa_addr, d->gateway_addr_addr, 0,
514 if (!wil_fw_addr_check(wil, &gwa_val[k],
518 if (!wil_fw_addr_check(wil, &gwa_cmd, d->gateway_cmd_addr, 0,
520 !wil_fw_addr_check(wil, &gwa_ctl, d->gateway_ctrl_address, 0,
524 wil_dbg_fw(wil, "gw4 addresses: addr 0x%08x cmd 0x%08x ctl 0x%08x\n",
540 wil_dbg_fw(wil, " gw4 write[%3d] [0x%08x] <==\n", i, a);
546 rc = gw_write(wil, gwa_addr, gwa_cmd, gwa_ctl, gw_cmd, a);
556 int (*load_handler)(struct wil6210_priv *wil, const void *data,
558 int (*parse_handler)(struct wil6210_priv *wil, const void *data,
574 static int wil_fw_handle_record(struct wil6210_priv *wil, int type,
583 wil, data, size) :
585 wil, data, size);
587 wil_err_fw(wil, "unknown record type: %d\n", type);
599 static int wil_fw_process(struct wil6210_priv *wil, const void *data,
614 wil_err_fw(wil, "unaligned record size: %zu\n",
618 rc = wil_fw_handle_record(wil, le16_to_cpu(hdr->type),
624 wil_err_fw(wil, "unprocessed bytes: %zu\n", size);
626 wil_err_fw(wil, "Stop at offset %ld"
646 int wil_request_firmware(struct wil6210_priv *wil, const char *name,
654 rc = request_firmware(&fw, name, wil_to_dev(wil));
656 wil_err_fw(wil, "Failed to load firmware %s rc %d\n", name, rc);
659 wil_dbg_fw(wil, "Loading <%s>, %zu bytes\n", name, fw->size);
662 wil->num_of_brd_entries = 0;
663 kfree(wil->brd_info);
664 wil->brd_info = NULL;
667 rc1 = wil_fw_verify(wil, d, sz);
672 rc = wil_fw_process(wil, d, rc1, load);
680 wil_err_fw(wil, "Loading <%s> failed, rc %d\n", name, rc);
689 static int wil_brd_process(struct wil6210_priv *wil, const void *data,
715 if (i >= wil->num_of_brd_entries) {
716 wil_err_fw(wil,
718 i, wil->num_of_brd_entries);
724 if (wil->brd_info[i].file_max_size &&
725 hdr_sz > wil->brd_info[i].file_max_size)
730 wil_err_fw(wil, "unaligned record size: %zu\n",
736 wil_err_fw(wil,
742 wil_err_fw(wil, "data record too short: %zu\n", hdr_sz);
746 wil_dbg_fw(wil,
748 i, wil->brd_info[i].file_addr,
749 wil->brd_info[i].file_max_size);
751 rc = __fw_handle_data(wil, &hdr[1], hdr_sz,
752 cpu_to_le32(wil->brd_info[i].file_addr));
758 wil_err_fw(wil, "unprocessed bytes: %zu\n", size);
760 wil_err_fw(wil,
781 int wil_request_board(struct wil6210_priv *wil, const char *name)
786 rc = request_firmware(&brd, name, wil_to_dev(wil));
788 wil_err_fw(wil, "Failed to load brd %s\n", name);
791 wil_dbg_fw(wil, "Loading <%s>, %zu bytes\n", name, brd->size);
794 dlen = wil_fw_verify(wil, brd->data, brd->size);
801 rc = wil_brd_process(wil, brd->data, dlen);
806 wil_err_fw(wil, "Loading <%s> failed, rc %d\n", name, rc);
813 * @wil: driver context
818 bool wil_fw_verify_file_exists(struct wil6210_priv *wil, const char *name)
823 rc = request_firmware(&fw, name, wil_to_dev(wil));
827 wil_dbg_fw(wil, "<%s> not available: %d\n", name, rc);