23 #include <linux/kernel.h>
26 #include <linux/module.h>
31 #define MAKE_STR(symbol) #symbol
32 #define TO_STR(symbol) MAKE_STR(symbol)
33 #define CARL9170FW_API_VER_STR TO_STR(CARL9170FW_API_MAX_VER)
38 static const void *carl9170_fw_find_desc(
struct ar9170 *
ar,
const u8 descid[4],
39 const unsigned int len,
const u8 compatible_revision)
44 if (carl9170fw_desc_cmp(iter, descid, len,
50 if (carl9170fw_desc_cmp(iter, descid, len,
57 static int carl9170_fw_verify_descs(
struct ar9170 *ar,
61 unsigned long pos_addr, end_addr;
62 unsigned int pos_length;
64 if (max_len <
sizeof(*pos))
70 pos_addr = (
unsigned long) pos;
71 end_addr = pos_addr + max_len;
73 while (pos_addr < end_addr) {
74 if (pos_addr +
sizeof(*head) > end_addr)
79 if (pos_length <
sizeof(*head))
82 if (pos_length > max_len)
85 if (pos_addr + pos_length > end_addr)
93 pos_addr += pos_length;
94 pos = (
void *)pos_addr;
95 max_len -= pos_length;
100 static void carl9170_fw_info(
struct ar9170 *ar)
103 unsigned int str_ver_len;
106 dev_info(&ar->
udev->dev,
"driver API: %s 2%03d-%02d-%02d [%d-%d]\n",
111 motd_desc = carl9170_fw_find_desc(ar,
MOTD_MAGIC,
120 dev_info(&ar->
udev->dev,
"firmware API: %.*s 2%03d-%02d-%02d\n",
121 str_ver_len, motd_desc->
release,
127 sizeof(ar->
hw->wiphy->fw_version));
140 static bool valid_cpu_addr(
const u32 address)
149 static int carl9170_fw_checksum(
struct ar9170 *ar,
const __u8 *
data,
155 unsigned long fin, diff;
156 unsigned int dsc_len;
159 last_desc = carl9170_fw_find_desc(ar,
LAST_MAGIC,
164 otus_desc = carl9170_fw_find_desc(ar,
OTUS_MAGIC,
167 dev_err(&ar->
udev->dev,
"failed to find compatible firmware "
172 chk_desc = carl9170_fw_find_desc(ar,
CHK_MAGIC,
176 dev_warn(&ar->
udev->dev,
"Unprotected firmware image.\n");
180 dsc_len =
min_t(
unsigned int, len,
181 (
unsigned long)chk_desc - (
unsigned long)otus_desc);
183 fin = (
unsigned long) last_desc +
sizeof(*last_desc);
184 diff = fin - (
unsigned long) otus_desc;
194 dev_err(&ar->
udev->dev,
"fw checksum test failed.\n");
198 crc32 =
crc32_le(crc32, (
void *)otus_desc, dsc_len);
200 dev_err(&ar->
udev->dev,
"descriptor check failed.\n");
206 static int carl9170_fw_tx_sequence(
struct ar9170 *ar)
210 txsq_desc = carl9170_fw_find_desc(ar,
TXSQ_MAGIC,
sizeof(*txsq_desc),
214 if (!valid_cpu_addr(ar->
fw.tx_seq_table))
217 ar->
fw.tx_seq_table = 0;
223 static int carl9170_fw(
struct ar9170 *ar,
const __u8 *data,
size_t len)
229 err = carl9170_fw_checksum(ar, data, len);
233 otus_desc = carl9170_fw_find_desc(ar,
OTUS_MAGIC,
240 (carl9170fw_supports(otus_desc->feature_set, feat))
243 dev_err(&ar->
udev->dev,
"invalid firmware descriptor "
244 "format detected.\n");
252 dev_err(&ar->
udev->dev,
"unsupported firmware api version.\n");
259 "mandatory features.\n");
266 "firmware features.\n");
270 dev_info(&ar->
udev->dev,
"crypto offloading is disabled "
279 dev_err(&ar->
udev->dev,
"firmware does not provide "
280 "mandatory interfaces.\n");
291 ar->
fw.tx_stream =
true;
295 ar->
fw.rx_stream =
true;
298 ar->
fw.rx_filter =
true;
305 ar->
fw.hw_counters =
true;
311 ar->
fw.ba_filter =
true;
325 ar->
fw.mem_blocks < 16 || !ar->
fw.cmd_bufs ||
326 ar->
fw.mem_block_size < 64 || ar->
fw.mem_block_size > 512 ||
327 ar->
fw.rx_size > 32768 || ar->
fw.rx_size < 4096 ||
328 !valid_cpu_addr(ar->
fw.address)) {
329 dev_err(&ar->
udev->dev,
"firmware shows obvious signs of "
330 "malicious tampering.\n");
337 if (valid_dma_addr(ar->
fw.beacon_addr) && ar->
fw.beacon_max_len >=
352 ar->
if_combs[0].num_different_channels = 1;
353 ar->
if_combs[0].max_interfaces = ar->
fw.vif_num;
357 ar->
hw->wiphy->iface_combinations = ar->
if_combs;
360 ar->
hw->wiphy->interface_modes |= if_comb_types;
365 return carl9170_fw_tx_sequence(ar);
372 int scan = 0, found = 0;
374 if (!carl9170fw_size_check(len)) {
375 dev_err(&ar->
udev->dev,
"firmware size is out of bound.\n");
380 if (fw_data[scan++] == otus_magic[found])
388 if (found ==
sizeof(otus_magic))
392 if (found !=
sizeof(otus_magic))
395 return (
void *)&fw_data[scan - found];
402 unsigned long header_offset = 0;
408 fw_desc = carl9170_find_fw_desc(ar, fw->
data, fw->
size);
411 dev_err(&ar->
udev->dev,
"unsupported firmware.\n");
415 header_offset = (
unsigned long)fw_desc - (
unsigned long)fw->
data;
417 err = carl9170_fw_verify_descs(ar, fw_desc, fw->
size - header_offset);
419 dev_err(&ar->
udev->dev,
"damaged firmware (%d).\n", err);
425 carl9170_fw_info(ar);
427 err = carl9170_fw(ar, fw->
data, fw->
size);
429 dev_err(&ar->
udev->dev,
"failed to parse firmware (%d).\n",