2 * Atheros CARL9170 driver
6 * Copyright 2009, 2010, Christian Lamparter <chunkeey@googlemail.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; see the file COPYING. If not, see
20 * http://www.gnu.org/licenses/.
23 #include <linux/kernel.h>
24 #include <linux/firmware.h>
25 #include <linux/crc32.h>
30 #define MAKE_STR(symbol) #symbol
31 #define TO_STR(symbol) MAKE_STR(symbol)
32 #define CARL9170FW_API_VER_STR TO_STR(CARL9170FW_API_MAX_VER)
33 MODULE_VERSION(CARL9170FW_API_VER_STR
":" CARL9170FW_VERSION_GIT
);
35 static const u8 otus_magic
[4] = { OTUS_MAGIC
};
37 static const void *carl9170_fw_find_desc(struct ar9170
*ar
, const u8 descid
[4],
38 const unsigned int len
, const u8 compatible_revision
)
40 const struct carl9170fw_desc_head
*iter
;
42 carl9170fw_for_each_hdr(iter
, ar
->fw
.desc
) {
43 if (carl9170fw_desc_cmp(iter
, descid
, len
,
48 /* needed to find the LAST desc */
49 if (carl9170fw_desc_cmp(iter
, descid
, len
,
56 static int carl9170_fw_verify_descs(struct ar9170
*ar
,
57 const struct carl9170fw_desc_head
*head
, unsigned int max_len
)
59 const struct carl9170fw_desc_head
*pos
;
60 unsigned long pos_addr
, end_addr
;
61 unsigned int pos_length
;
63 if (max_len
< sizeof(*pos
))
66 max_len
= min_t(unsigned int, CARL9170FW_DESC_MAX_LENGTH
, max_len
);
69 pos_addr
= (unsigned long) pos
;
70 end_addr
= pos_addr
+ max_len
;
72 while (pos_addr
< end_addr
) {
73 if (pos_addr
+ sizeof(*head
) > end_addr
)
76 pos_length
= le16_to_cpu(pos
->length
);
78 if (pos_length
< sizeof(*head
))
81 if (pos_length
> max_len
)
84 if (pos_addr
+ pos_length
> end_addr
)
87 if (carl9170fw_desc_cmp(pos
, LAST_MAGIC
,
88 CARL9170FW_LAST_DESC_SIZE
,
89 CARL9170FW_LAST_DESC_CUR_VER
))
92 pos_addr
+= pos_length
;
93 pos
= (void *)pos_addr
;
94 max_len
-= pos_length
;
99 static void carl9170_fw_info(struct ar9170
*ar
)
101 const struct carl9170fw_motd_desc
*motd_desc
;
102 unsigned int str_ver_len
;
105 dev_info(&ar
->udev
->dev
, "driver API: %s 2%03d-%02d-%02d [%d-%d]\n",
106 CARL9170FW_VERSION_GIT
, CARL9170FW_VERSION_YEAR
,
107 CARL9170FW_VERSION_MONTH
, CARL9170FW_VERSION_DAY
,
108 CARL9170FW_API_MIN_VER
, CARL9170FW_API_MAX_VER
);
110 motd_desc
= carl9170_fw_find_desc(ar
, MOTD_MAGIC
,
111 sizeof(*motd_desc
), CARL9170FW_MOTD_DESC_CUR_VER
);
114 str_ver_len
= strnlen(motd_desc
->release
,
115 CARL9170FW_MOTD_RELEASE_LEN
);
117 fw_date
= le32_to_cpu(motd_desc
->fw_year_month_day
);
119 dev_info(&ar
->udev
->dev
, "firmware API: %.*s 2%03d-%02d-%02d\n",
120 str_ver_len
, motd_desc
->release
,
121 CARL9170FW_GET_YEAR(fw_date
),
122 CARL9170FW_GET_MONTH(fw_date
),
123 CARL9170FW_GET_DAY(fw_date
));
125 strlcpy(ar
->hw
->wiphy
->fw_version
, motd_desc
->release
,
126 sizeof(ar
->hw
->wiphy
->fw_version
));
130 static bool valid_dma_addr(const u32 address
)
132 if (address
>= AR9170_SRAM_OFFSET
&&
133 address
< (AR9170_SRAM_OFFSET
+ AR9170_SRAM_SIZE
))
139 static bool valid_cpu_addr(const u32 address
)
141 if (valid_dma_addr(address
) || (address
>= AR9170_PRAM_OFFSET
&&
142 address
< (AR9170_PRAM_OFFSET
+ AR9170_PRAM_SIZE
)))
148 static int carl9170_fw(struct ar9170
*ar
, const __u8
*data
, size_t len
)
150 const struct carl9170fw_otus_desc
*otus_desc
;
151 const struct carl9170fw_chk_desc
*chk_desc
;
152 const struct carl9170fw_last_desc
*last_desc
;
153 const struct carl9170fw_txsq_desc
*txsq_desc
;
155 last_desc
= carl9170_fw_find_desc(ar
, LAST_MAGIC
,
156 sizeof(*last_desc
), CARL9170FW_LAST_DESC_CUR_VER
);
160 otus_desc
= carl9170_fw_find_desc(ar
, OTUS_MAGIC
,
161 sizeof(*otus_desc
), CARL9170FW_OTUS_DESC_CUR_VER
);
163 dev_err(&ar
->udev
->dev
, "failed to find compatible firmware "
168 chk_desc
= carl9170_fw_find_desc(ar
, CHK_MAGIC
,
169 sizeof(*chk_desc
), CARL9170FW_CHK_DESC_CUR_VER
);
172 unsigned long fin
, diff
;
173 unsigned int dsc_len
;
176 dsc_len
= min_t(unsigned int, len
,
177 (unsigned long)chk_desc
- (unsigned long)otus_desc
);
179 fin
= (unsigned long) last_desc
+ sizeof(*last_desc
);
180 diff
= fin
- (unsigned long) otus_desc
;
188 crc32
= crc32_le(~0, data
, len
);
189 if (cpu_to_le32(crc32
) != chk_desc
->fw_crc32
) {
190 dev_err(&ar
->udev
->dev
, "fw checksum test failed.\n");
194 crc32
= crc32_le(crc32
, (void *)otus_desc
, dsc_len
);
195 if (cpu_to_le32(crc32
) != chk_desc
->hdr_crc32
) {
196 dev_err(&ar
->udev
->dev
, "descriptor check failed.\n");
200 dev_warn(&ar
->udev
->dev
, "Unprotected firmware image.\n");
204 (carl9170fw_supports(otus_desc->feature_set, feat))
206 if (!SUPP(CARL9170FW_DUMMY_FEATURE
)) {
207 dev_err(&ar
->udev
->dev
, "invalid firmware descriptor "
208 "format detected.\n");
212 ar
->fw
.api_version
= otus_desc
->api_ver
;
214 if (ar
->fw
.api_version
< CARL9170FW_API_MIN_VER
||
215 ar
->fw
.api_version
> CARL9170FW_API_MAX_VER
) {
216 dev_err(&ar
->udev
->dev
, "unsupported firmware api version.\n");
220 if (!SUPP(CARL9170FW_COMMAND_PHY
) || SUPP(CARL9170FW_UNUSABLE
) ||
221 !SUPP(CARL9170FW_HANDLE_BACK_REQ
)) {
222 dev_err(&ar
->udev
->dev
, "firmware does support "
223 "mandatory features.\n");
227 if (ilog2(le32_to_cpu(otus_desc
->feature_set
)) >=
228 __CARL9170FW_FEATURE_NUM
) {
229 dev_warn(&ar
->udev
->dev
, "driver does not support all "
230 "firmware features.\n");
233 if (!SUPP(CARL9170FW_COMMAND_CAM
)) {
234 dev_info(&ar
->udev
->dev
, "crypto offloading is disabled "
236 ar
->disable_offload
= true;
239 if (SUPP(CARL9170FW_PSM
))
240 ar
->hw
->flags
|= IEEE80211_HW_SUPPORTS_PS
;
242 if (!SUPP(CARL9170FW_USB_INIT_FIRMWARE
)) {
243 dev_err(&ar
->udev
->dev
, "firmware does not provide "
244 "mandatory interfaces.\n");
248 if (SUPP(CARL9170FW_MINIBOOT
))
249 ar
->fw
.offset
= le16_to_cpu(otus_desc
->miniboot_size
);
253 if (SUPP(CARL9170FW_USB_DOWN_STREAM
)) {
254 ar
->hw
->extra_tx_headroom
+= sizeof(struct ar9170_stream
);
255 ar
->fw
.tx_stream
= true;
258 if (SUPP(CARL9170FW_USB_UP_STREAM
))
259 ar
->fw
.rx_stream
= true;
261 if (SUPP(CARL9170FW_RX_FILTER
)) {
262 ar
->fw
.rx_filter
= true;
263 ar
->rx_filter_caps
= FIF_FCSFAIL
| FIF_PLCPFAIL
|
264 FIF_CONTROL
| FIF_PSPOLL
| FIF_OTHER_BSS
|
268 if (SUPP(CARL9170FW_WOL
))
269 device_set_wakeup_enable(&ar
->udev
->dev
, true);
271 ar
->fw
.vif_num
= otus_desc
->vif_num
;
272 ar
->fw
.cmd_bufs
= otus_desc
->cmd_bufs
;
273 ar
->fw
.address
= le32_to_cpu(otus_desc
->fw_address
);
274 ar
->fw
.rx_size
= le16_to_cpu(otus_desc
->rx_max_frame_len
);
275 ar
->fw
.mem_blocks
= min_t(unsigned int, otus_desc
->tx_descs
, 0xfe);
276 atomic_set(&ar
->mem_free_blocks
, ar
->fw
.mem_blocks
);
277 ar
->fw
.mem_block_size
= le16_to_cpu(otus_desc
->tx_frag_len
);
279 if (ar
->fw
.vif_num
>= AR9170_MAX_VIRTUAL_MAC
|| !ar
->fw
.vif_num
||
280 ar
->fw
.mem_blocks
< 16 || !ar
->fw
.cmd_bufs
||
281 ar
->fw
.mem_block_size
< 64 || ar
->fw
.mem_block_size
> 512 ||
282 ar
->fw
.rx_size
> 32768 || ar
->fw
.rx_size
< 4096 ||
283 !valid_cpu_addr(ar
->fw
.address
)) {
284 dev_err(&ar
->udev
->dev
, "firmware shows obvious signs of "
285 "malicious tampering.\n");
289 ar
->fw
.beacon_addr
= le32_to_cpu(otus_desc
->bcn_addr
);
290 ar
->fw
.beacon_max_len
= le16_to_cpu(otus_desc
->bcn_len
);
292 if (valid_dma_addr(ar
->fw
.beacon_addr
) && ar
->fw
.beacon_max_len
>=
293 AR9170_MAC_BCN_LENGTH_MAX
) {
294 ar
->hw
->wiphy
->interface_modes
|= BIT(NL80211_IFTYPE_ADHOC
);
296 if (SUPP(CARL9170FW_WLANTX_CAB
)) {
297 ar
->hw
->wiphy
->interface_modes
|=
298 BIT(NL80211_IFTYPE_AP
) |
299 BIT(NL80211_IFTYPE_P2P_GO
);
303 txsq_desc
= carl9170_fw_find_desc(ar
, TXSQ_MAGIC
,
304 sizeof(*txsq_desc
), CARL9170FW_TXSQ_DESC_CUR_VER
);
307 ar
->fw
.tx_seq_table
= le32_to_cpu(txsq_desc
->seq_table_addr
);
308 if (!valid_cpu_addr(ar
->fw
.tx_seq_table
))
311 ar
->fw
.tx_seq_table
= 0;
318 static struct carl9170fw_desc_head
*
319 carl9170_find_fw_desc(struct ar9170
*ar
, const __u8
*fw_data
, const size_t len
)
322 int scan
= 0, found
= 0;
324 if (!carl9170fw_size_check(len
)) {
325 dev_err(&ar
->udev
->dev
, "firmware size is out of bound.\n");
329 while (scan
< len
- sizeof(struct carl9170fw_desc_head
)) {
330 if (fw_data
[scan
++] == otus_magic
[found
])
338 if (found
== sizeof(otus_magic
))
342 if (found
!= sizeof(otus_magic
))
345 return (void *)&fw_data
[scan
- found
];
348 int carl9170_fw_fix_eeprom(struct ar9170
*ar
)
350 const struct carl9170fw_fix_desc
*fix_desc
= NULL
;
351 unsigned int i
, n
, off
;
352 u32
*data
= (void *)&ar
->eeprom
;
354 fix_desc
= carl9170_fw_find_desc(ar
, FIX_MAGIC
,
355 sizeof(*fix_desc
), CARL9170FW_FIX_DESC_CUR_VER
);
360 n
= (le16_to_cpu(fix_desc
->head
.length
) - sizeof(*fix_desc
)) /
361 sizeof(struct carl9170fw_fix_entry
);
363 for (i
= 0; i
< n
; i
++) {
364 off
= le32_to_cpu(fix_desc
->data
[i
].address
) -
367 if (off
>= sizeof(struct ar9170_eeprom
) || (off
& 3)) {
368 dev_err(&ar
->udev
->dev
, "Skip invalid entry %d\n", i
);
372 data
[off
/ sizeof(*data
)] &=
373 le32_to_cpu(fix_desc
->data
[i
].mask
);
374 data
[off
/ sizeof(*data
)] |=
375 le32_to_cpu(fix_desc
->data
[i
].value
);
381 int carl9170_parse_firmware(struct ar9170
*ar
)
383 const struct carl9170fw_desc_head
*fw_desc
= NULL
;
384 const struct firmware
*fw
= ar
->fw
.fw
;
385 unsigned long header_offset
= 0;
391 fw_desc
= carl9170_find_fw_desc(ar
, fw
->data
, fw
->size
);
394 dev_err(&ar
->udev
->dev
, "unsupported firmware.\n");
398 header_offset
= (unsigned long)fw_desc
- (unsigned long)fw
->data
;
400 err
= carl9170_fw_verify_descs(ar
, fw_desc
, fw
->size
- header_offset
);
402 dev_err(&ar
->udev
->dev
, "damaged firmware (%d).\n", err
);
406 ar
->fw
.desc
= fw_desc
;
408 carl9170_fw_info(ar
);
410 err
= carl9170_fw(ar
, fw
->data
, fw
->size
);
412 dev_err(&ar
->udev
->dev
, "failed to parse firmware (%d).\n",