1 // SPDX-License-Identifier: GPL-2.0-only
3 * Device probe and register.
5 * Copyright (c) 2017-2020, Silicon Laboratories, Inc.
6 * Copyright (c) 2010, ST-Ericsson
7 * Copyright (c) 2008, Johannes Berg <johannes@sipsolutions.net>
8 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
9 * Copyright (c) 2007-2009, Christian Lamparter <chunkeey@web.de>
10 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
11 * Copyright (c) 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
13 #include <linux/module.h>
15 #include <linux/of_net.h>
16 #include <linux/gpio/consumer.h>
17 #include <linux/mmc/sdio_func.h>
18 #include <linux/spi/spi.h>
19 #include <linux/etherdevice.h>
20 #include <linux/firmware.h>
33 #include "hif_tx_mib.h"
34 #include "hif_api_cmd.h"
36 #define WFX_PDS_MAX_SIZE 1500
38 MODULE_DESCRIPTION("Silicon Labs 802.11 Wireless LAN driver for WFx");
39 MODULE_AUTHOR("Jérôme Pouiller <jerome.pouiller@silabs.com>");
40 MODULE_LICENSE("GPL");
42 #define RATETAB_ENT(_rate, _rateid, _flags) { \
44 .hw_value = (_rateid), \
48 static struct ieee80211_rate wfx_rates
[] = {
49 RATETAB_ENT(10, 0, 0),
50 RATETAB_ENT(20, 1, IEEE80211_RATE_SHORT_PREAMBLE
),
51 RATETAB_ENT(55, 2, IEEE80211_RATE_SHORT_PREAMBLE
),
52 RATETAB_ENT(110, 3, IEEE80211_RATE_SHORT_PREAMBLE
),
53 RATETAB_ENT(60, 6, 0),
54 RATETAB_ENT(90, 7, 0),
55 RATETAB_ENT(120, 8, 0),
56 RATETAB_ENT(180, 9, 0),
57 RATETAB_ENT(240, 10, 0),
58 RATETAB_ENT(360, 11, 0),
59 RATETAB_ENT(480, 12, 0),
60 RATETAB_ENT(540, 13, 0),
63 #define CHAN2G(_channel, _freq, _flags) { \
64 .band = NL80211_BAND_2GHZ, \
65 .center_freq = (_freq), \
66 .hw_value = (_channel), \
68 .max_antenna_gain = 0, \
72 static struct ieee80211_channel wfx_2ghz_chantable
[] = {
89 static const struct ieee80211_supported_band wfx_band_2ghz
= {
90 .channels
= wfx_2ghz_chantable
,
91 .n_channels
= ARRAY_SIZE(wfx_2ghz_chantable
),
92 .bitrates
= wfx_rates
,
93 .n_bitrates
= ARRAY_SIZE(wfx_rates
),
96 .cap
= IEEE80211_HT_CAP_GRN_FLD
| IEEE80211_HT_CAP_SGI_20
|
97 IEEE80211_HT_CAP_MAX_AMSDU
|
98 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT
),
100 .ampdu_factor
= IEEE80211_HT_MAX_AMPDU_16K
,
101 .ampdu_density
= IEEE80211_HT_MPDU_DENSITY_NONE
,
103 .rx_mask
= { 0xFF }, // MCS0 to MCS7
104 .rx_highest
= cpu_to_le16(72),
105 .tx_params
= IEEE80211_HT_MCS_TX_DEFINED
,
110 static const struct ieee80211_iface_limit wdev_iface_limits
[] = {
111 { .max
= 1, .types
= BIT(NL80211_IFTYPE_STATION
) },
112 { .max
= 1, .types
= BIT(NL80211_IFTYPE_AP
) },
115 static const struct ieee80211_iface_combination wfx_iface_combinations
[] = {
117 .num_different_channels
= 2,
119 .limits
= wdev_iface_limits
,
120 .n_limits
= ARRAY_SIZE(wdev_iface_limits
),
124 static const struct ieee80211_ops wfx_ops
= {
127 .add_interface
= wfx_add_interface
,
128 .remove_interface
= wfx_remove_interface
,
129 .config
= wfx_config
,
131 .join_ibss
= wfx_join_ibss
,
132 .leave_ibss
= wfx_leave_ibss
,
133 .conf_tx
= wfx_conf_tx
,
134 .hw_scan
= wfx_hw_scan
,
135 .cancel_hw_scan
= wfx_cancel_hw_scan
,
136 .start_ap
= wfx_start_ap
,
137 .stop_ap
= wfx_stop_ap
,
138 .sta_add
= wfx_sta_add
,
139 .sta_remove
= wfx_sta_remove
,
140 .set_tim
= wfx_set_tim
,
141 .set_key
= wfx_set_key
,
142 .set_rts_threshold
= wfx_set_rts_threshold
,
143 .set_default_unicast_key
= wfx_set_default_unicast_key
,
144 .bss_info_changed
= wfx_bss_info_changed
,
145 .configure_filter
= wfx_configure_filter
,
146 .ampdu_action
= wfx_ampdu_action
,
148 .add_chanctx
= wfx_add_chanctx
,
149 .remove_chanctx
= wfx_remove_chanctx
,
150 .change_chanctx
= wfx_change_chanctx
,
151 .assign_vif_chanctx
= wfx_assign_vif_chanctx
,
152 .unassign_vif_chanctx
= wfx_unassign_vif_chanctx
,
155 bool wfx_api_older_than(struct wfx_dev
*wdev
, int major
, int minor
)
157 if (wdev
->hw_caps
.api_version_major
< major
)
159 if (wdev
->hw_caps
.api_version_major
> major
)
161 if (wdev
->hw_caps
.api_version_minor
< minor
)
166 /* NOTE: wfx_send_pds() destroy buf */
167 int wfx_send_pds(struct wfx_dev
*wdev
, u8
*buf
, size_t len
)
170 int start
, brace_level
, i
;
175 dev_err(wdev
->dev
, "valid PDS start with '{'. Did you forget to compress it?\n");
178 for (i
= 1; i
< len
- 1; i
++) {
183 if (buf
[i
] == '}' && !brace_level
) {
185 if (i
- start
+ 1 > WFX_PDS_MAX_SIZE
)
189 dev_dbg(wdev
->dev
, "send PDS '%s}'\n", buf
+ start
);
191 ret
= hif_configuration(wdev
, buf
+ start
,
194 dev_err(wdev
->dev
, "PDS bytes %d to %d: invalid data (unsupported options?)\n",
198 if (ret
== -ETIMEDOUT
) {
199 dev_err(wdev
->dev
, "PDS bytes %d to %d: chip didn't reply (corrupted file?)\n",
204 dev_err(wdev
->dev
, "PDS bytes %d to %d: chip returned an unknown error\n",
215 static int wfx_send_pdata_pds(struct wfx_dev
*wdev
)
218 const struct firmware
*pds
;
221 ret
= request_firmware(&pds
, wdev
->pdata
.file_pds
, wdev
->dev
);
223 dev_err(wdev
->dev
, "can't load PDS file %s\n",
224 wdev
->pdata
.file_pds
);
227 tmp_buf
= kmemdup(pds
->data
, pds
->size
, GFP_KERNEL
);
232 ret
= wfx_send_pds(wdev
, tmp_buf
, pds
->size
);
235 release_firmware(pds
);
240 static void wfx_free_common(void *data
)
242 struct wfx_dev
*wdev
= data
;
244 mutex_destroy(&wdev
->tx_power_loop_info_lock
);
245 mutex_destroy(&wdev
->rx_stats_lock
);
246 mutex_destroy(&wdev
->conf_mutex
);
247 ieee80211_free_hw(wdev
->hw
);
250 struct wfx_dev
*wfx_init_common(struct device
*dev
,
251 const struct wfx_platform_data
*pdata
,
252 const struct hwbus_ops
*hwbus_ops
,
255 struct ieee80211_hw
*hw
;
256 struct wfx_dev
*wdev
;
258 hw
= ieee80211_alloc_hw(sizeof(struct wfx_dev
), &wfx_ops
);
262 SET_IEEE80211_DEV(hw
, dev
);
264 ieee80211_hw_set(hw
, TX_AMPDU_SETUP_IN_HW
);
265 ieee80211_hw_set(hw
, AMPDU_AGGREGATION
);
266 ieee80211_hw_set(hw
, CONNECTION_MONITOR
);
267 ieee80211_hw_set(hw
, REPORTS_TX_ACK_STATUS
);
268 ieee80211_hw_set(hw
, SUPPORTS_DYNAMIC_PS
);
269 ieee80211_hw_set(hw
, SIGNAL_DBM
);
270 ieee80211_hw_set(hw
, SUPPORTS_PS
);
271 ieee80211_hw_set(hw
, MFP_CAPABLE
);
273 hw
->vif_data_size
= sizeof(struct wfx_vif
);
274 hw
->sta_data_size
= sizeof(struct wfx_sta_priv
);
277 hw
->max_rate_tries
= 8;
278 hw
->extra_tx_headroom
= sizeof(struct hif_msg
)
279 + sizeof(struct hif_req_tx
)
280 + 4 /* alignment */ + 8 /* TKIP IV */;
281 hw
->wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
) |
282 BIT(NL80211_IFTYPE_ADHOC
) |
283 BIT(NL80211_IFTYPE_AP
);
284 hw
->wiphy
->probe_resp_offload
= NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS
|
285 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2
|
286 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P
|
287 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U
;
288 hw
->wiphy
->features
|= NL80211_FEATURE_AP_SCAN
;
289 hw
->wiphy
->flags
|= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
;
290 hw
->wiphy
->flags
|= WIPHY_FLAG_AP_UAPSD
;
291 hw
->wiphy
->max_ap_assoc_sta
= HIF_LINK_ID_MAX
;
292 hw
->wiphy
->max_scan_ssids
= 2;
293 hw
->wiphy
->max_scan_ie_len
= IEEE80211_MAX_DATA_LEN
;
294 hw
->wiphy
->n_iface_combinations
= ARRAY_SIZE(wfx_iface_combinations
);
295 hw
->wiphy
->iface_combinations
= wfx_iface_combinations
;
296 hw
->wiphy
->bands
[NL80211_BAND_2GHZ
] = devm_kmalloc(dev
, sizeof(wfx_band_2ghz
), GFP_KERNEL
);
297 // FIXME: also copy wfx_rates and wfx_2ghz_chantable
298 memcpy(hw
->wiphy
->bands
[NL80211_BAND_2GHZ
], &wfx_band_2ghz
,
299 sizeof(wfx_band_2ghz
));
304 wdev
->hwbus_ops
= hwbus_ops
;
305 wdev
->hwbus_priv
= hwbus_priv
;
306 memcpy(&wdev
->pdata
, pdata
, sizeof(*pdata
));
307 of_property_read_string(dev
->of_node
, "config-file",
308 &wdev
->pdata
.file_pds
);
309 wdev
->pdata
.gpio_wakeup
= devm_gpiod_get_optional(dev
, "wakeup",
311 if (IS_ERR(wdev
->pdata
.gpio_wakeup
))
313 if (wdev
->pdata
.gpio_wakeup
)
314 gpiod_set_consumer_name(wdev
->pdata
.gpio_wakeup
, "wfx wakeup");
316 mutex_init(&wdev
->conf_mutex
);
317 mutex_init(&wdev
->rx_stats_lock
);
318 mutex_init(&wdev
->tx_power_loop_info_lock
);
319 init_completion(&wdev
->firmware_ready
);
320 INIT_DELAYED_WORK(&wdev
->cooling_timeout_work
,
321 wfx_cooling_timeout_work
);
322 skb_queue_head_init(&wdev
->tx_pending
);
323 init_waitqueue_head(&wdev
->tx_dequeue
);
324 wfx_init_hif_cmd(&wdev
->hif_cmd
);
325 wdev
->force_ps_timeout
= -1;
327 if (devm_add_action_or_reset(dev
, wfx_free_common
, wdev
))
333 int wfx_probe(struct wfx_dev
*wdev
)
338 struct gpio_desc
*gpio_saved
;
340 // During first part of boot, gpio_wakeup cannot yet been used. So
341 // prevent bh() to touch it.
342 gpio_saved
= wdev
->pdata
.gpio_wakeup
;
343 wdev
->pdata
.gpio_wakeup
= NULL
;
344 wdev
->poll_irq
= true;
346 wfx_bh_register(wdev
);
348 err
= wfx_init_device(wdev
);
352 wfx_bh_poll_irq(wdev
);
353 err
= wait_for_completion_timeout(&wdev
->firmware_ready
, 1 * HZ
);
356 dev_err(wdev
->dev
, "timeout while waiting for startup indication\n");
358 } else if (err
== -ERESTARTSYS
) {
359 dev_info(wdev
->dev
, "probe interrupted by user\n");
364 // FIXME: fill wiphy::hw_version
365 dev_info(wdev
->dev
, "started firmware %d.%d.%d \"%s\" (API: %d.%d, keyset: %02X, caps: 0x%.8X)\n",
366 wdev
->hw_caps
.firmware_major
, wdev
->hw_caps
.firmware_minor
,
367 wdev
->hw_caps
.firmware_build
, wdev
->hw_caps
.firmware_label
,
368 wdev
->hw_caps
.api_version_major
, wdev
->hw_caps
.api_version_minor
,
369 wdev
->keyset
, wdev
->hw_caps
.link_mode
);
370 snprintf(wdev
->hw
->wiphy
->fw_version
,
371 sizeof(wdev
->hw
->wiphy
->fw_version
),
373 wdev
->hw_caps
.firmware_major
,
374 wdev
->hw_caps
.firmware_minor
,
375 wdev
->hw_caps
.firmware_build
);
377 if (wfx_api_older_than(wdev
, 1, 0)) {
379 "unsupported firmware API version (expect 1 while firmware returns %d)\n",
380 wdev
->hw_caps
.api_version_major
);
385 if (wdev
->hw_caps
.link_mode
== SEC_LINK_ENFORCED
) {
387 "chip require secure_link, but can't negotiate it\n");
391 if (wdev
->hw_caps
.region_sel_mode
) {
392 wdev
->hw
->wiphy
->bands
[NL80211_BAND_2GHZ
]->channels
[11].flags
|= IEEE80211_CHAN_NO_IR
;
393 wdev
->hw
->wiphy
->bands
[NL80211_BAND_2GHZ
]->channels
[12].flags
|= IEEE80211_CHAN_NO_IR
;
394 wdev
->hw
->wiphy
->bands
[NL80211_BAND_2GHZ
]->channels
[13].flags
|= IEEE80211_CHAN_DISABLED
;
397 dev_dbg(wdev
->dev
, "sending configuration file %s\n",
398 wdev
->pdata
.file_pds
);
399 err
= wfx_send_pdata_pds(wdev
);
403 wdev
->poll_irq
= false;
404 err
= wdev
->hwbus_ops
->irq_subscribe(wdev
->hwbus_priv
);
408 err
= hif_use_multi_tx_conf(wdev
, true);
410 dev_err(wdev
->dev
, "misconfigured IRQ?\n");
412 wdev
->pdata
.gpio_wakeup
= gpio_saved
;
413 if (wdev
->pdata
.gpio_wakeup
) {
415 "enable 'quiescent' power mode with wakeup GPIO and PDS file %s\n",
416 wdev
->pdata
.file_pds
);
417 gpiod_set_value_cansleep(wdev
->pdata
.gpio_wakeup
, 1);
418 control_reg_write(wdev
, 0);
419 hif_set_operational_mode(wdev
, HIF_OP_POWER_MODE_QUIESCENT
);
421 hif_set_operational_mode(wdev
, HIF_OP_POWER_MODE_DOZE
);
424 for (i
= 0; i
< ARRAY_SIZE(wdev
->addresses
); i
++) {
425 eth_zero_addr(wdev
->addresses
[i
].addr
);
426 macaddr
= of_get_mac_address(wdev
->dev
->of_node
);
427 if (!IS_ERR_OR_NULL(macaddr
)) {
428 ether_addr_copy(wdev
->addresses
[i
].addr
, macaddr
);
429 wdev
->addresses
[i
].addr
[ETH_ALEN
- 1] += i
;
431 ether_addr_copy(wdev
->addresses
[i
].addr
,
432 wdev
->hw_caps
.mac_addr
[i
]);
434 if (!is_valid_ether_addr(wdev
->addresses
[i
].addr
)) {
435 dev_warn(wdev
->dev
, "using random MAC address\n");
436 eth_random_addr(wdev
->addresses
[i
].addr
);
438 dev_info(wdev
->dev
, "MAC address %d: %pM\n", i
,
439 wdev
->addresses
[i
].addr
);
441 wdev
->hw
->wiphy
->n_addresses
= ARRAY_SIZE(wdev
->addresses
);
442 wdev
->hw
->wiphy
->addresses
= wdev
->addresses
;
444 err
= ieee80211_register_hw(wdev
->hw
);
448 err
= wfx_debug_init(wdev
);
455 ieee80211_unregister_hw(wdev
->hw
);
457 wdev
->hwbus_ops
->irq_unsubscribe(wdev
->hwbus_priv
);
459 wfx_bh_unregister(wdev
);
463 void wfx_release(struct wfx_dev
*wdev
)
465 ieee80211_unregister_hw(wdev
->hw
);
467 wdev
->hwbus_ops
->irq_unsubscribe(wdev
->hwbus_priv
);
468 wfx_bh_unregister(wdev
);
471 static int __init
wfx_core_init(void)
475 if (IS_ENABLED(CONFIG_SPI
))
476 ret
= spi_register_driver(&wfx_spi_driver
);
477 if (IS_ENABLED(CONFIG_MMC
) && !ret
)
478 ret
= sdio_register_driver(&wfx_sdio_driver
);
481 module_init(wfx_core_init
);
483 static void __exit
wfx_core_exit(void)
485 if (IS_ENABLED(CONFIG_MMC
))
486 sdio_unregister_driver(&wfx_sdio_driver
);
487 if (IS_ENABLED(CONFIG_SPI
))
488 spi_unregister_driver(&wfx_spi_driver
);
490 module_exit(wfx_core_exit
);