Lines Matching refs:wil
22 #define wil_err_fw(wil, fmt, arg...) wil_err(wil, "ERR[ FW ]" fmt, ##arg) argument
23 #define wil_dbg_fw(wil, fmt, arg...) wil_dbg(wil, "DBG[ FW ]" fmt, ##arg) argument
30 static bool wil_fw_addr_check(struct wil6210_priv *wil, in wil_fw_addr_check() argument
34 *ioaddr = wmi_buffer_block(wil, val, size); in wil_fw_addr_check()
36 wil_err_fw(wil, "bad %s: 0x%08x\n", msg, le32_to_cpu(val)); in wil_fw_addr_check()
50 static int wil_fw_verify(struct wil6210_priv *wil, const u8 *data, size_t size) in wil_fw_verify() argument
59 wil_err_fw(wil, "image size not aligned: %zu\n", size); in wil_fw_verify()
64 wil_err_fw(wil, "file too short: %zu bytes\n", size); in wil_fw_verify()
70 wil_err_fw(wil, "no file header\n"); in wil_fw_verify()
78 wil_err_fw(wil, "data length not aligned: %lu\n", (ulong)dlen); in wil_fw_verify()
82 wil_err_fw(wil, "file truncated at %zu/%lu\n", in wil_fw_verify()
87 wil_err_fw(wil, "data length too short: %lu\n", (ulong)dlen); in wil_fw_verify()
93 wil_err_fw(wil, "bad header signature: 0x%08x\n", in wil_fw_verify()
100 wil_err_fw(wil, "unsupported header version: %d\n", in wil_fw_verify()
116 wil_err_fw(wil, "checksum mismatch:" in wil_fw_verify()
125 static int fw_ignore_section(struct wil6210_priv *wil, const void *data, in fw_ignore_section() argument
132 fw_handle_capabilities(struct wil6210_priv *wil, const void *data, in fw_handle_capabilities() argument
139 wil_err_fw(wil, "capabilities record too short: %zu\n", size); in fw_handle_capabilities()
146 bitmap_zero(wil->fw_capabilities, WMI_FW_CAPABILITY_MAX); in fw_handle_capabilities()
147 memcpy(wil->fw_capabilities, rec->capabilities, in fw_handle_capabilities()
148 min_t(size_t, sizeof(wil->fw_capabilities), capa_size)); in fw_handle_capabilities()
155 fw_handle_brd_file(struct wil6210_priv *wil, const void *data, in fw_handle_brd_file() argument
161 wil_err_fw(wil, "brd_file record too short: %zu\n", size); in fw_handle_brd_file()
165 wil->brd_file_addr = le32_to_cpu(rec->base_addr); in fw_handle_brd_file()
166 wil->brd_file_max_size = le32_to_cpu(rec->max_size_bytes); in fw_handle_brd_file()
168 wil_dbg_fw(wil, "brd_file_addr 0x%x, brd_file_max_size %d\n", in fw_handle_brd_file()
169 wil->brd_file_addr, wil->brd_file_max_size); in fw_handle_brd_file()
175 fw_handle_concurrency(struct wil6210_priv *wil, const void *data, in fw_handle_concurrency() argument
185 wil_err_fw(wil, "concurrency record too short: %zu\n", size); in fw_handle_concurrency()
206 return wil_cfg80211_iface_combinations_from_fw(wil, rec); in fw_handle_concurrency()
208 wil_err_fw(wil, "concurrency record truncated\n"); in fw_handle_concurrency()
213 fw_handle_comment(struct wil6210_priv *wil, const void *data, in fw_handle_comment() argument
227 wil_dbg_fw(wil, "magic is WIL_FW_CAPABILITIES_MAGIC\n"); in fw_handle_comment()
228 rc = fw_handle_capabilities(wil, data, size); in fw_handle_comment()
231 wil_dbg_fw(wil, "magic is WIL_BRD_FILE_MAGIC\n"); in fw_handle_comment()
232 rc = fw_handle_brd_file(wil, data, size); in fw_handle_comment()
235 wil_dbg_fw(wil, "magic is WIL_FW_CONCURRENCY_MAGIC\n"); in fw_handle_comment()
236 rc = fw_handle_concurrency(wil, data, size); in fw_handle_comment()
246 static int __fw_handle_data(struct wil6210_priv *wil, const void *data, in __fw_handle_data() argument
254 wil_err_fw(wil, "data record too short: %zu\n", size); in __fw_handle_data()
258 if (!wil_fw_addr_check(wil, &dst, addr, s, "address")) in __fw_handle_data()
260 wil_dbg_fw(wil, "write [0x%08x] <== %zu bytes\n", le32_to_cpu(addr), s); in __fw_handle_data()
267 static int fw_handle_data(struct wil6210_priv *wil, const void *data, in fw_handle_data() argument
272 return __fw_handle_data(wil, data, size, d->addr); in fw_handle_data()
275 static int fw_handle_fill(struct wil6210_priv *wil, const void *data, in fw_handle_fill() argument
284 wil_err_fw(wil, "bad size for fill record: %zu\n", size); in fw_handle_fill()
289 wil_err_fw(wil, "fill size too short: %zu\n", s); in fw_handle_fill()
294 wil_err_fw(wil, "fill size not aligned: %zu\n", s); in fw_handle_fill()
298 if (!wil_fw_addr_check(wil, &dst, d->addr, s, "address")) in fw_handle_fill()
302 wil_dbg_fw(wil, "fill [0x%08x] <== 0x%08x, %zu bytes\n", in fw_handle_fill()
310 static int fw_handle_file_header(struct wil6210_priv *wil, const void *data, in fw_handle_file_header() argument
316 wil_err_fw(wil, "file header length incorrect: %zu\n", size); in fw_handle_file_header()
320 wil_dbg_fw(wil, "new file, ver. %d, %i bytes\n", in fw_handle_file_header()
327 memcpy(wil->fw_version, in fw_handle_file_header()
330 sizeof(wil->fw_version) - 1)); in fw_handle_file_header()
335 static int fw_handle_direct_write(struct wil6210_priv *wil, const void *data, in fw_handle_direct_write() argument
343 wil_err_fw(wil, "record size not aligned on %zu: %zu\n", in fw_handle_direct_write()
355 if (!wil_fw_addr_check(wil, &dst, block[i].addr, 0, "address")) in fw_handle_direct_write()
360 wil_dbg_fw(wil, "write [0x%08x] <== 0x%08x " in fw_handle_direct_write()
370 static int gw_write(struct wil6210_priv *wil, void __iomem *gwa_addr, in gw_write() argument
384 wil_err_fw(wil, "gw timeout\n"); in gw_write()
392 static int fw_handle_gateway_data(struct wil6210_priv *wil, const void *data, in fw_handle_gateway_data() argument
405 wil_err_fw(wil, "gateway record too short: %zu\n", size); in fw_handle_gateway_data()
410 wil_err_fw(wil, "gateway record data size" in fw_handle_gateway_data()
419 wil_dbg_fw(wil, "gw write record [%3d] blocks, cmd 0x%08x\n", in fw_handle_gateway_data()
422 if (!wil_fw_addr_check(wil, &gwa_addr, d->gateway_addr_addr, 0, in fw_handle_gateway_data()
424 !wil_fw_addr_check(wil, &gwa_val, d->gateway_value_addr, 0, in fw_handle_gateway_data()
426 !wil_fw_addr_check(wil, &gwa_cmd, d->gateway_cmd_addr, 0, in fw_handle_gateway_data()
428 !wil_fw_addr_check(wil, &gwa_ctl, d->gateway_ctrl_address, 0, in fw_handle_gateway_data()
432 wil_dbg_fw(wil, "gw addresses: addr 0x%08x val 0x%08x" in fw_handle_gateway_data()
444 wil_dbg_fw(wil, " gw write[%3d] [0x%08x] <== 0x%08x\n", in fw_handle_gateway_data()
448 rc = gw_write(wil, gwa_addr, gwa_cmd, gwa_ctl, gw_cmd, a); in fw_handle_gateway_data()
456 static int fw_handle_gateway_data4(struct wil6210_priv *wil, const void *data, in fw_handle_gateway_data4() argument
469 wil_err_fw(wil, "gateway4 record too short: %zu\n", size); in fw_handle_gateway_data4()
474 wil_err_fw(wil, "gateway4 record data size" in fw_handle_gateway_data4()
483 wil_dbg_fw(wil, "gw4 write record [%3d] blocks, cmd 0x%08x\n", in fw_handle_gateway_data4()
486 if (!wil_fw_addr_check(wil, &gwa_addr, d->gateway_addr_addr, 0, in fw_handle_gateway_data4()
490 if (!wil_fw_addr_check(wil, &gwa_val[k], in fw_handle_gateway_data4()
494 if (!wil_fw_addr_check(wil, &gwa_cmd, d->gateway_cmd_addr, 0, in fw_handle_gateway_data4()
496 !wil_fw_addr_check(wil, &gwa_ctl, d->gateway_ctrl_address, 0, in fw_handle_gateway_data4()
500 wil_dbg_fw(wil, "gw4 addresses: addr 0x%08x cmd 0x%08x ctl 0x%08x\n", in fw_handle_gateway_data4()
516 wil_dbg_fw(wil, " gw4 write[%3d] [0x%08x] <==\n", i, a); in fw_handle_gateway_data4()
522 rc = gw_write(wil, gwa_addr, gwa_cmd, gwa_ctl, gw_cmd, a); in fw_handle_gateway_data4()
532 int (*load_handler)(struct wil6210_priv *wil, const void *data,
534 int (*parse_handler)(struct wil6210_priv *wil, const void *data,
550 static int wil_fw_handle_record(struct wil6210_priv *wil, int type, in wil_fw_handle_record() argument
559 wil, data, size) : in wil_fw_handle_record()
561 wil, data, size); in wil_fw_handle_record()
563 wil_err_fw(wil, "unknown record type: %d\n", type); in wil_fw_handle_record()
575 static int wil_fw_process(struct wil6210_priv *wil, const void *data, in wil_fw_process() argument
590 wil_err_fw(wil, "unaligned record size: %zu\n", in wil_fw_process()
594 rc = wil_fw_handle_record(wil, le16_to_cpu(hdr->type), in wil_fw_process()
600 wil_err_fw(wil, "unprocessed bytes: %zu\n", size); in wil_fw_process()
602 wil_err_fw(wil, "Stop at offset %ld" in wil_fw_process()
622 int wil_request_firmware(struct wil6210_priv *wil, const char *name, in wil_request_firmware() argument
630 rc = request_firmware(&fw, name, wil_to_dev(wil)); in wil_request_firmware()
632 wil_err_fw(wil, "Failed to load firmware %s rc %d\n", name, rc); in wil_request_firmware()
635 wil_dbg_fw(wil, "Loading <%s>, %zu bytes\n", name, fw->size); in wil_request_firmware()
638 rc1 = wil_fw_verify(wil, d, sz); in wil_request_firmware()
643 rc = wil_fw_process(wil, d, rc1, load); in wil_request_firmware()
658 static int wil_brd_process(struct wil6210_priv *wil, const void *data, in wil_brd_process() argument
682 if (wil->brd_file_max_size && hdr_sz > wil->brd_file_max_size) in wil_brd_process()
687 wil_err_fw(wil, "unaligned record size: %zu\n", in wil_brd_process()
693 wil_err_fw(wil, "invalid record type for board file: %d\n", in wil_brd_process()
698 wil_err_fw(wil, "data record too short: %zu\n", hdr_sz); in wil_brd_process()
702 wil_dbg_fw(wil, "using addr from fw file: [0x%08x]\n", in wil_brd_process()
703 wil->brd_file_addr); in wil_brd_process()
705 rc = __fw_handle_data(wil, &hdr[1], hdr_sz, in wil_brd_process()
706 cpu_to_le32(wil->brd_file_addr)); in wil_brd_process()
721 int wil_request_board(struct wil6210_priv *wil, const char *name) in wil_request_board() argument
726 rc = request_firmware(&brd, name, wil_to_dev(wil)); in wil_request_board()
728 wil_err_fw(wil, "Failed to load brd %s\n", name); in wil_request_board()
731 wil_dbg_fw(wil, "Loading <%s>, %zu bytes\n", name, brd->size); in wil_request_board()
734 dlen = wil_fw_verify(wil, brd->data, brd->size); in wil_request_board()
740 rc = wil_brd_process(wil, brd->data, dlen); in wil_request_board()
755 bool wil_fw_verify_file_exists(struct wil6210_priv *wil, const char *name) in wil_fw_verify_file_exists() argument
760 rc = request_firmware(&fw, name, wil_to_dev(wil)); in wil_fw_verify_file_exists()
764 wil_dbg_fw(wil, "<%s> not available: %d\n", name, rc); in wil_fw_verify_file_exists()