Lines Matching +full:txrx +full:- +full:3

1 // SPDX-License-Identifier: GPL-2.0-only
3 * mac80211 glue code for mac80211 ST-Ericsson CW1200 drivers
5 * Copyright (c) 2010, ST-Ericsson
10 * Copyright (c) 2007-2009, Christian Lamparter <chunkeey@web.de>
14 * - the islsm (softmac prism54) driver, which is:
15 * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
16 * - stlc45xx driver
17 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
29 #include "txrx.h"
40 MODULE_DESCRIPTION("Softmac ST-Ericsson CW1200 common code");
71 RATETAB_ENT(110, 3, 0),
94 #define cw1200_a_rates_size (ARRAY_SIZE(cw1200_rates) - 4)
122 CHAN2G(3, 2422, 0),
238 static int cw1200_ba_rx_tids = -1;
239 static int cw1200_ba_tx_tids = -1;
264 priv = hw->priv; in cw1200_init_common()
265 priv->hw = hw; in cw1200_init_common()
266 priv->hw_type = -1; in cw1200_init_common()
267 priv->mode = NL80211_IFTYPE_UNSPECIFIED; in cw1200_init_common()
268 priv->rates = cw1200_rates; /* TODO: fetch from FW */ in cw1200_init_common()
269 priv->mcs_rates = cw1200_n_rates; in cw1200_init_common()
270 if (cw1200_ba_rx_tids != -1) in cw1200_init_common()
271 priv->ba_rx_tid_mask = cw1200_ba_rx_tids; in cw1200_init_common()
273 priv->ba_rx_tid_mask = 0xFF; /* Enable RX BLKACK for all TIDs */ in cw1200_init_common()
274 if (cw1200_ba_tx_tids != -1) in cw1200_init_common()
275 priv->ba_tx_tid_mask = cw1200_ba_tx_tids; in cw1200_init_common()
277 priv->ba_tx_tid_mask = 0xff; /* Enable TX BLKACK for all TIDs */ in cw1200_init_common()
288 hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in cw1200_init_common()
296 hw->wiphy->wowlan = &cw1200_wowlan_support; in cw1200_init_common()
299 hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; in cw1200_init_common()
301 hw->queues = 4; in cw1200_init_common()
303 priv->rts_threshold = -1; in cw1200_init_common()
305 hw->max_rates = 8; in cw1200_init_common()
306 hw->max_rate_tries = 15; in cw1200_init_common()
307 hw->extra_tx_headroom = WSM_TX_EXTRA_HEADROOM + in cw1200_init_common()
310 hw->sta_data_size = sizeof(struct cw1200_sta_priv); in cw1200_init_common()
312 hw->wiphy->bands[NL80211_BAND_2GHZ] = &cw1200_band_2ghz; in cw1200_init_common()
314 hw->wiphy->bands[NL80211_BAND_5GHZ] = &cw1200_band_5ghz; in cw1200_init_common()
318 struct ieee80211_supported_band *sband = hw->wiphy->bands[band]; in cw1200_init_common()
321 for (i = 0; i < sband->n_channels; i++) { in cw1200_init_common()
322 sband->channels[i].flags = 0; in cw1200_init_common()
323 sband->channels[i].max_antenna_gain = 0; in cw1200_init_common()
324 sband->channels[i].max_power = 30; in cw1200_init_common()
328 hw->wiphy->max_scan_ssids = 2; in cw1200_init_common()
329 hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; in cw1200_init_common()
337 if (hw->wiphy->perm_addr[3] == 0 && in cw1200_init_common()
338 hw->wiphy->perm_addr[4] == 0 && in cw1200_init_common()
339 hw->wiphy->perm_addr[5] == 0) { in cw1200_init_common()
340 get_random_bytes(&hw->wiphy->perm_addr[3], 3); in cw1200_init_common()
343 mutex_init(&priv->wsm_cmd_mux); in cw1200_init_common()
344 mutex_init(&priv->conf_mutex); in cw1200_init_common()
345 priv->workqueue = create_singlethread_workqueue("cw1200_wq"); in cw1200_init_common()
346 if (!priv->workqueue) { in cw1200_init_common()
351 sema_init(&priv->scan.lock, 1); in cw1200_init_common()
352 INIT_WORK(&priv->scan.work, cw1200_scan_work); in cw1200_init_common()
353 INIT_DELAYED_WORK(&priv->scan.probe_work, cw1200_probe_work); in cw1200_init_common()
354 INIT_DELAYED_WORK(&priv->scan.timeout, cw1200_scan_timeout); in cw1200_init_common()
355 INIT_DELAYED_WORK(&priv->clear_recent_scan_work, in cw1200_init_common()
357 INIT_DELAYED_WORK(&priv->join_timeout, cw1200_join_timeout); in cw1200_init_common()
358 INIT_WORK(&priv->unjoin_work, cw1200_unjoin_work); in cw1200_init_common()
359 INIT_WORK(&priv->join_complete_work, cw1200_join_complete_work); in cw1200_init_common()
360 INIT_WORK(&priv->wep_key_work, cw1200_wep_key_work); in cw1200_init_common()
361 INIT_WORK(&priv->tx_policy_upload_work, tx_policy_upload_work); in cw1200_init_common()
362 spin_lock_init(&priv->event_queue_lock); in cw1200_init_common()
363 INIT_LIST_HEAD(&priv->event_queue); in cw1200_init_common()
364 INIT_WORK(&priv->event_handler, cw1200_event_handler); in cw1200_init_common()
365 INIT_DELAYED_WORK(&priv->bss_loss_work, cw1200_bss_loss_work); in cw1200_init_common()
366 INIT_WORK(&priv->bss_params_work, cw1200_bss_params_work); in cw1200_init_common()
367 spin_lock_init(&priv->bss_loss_lock); in cw1200_init_common()
368 spin_lock_init(&priv->ps_state_lock); in cw1200_init_common()
369 INIT_WORK(&priv->set_cts_work, cw1200_set_cts_work); in cw1200_init_common()
370 INIT_WORK(&priv->set_tim_work, cw1200_set_tim_work); in cw1200_init_common()
371 INIT_WORK(&priv->multicast_start_work, cw1200_multicast_start_work); in cw1200_init_common()
372 INIT_WORK(&priv->multicast_stop_work, cw1200_multicast_stop_work); in cw1200_init_common()
373 INIT_WORK(&priv->link_id_work, cw1200_link_id_work); in cw1200_init_common()
374 INIT_DELAYED_WORK(&priv->link_id_gc_work, cw1200_link_id_gc_work); in cw1200_init_common()
375 INIT_WORK(&priv->linkid_reset_work, cw1200_link_id_reset); in cw1200_init_common()
376 INIT_WORK(&priv->update_filtering_work, cw1200_update_filtering_work); in cw1200_init_common()
377 INIT_WORK(&priv->set_beacon_wakeup_period_work, in cw1200_init_common()
379 timer_setup(&priv->mcast_timeout, cw1200_mcast_timeout, 0); in cw1200_init_common()
381 if (cw1200_queue_stats_init(&priv->tx_queue_stats, in cw1200_init_common()
385 destroy_workqueue(priv->workqueue); in cw1200_init_common()
391 if (cw1200_queue_init(&priv->tx_queue[i], in cw1200_init_common()
392 &priv->tx_queue_stats, i, 16, in cw1200_init_common()
394 for (; i > 0; i--) in cw1200_init_common()
395 cw1200_queue_deinit(&priv->tx_queue[i - 1]); in cw1200_init_common()
396 cw1200_queue_stats_deinit(&priv->tx_queue_stats); in cw1200_init_common()
397 destroy_workqueue(priv->workqueue); in cw1200_init_common()
403 init_waitqueue_head(&priv->channel_switch_done); in cw1200_init_common()
404 init_waitqueue_head(&priv->wsm_cmd_wq); in cw1200_init_common()
405 init_waitqueue_head(&priv->wsm_startup_done); in cw1200_init_common()
406 init_waitqueue_head(&priv->ps_mode_switch_done); in cw1200_init_common()
407 wsm_buf_init(&priv->wsm_cmd_buf); in cw1200_init_common()
408 spin_lock_init(&priv->wsm_cmd.lock); in cw1200_init_common()
409 priv->wsm_cmd.done = 1; in cw1200_init_common()
417 struct cw1200_common *priv = dev->priv; in cw1200_register_common()
421 err = cw1200_pm_init(&priv->pm_state, priv); in cw1200_register_common()
434 cw1200_pm_deinit(&priv->pm_state); in cw1200_register_common()
441 pr_info("Registered as '%s'\n", wiphy_name(dev->wiphy)); in cw1200_register_common()
452 struct cw1200_common *priv = dev->priv; in cw1200_unregister_common()
457 del_timer_sync(&priv->mcast_timeout); in cw1200_unregister_common()
462 mutex_destroy(&priv->conf_mutex); in cw1200_unregister_common()
464 wsm_buf_deinit(&priv->wsm_cmd_buf); in cw1200_unregister_common()
466 destroy_workqueue(priv->workqueue); in cw1200_unregister_common()
467 priv->workqueue = NULL; in cw1200_unregister_common()
469 if (priv->sdd) { in cw1200_unregister_common()
470 release_firmware(priv->sdd); in cw1200_unregister_common()
471 priv->sdd = NULL; in cw1200_unregister_common()
475 cw1200_queue_deinit(&priv->tx_queue[i]); in cw1200_unregister_common()
477 cw1200_queue_stats_deinit(&priv->tx_queue_stats); in cw1200_unregister_common()
479 cw1200_pm_deinit(&priv->pm_state); in cw1200_unregister_common()
523 int err = -EINVAL; in cw1200_core_probe()
535 priv = dev->priv; in cw1200_core_probe()
536 priv->hw_refclk = ref_clk; in cw1200_core_probe()
538 priv->hw_refclk = cw1200_refclk; in cw1200_core_probe()
540 priv->sdd_path = (char *)sdd_path; in cw1200_core_probe()
542 priv->sdd_path = cw1200_sdd_path; in cw1200_core_probe()
544 priv->hwbus_ops = hwbus_ops; in cw1200_core_probe()
545 priv->hwbus_priv = hwbus; in cw1200_core_probe()
546 priv->pdev = pdev; in cw1200_core_probe()
547 SET_IEEE80211_DEV(priv->hw, pdev); in cw1200_core_probe()
560 if (wait_event_interruptible_timeout(priv->wsm_startup_done, in cw1200_core_probe()
561 priv->firmware_ready, in cw1200_core_probe()
562 3*HZ) <= 0) { in cw1200_core_probe()
567 err = -ETIMEDOUT; in cw1200_core_probe()
571 /* Set low-power mode. */ in cw1200_core_probe()
574 /* Enable multi-TX confirmation */ in cw1200_core_probe()
596 self->hwbus_ops->lock(self->hwbus_priv); in cw1200_core_release()
598 self->hwbus_ops->unlock(self->hwbus_priv); in cw1200_core_release()
601 cw1200_unregister_common(self->hw); in cw1200_core_release()
602 cw1200_free_common(self->hw); in cw1200_core_release()