Lines Matching defs:wdev

169 bool wfx_api_older_than(struct wfx_dev *wdev, int major, int minor)
171 if (wdev->hw_caps.api_version_major < major)
173 if (wdev->hw_caps.api_version_major > major)
175 if (wdev->hw_caps.api_version_minor < minor)
187 int wfx_send_pds(struct wfx_dev *wdev, u8 *buf, size_t len)
192 dev_err(wdev->dev, "PDS: malformed file (legacy format?)\n");
199 dev_err(wdev->dev, "PDS:%d: corrupted file\n", chunk_num);
203 dev_info(wdev->dev, "PDS:%d: skip unknown data\n", chunk_num);
207 dev_warn(wdev->dev, "PDS:%d: unexpectedly large chunk\n", chunk_num);
209 dev_warn(wdev->dev, "PDS:%d: unexpected content\n", chunk_num);
211 ret = wfx_hif_configuration(wdev, buf + 4, chunk_len - 4);
213 dev_err(wdev->dev, "PDS:%d: invalid data (unsupported options?)\n", chunk_num);
217 dev_err(wdev->dev, "PDS:%d: chip didn't reply (corrupted file?)\n", chunk_num);
221 dev_err(wdev->dev, "PDS:%d: chip returned an unknown error\n", chunk_num);
232 static int wfx_send_pdata_pds(struct wfx_dev *wdev)
238 ret = request_firmware(&pds, wdev->pdata.file_pds, wdev->dev);
240 dev_err(wdev->dev, "can't load antenna parameters (PDS file %s). The device may be unstable.\n",
241 wdev->pdata.file_pds);
249 ret = wfx_send_pds(wdev, tmp_buf, pds->size);
258 struct wfx_dev *wdev = data;
260 mutex_destroy(&wdev->tx_power_loop_info_lock);
261 mutex_destroy(&wdev->rx_stats_lock);
262 mutex_destroy(&wdev->scan_lock);
263 mutex_destroy(&wdev->conf_mutex);
264 ieee80211_free_hw(wdev->hw);
271 struct wfx_dev *wdev;
320 wdev = hw->priv;
321 wdev->hw = hw;
322 wdev->dev = dev;
323 wdev->hwbus_ops = hwbus_ops;
324 wdev->hwbus_priv = hwbus_priv;
325 memcpy(&wdev->pdata, pdata, sizeof(*pdata));
326 of_property_read_string(dev->of_node, "silabs,antenna-config-file", &wdev->pdata.file_pds);
327 wdev->pdata.gpio_wakeup = devm_gpiod_get_optional(dev, "wakeup", GPIOD_OUT_LOW);
328 if (IS_ERR(wdev->pdata.gpio_wakeup))
331 if (wdev->pdata.gpio_wakeup)
332 gpiod_set_consumer_name(wdev->pdata.gpio_wakeup, "wfx wakeup");
334 mutex_init(&wdev->conf_mutex);
335 mutex_init(&wdev->scan_lock);
336 mutex_init(&wdev->rx_stats_lock);
337 mutex_init(&wdev->tx_power_loop_info_lock);
338 init_completion(&wdev->firmware_ready);
339 INIT_DELAYED_WORK(&wdev->cooling_timeout_work, wfx_cooling_timeout_work);
340 skb_queue_head_init(&wdev->tx_pending);
341 init_waitqueue_head(&wdev->tx_dequeue);
342 wfx_init_hif_cmd(&wdev->hif_cmd);
344 if (devm_add_action_or_reset(dev, wfx_free_common, wdev))
347 return wdev;
354 int wfx_probe(struct wfx_dev *wdev)
363 gpio_saved = wdev->pdata.gpio_wakeup;
364 wdev->pdata.gpio_wakeup = NULL;
365 wdev->poll_irq = true;
367 wdev->bh_wq = alloc_workqueue("wfx_bh_wq", WQ_HIGHPRI | WQ_PERCPU, 0);
368 if (!wdev->bh_wq)
371 wfx_bh_register(wdev);
373 err = wfx_init_device(wdev);
377 wfx_bh_poll_irq(wdev);
378 err = wait_for_completion_timeout(&wdev->firmware_ready, 1 * HZ);
380 dev_err(wdev->dev, "timeout while waiting for startup indication\n");
386 dev_info(wdev->dev, "started firmware %d.%d.%d \"%s\" (API: %d.%d, keyset: %02X, caps: 0x%.8X)\n",
387 wdev->hw_caps.firmware_major, wdev->hw_caps.firmware_minor,
388 wdev->hw_caps.firmware_build, wdev->hw_caps.firmware_label,
389 wdev->hw_caps.api_version_major, wdev->hw_caps.api_version_minor,
390 wdev->keyset, wdev->hw_caps.link_mode);
391 snprintf(wdev->hw->wiphy->fw_version,
392 sizeof(wdev->hw->wiphy->fw_version),
394 wdev->hw_caps.firmware_major,
395 wdev->hw_caps.firmware_minor,
396 wdev->hw_caps.firmware_build);
398 if (wfx_api_older_than(wdev, 1, 0)) {
399 dev_err(wdev->dev, "unsupported firmware API version (expect 1 while firmware returns %d)\n",
400 wdev->hw_caps.api_version_major);
405 if (wdev->hw_caps.link_mode == SEC_LINK_ENFORCED) {
406 dev_err(wdev->dev, "chip require secure_link, but can't negotiate it\n");
410 if (wdev->hw_caps.region_sel_mode) {
411 wdev->hw->wiphy->regulatory_flags |= REGULATORY_DISABLE_BEACON_HINTS;
412 wdev->hw->wiphy->bands[NL80211_BAND_2GHZ]->channels[11].flags |=
414 wdev->hw->wiphy->bands[NL80211_BAND_2GHZ]->channels[12].flags |=
416 wdev->hw->wiphy->bands[NL80211_BAND_2GHZ]->channels[13].flags |=
420 dev_dbg(wdev->dev, "sending configuration file %s\n", wdev->pdata.file_pds);
421 err = wfx_send_pdata_pds(wdev);
425 wdev->poll_irq = false;
426 err = wdev->hwbus_ops->irq_subscribe(wdev->hwbus_priv);
430 err = wfx_hif_use_multi_tx_conf(wdev, true);
432 dev_err(wdev->dev, "misconfigured IRQ?\n");
434 wdev->pdata.gpio_wakeup = gpio_saved;
435 if (wdev->pdata.gpio_wakeup) {
436 dev_dbg(wdev->dev, "enable 'quiescent' power mode with wakeup GPIO and PDS file %s\n",
437 wdev->pdata.file_pds);
438 gpiod_set_value_cansleep(wdev->pdata.gpio_wakeup, 1);
439 wfx_control_reg_write(wdev, 0);
440 wfx_hif_set_operational_mode(wdev, HIF_OP_POWER_MODE_QUIESCENT);
442 wfx_hif_set_operational_mode(wdev, HIF_OP_POWER_MODE_DOZE);
445 for (i = 0; i < ARRAY_SIZE(wdev->addresses); i++) {
446 eth_zero_addr(wdev->addresses[i].addr);
447 err = of_get_mac_address(wdev->dev->of_node, wdev->addresses[i].addr);
449 wdev->addresses[i].addr[ETH_ALEN - 1] += i;
451 ether_addr_copy(wdev->addresses[i].addr, wdev->hw_caps.mac_addr[i]);
452 if (!is_valid_ether_addr(wdev->addresses[i].addr)) {
453 dev_warn(wdev->dev, "using random MAC address\n");
454 eth_random_addr(wdev->addresses[i].addr);
456 dev_info(wdev->dev, "MAC address %d: %pM\n", i, wdev->addresses[i].addr);
458 wdev->hw->wiphy->n_addresses = ARRAY_SIZE(wdev->addresses);
459 wdev->hw->wiphy->addresses = wdev->addresses;
461 if (!wfx_api_older_than(wdev, 3, 8))
462 wdev->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
464 err = ieee80211_register_hw(wdev->hw);
468 err = wfx_debug_init(wdev);
475 ieee80211_unregister_hw(wdev->hw);
477 wdev->hwbus_ops->irq_unsubscribe(wdev->hwbus_priv);
479 wfx_bh_unregister(wdev);
480 destroy_workqueue(wdev->bh_wq);
484 void wfx_release(struct wfx_dev *wdev)
486 ieee80211_unregister_hw(wdev->hw);
487 wfx_hif_shutdown(wdev);
488 wdev->hwbus_ops->irq_unsubscribe(wdev->hwbus_priv);
489 wfx_bh_unregister(wdev);
490 destroy_workqueue(wdev->bh_wq);