cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

main.c (21330B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * mac80211 glue code for mac80211 Prism54 drivers
      4 *
      5 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
      6 * Copyright (c) 2007-2009, Christian Lamparter <chunkeey@web.de>
      7 * Copyright 2008, Johannes Berg <johannes@sipsolutions.net>
      8 *
      9 * Based on:
     10 * - the islsm (softmac prism54) driver, which is:
     11 *   Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
     12 * - stlc45xx driver
     13 *   Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
     14 */
     15
     16#include <linux/slab.h>
     17#include <linux/firmware.h>
     18#include <linux/etherdevice.h>
     19#include <linux/module.h>
     20
     21#include <net/mac80211.h>
     22
     23#include "p54.h"
     24#include "lmac.h"
     25
     26static bool modparam_nohwcrypt;
     27module_param_named(nohwcrypt, modparam_nohwcrypt, bool, 0444);
     28MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
     29MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
     30MODULE_DESCRIPTION("Softmac Prism54 common code");
     31MODULE_LICENSE("GPL");
     32MODULE_ALIAS("prism54common");
     33
     34static int p54_sta_add_remove(struct ieee80211_hw *hw,
     35			      struct ieee80211_vif *vif,
     36			      struct ieee80211_sta *sta)
     37{
     38	struct p54_common *priv = hw->priv;
     39
     40	/*
     41	 * Notify the firmware that we don't want or we don't
     42	 * need to buffer frames for this station anymore.
     43	 */
     44
     45	p54_sta_unlock(priv, sta->addr);
     46
     47	return 0;
     48}
     49
     50static void p54_sta_notify(struct ieee80211_hw *dev, struct ieee80211_vif *vif,
     51			      enum sta_notify_cmd notify_cmd,
     52			      struct ieee80211_sta *sta)
     53{
     54	struct p54_common *priv = dev->priv;
     55
     56	switch (notify_cmd) {
     57	case STA_NOTIFY_AWAKE:
     58		/* update the firmware's filter table */
     59		p54_sta_unlock(priv, sta->addr);
     60		break;
     61	default:
     62		break;
     63	}
     64}
     65
     66static int p54_set_tim(struct ieee80211_hw *dev, struct ieee80211_sta *sta,
     67			bool set)
     68{
     69	struct p54_common *priv = dev->priv;
     70
     71	return p54_update_beacon_tim(priv, sta->aid, set);
     72}
     73
     74u8 *p54_find_ie(struct sk_buff *skb, u8 ie)
     75{
     76	struct ieee80211_mgmt *mgmt = (void *)skb->data;
     77	u8 *pos, *end;
     78
     79	if (skb->len <= sizeof(mgmt))
     80		return NULL;
     81
     82	pos = (u8 *)mgmt->u.beacon.variable;
     83	end = skb->data + skb->len;
     84	while (pos < end) {
     85		if (pos + 2 + pos[1] > end)
     86			return NULL;
     87
     88		if (pos[0] == ie)
     89			return pos;
     90
     91		pos += 2 + pos[1];
     92	}
     93	return NULL;
     94}
     95
     96static int p54_beacon_format_ie_tim(struct sk_buff *skb)
     97{
     98	/*
     99	 * the good excuse for this mess is ... the firmware.
    100	 * The dummy TIM MUST be at the end of the beacon frame,
    101	 * because it'll be overwritten!
    102	 */
    103	u8 *tim;
    104	u8 dtim_len;
    105	u8 dtim_period;
    106	u8 *next;
    107
    108	tim = p54_find_ie(skb, WLAN_EID_TIM);
    109	if (!tim)
    110		return 0;
    111
    112	dtim_len = tim[1];
    113	dtim_period = tim[3];
    114	next = tim + 2 + dtim_len;
    115
    116	if (dtim_len < 3)
    117		return -EINVAL;
    118
    119	memmove(tim, next, skb_tail_pointer(skb) - next);
    120	tim = skb_tail_pointer(skb) - (dtim_len + 2);
    121
    122	/* add the dummy at the end */
    123	tim[0] = WLAN_EID_TIM;
    124	tim[1] = 3;
    125	tim[2] = 0;
    126	tim[3] = dtim_period;
    127	tim[4] = 0;
    128
    129	if (dtim_len > 3)
    130		skb_trim(skb, skb->len - (dtim_len - 3));
    131
    132	return 0;
    133}
    134
    135static int p54_beacon_update(struct p54_common *priv,
    136			struct ieee80211_vif *vif)
    137{
    138	struct ieee80211_tx_control control = { };
    139	struct sk_buff *beacon;
    140	int ret;
    141
    142	beacon = ieee80211_beacon_get(priv->hw, vif);
    143	if (!beacon)
    144		return -ENOMEM;
    145	ret = p54_beacon_format_ie_tim(beacon);
    146	if (ret)
    147		return ret;
    148
    149	/*
    150	 * During operation, the firmware takes care of beaconing.
    151	 * The driver only needs to upload a new beacon template, once
    152	 * the template was changed by the stack or userspace.
    153	 *
    154	 * LMAC API 3.2.2 also specifies that the driver does not need
    155	 * to cancel the old beacon template by hand, instead the firmware
    156	 * will release the previous one through the feedback mechanism.
    157	 */
    158	p54_tx_80211(priv->hw, &control, beacon);
    159	priv->tsf_high32 = 0;
    160	priv->tsf_low32 = 0;
    161
    162	return 0;
    163}
    164
    165static int p54_start(struct ieee80211_hw *dev)
    166{
    167	struct p54_common *priv = dev->priv;
    168	int err;
    169
    170	mutex_lock(&priv->conf_mutex);
    171	err = priv->open(dev);
    172	if (err)
    173		goto out;
    174	P54_SET_QUEUE(priv->qos_params[0], 0x0002, 0x0003, 0x0007, 47);
    175	P54_SET_QUEUE(priv->qos_params[1], 0x0002, 0x0007, 0x000f, 94);
    176	P54_SET_QUEUE(priv->qos_params[2], 0x0003, 0x000f, 0x03ff, 0);
    177	P54_SET_QUEUE(priv->qos_params[3], 0x0007, 0x000f, 0x03ff, 0);
    178	err = p54_set_edcf(priv);
    179	if (err)
    180		goto out;
    181
    182	eth_broadcast_addr(priv->bssid);
    183	priv->mode = NL80211_IFTYPE_MONITOR;
    184	err = p54_setup_mac(priv);
    185	if (err) {
    186		priv->mode = NL80211_IFTYPE_UNSPECIFIED;
    187		goto out;
    188	}
    189
    190	ieee80211_queue_delayed_work(dev, &priv->work, 0);
    191
    192	priv->softled_state = 0;
    193	err = p54_set_leds(priv);
    194
    195out:
    196	mutex_unlock(&priv->conf_mutex);
    197	return err;
    198}
    199
    200static void p54_stop(struct ieee80211_hw *dev)
    201{
    202	struct p54_common *priv = dev->priv;
    203	int i;
    204
    205	priv->mode = NL80211_IFTYPE_UNSPECIFIED;
    206	priv->softled_state = 0;
    207	cancel_delayed_work_sync(&priv->work);
    208	mutex_lock(&priv->conf_mutex);
    209	p54_set_leds(priv);
    210	priv->stop(dev);
    211	skb_queue_purge(&priv->tx_pending);
    212	skb_queue_purge(&priv->tx_queue);
    213	for (i = 0; i < P54_QUEUE_NUM; i++) {
    214		priv->tx_stats[i].count = 0;
    215		priv->tx_stats[i].len = 0;
    216	}
    217
    218	priv->beacon_req_id = cpu_to_le32(0);
    219	priv->tsf_high32 = priv->tsf_low32 = 0;
    220	mutex_unlock(&priv->conf_mutex);
    221}
    222
    223static int p54_add_interface(struct ieee80211_hw *dev,
    224			     struct ieee80211_vif *vif)
    225{
    226	struct p54_common *priv = dev->priv;
    227	int err;
    228
    229	vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
    230
    231	mutex_lock(&priv->conf_mutex);
    232	if (priv->mode != NL80211_IFTYPE_MONITOR) {
    233		mutex_unlock(&priv->conf_mutex);
    234		return -EOPNOTSUPP;
    235	}
    236
    237	priv->vif = vif;
    238
    239	switch (vif->type) {
    240	case NL80211_IFTYPE_STATION:
    241	case NL80211_IFTYPE_ADHOC:
    242	case NL80211_IFTYPE_AP:
    243	case NL80211_IFTYPE_MESH_POINT:
    244		priv->mode = vif->type;
    245		break;
    246	default:
    247		mutex_unlock(&priv->conf_mutex);
    248		return -EOPNOTSUPP;
    249	}
    250
    251	memcpy(priv->mac_addr, vif->addr, ETH_ALEN);
    252	err = p54_setup_mac(priv);
    253	mutex_unlock(&priv->conf_mutex);
    254	return err;
    255}
    256
    257static void p54_remove_interface(struct ieee80211_hw *dev,
    258				 struct ieee80211_vif *vif)
    259{
    260	struct p54_common *priv = dev->priv;
    261
    262	mutex_lock(&priv->conf_mutex);
    263	priv->vif = NULL;
    264
    265	/*
    266	 * LMAC API 3.2.2 states that any active beacon template must be
    267	 * canceled by the driver before attempting a mode transition.
    268	 */
    269	if (le32_to_cpu(priv->beacon_req_id) != 0) {
    270		p54_tx_cancel(priv, priv->beacon_req_id);
    271		wait_for_completion_interruptible_timeout(&priv->beacon_comp, HZ);
    272	}
    273	priv->mode = NL80211_IFTYPE_MONITOR;
    274	eth_zero_addr(priv->mac_addr);
    275	eth_zero_addr(priv->bssid);
    276	p54_setup_mac(priv);
    277	mutex_unlock(&priv->conf_mutex);
    278}
    279
    280static int p54_wait_for_stats(struct ieee80211_hw *dev)
    281{
    282	struct p54_common *priv = dev->priv;
    283	int ret;
    284
    285	priv->update_stats = true;
    286	ret = p54_fetch_statistics(priv);
    287	if (ret)
    288		return ret;
    289
    290	ret = wait_for_completion_interruptible_timeout(&priv->stat_comp, HZ);
    291	if (ret == 0)
    292		return -ETIMEDOUT;
    293
    294	return 0;
    295}
    296
    297static void p54_reset_stats(struct p54_common *priv)
    298{
    299	struct ieee80211_channel *chan = priv->curchan;
    300
    301	if (chan) {
    302		struct survey_info *info = &priv->survey[chan->hw_value];
    303
    304		/* only reset channel statistics, don't touch .filled, etc. */
    305		info->time = 0;
    306		info->time_busy = 0;
    307		info->time_tx = 0;
    308	}
    309
    310	priv->update_stats = true;
    311	priv->survey_raw.active = 0;
    312	priv->survey_raw.cca = 0;
    313	priv->survey_raw.tx = 0;
    314}
    315
    316static int p54_config(struct ieee80211_hw *dev, u32 changed)
    317{
    318	int ret = 0;
    319	struct p54_common *priv = dev->priv;
    320	struct ieee80211_conf *conf = &dev->conf;
    321
    322	mutex_lock(&priv->conf_mutex);
    323	if (changed & IEEE80211_CONF_CHANGE_POWER)
    324		priv->output_power = conf->power_level << 2;
    325	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
    326		struct ieee80211_channel *oldchan;
    327		WARN_ON(p54_wait_for_stats(dev));
    328		oldchan = priv->curchan;
    329		priv->curchan = NULL;
    330		ret = p54_scan(priv, P54_SCAN_EXIT, 0);
    331		if (ret) {
    332			priv->curchan = oldchan;
    333			goto out;
    334		}
    335		/*
    336		 * TODO: Use the LM_SCAN_TRAP to determine the current
    337		 * operating channel.
    338		 */
    339		priv->curchan = priv->hw->conf.chandef.chan;
    340		p54_reset_stats(priv);
    341		WARN_ON(p54_fetch_statistics(priv));
    342	}
    343	if (changed & IEEE80211_CONF_CHANGE_PS) {
    344		WARN_ON(p54_wait_for_stats(dev));
    345		ret = p54_set_ps(priv);
    346		if (ret)
    347			goto out;
    348		WARN_ON(p54_wait_for_stats(dev));
    349	}
    350	if (changed & IEEE80211_CONF_CHANGE_IDLE) {
    351		WARN_ON(p54_wait_for_stats(dev));
    352		ret = p54_setup_mac(priv);
    353		if (ret)
    354			goto out;
    355		WARN_ON(p54_wait_for_stats(dev));
    356	}
    357
    358out:
    359	mutex_unlock(&priv->conf_mutex);
    360	return ret;
    361}
    362
    363static u64 p54_prepare_multicast(struct ieee80211_hw *dev,
    364				 struct netdev_hw_addr_list *mc_list)
    365{
    366	struct p54_common *priv = dev->priv;
    367	struct netdev_hw_addr *ha;
    368	int i;
    369
    370	BUILD_BUG_ON(ARRAY_SIZE(priv->mc_maclist) !=
    371		ARRAY_SIZE(((struct p54_group_address_table *)NULL)->mac_list));
    372	/*
    373	 * The first entry is reserved for the global broadcast MAC.
    374	 * Otherwise the firmware will drop it and ARP will no longer work.
    375	 */
    376	i = 1;
    377	priv->mc_maclist_num = netdev_hw_addr_list_count(mc_list) + i;
    378	netdev_hw_addr_list_for_each(ha, mc_list) {
    379		memcpy(&priv->mc_maclist[i], ha->addr, ETH_ALEN);
    380		i++;
    381		if (i >= ARRAY_SIZE(priv->mc_maclist))
    382			break;
    383	}
    384
    385	return 1; /* update */
    386}
    387
    388static void p54_configure_filter(struct ieee80211_hw *dev,
    389				 unsigned int changed_flags,
    390				 unsigned int *total_flags,
    391				 u64 multicast)
    392{
    393	struct p54_common *priv = dev->priv;
    394
    395	*total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS;
    396
    397	priv->filter_flags = *total_flags;
    398
    399	if (changed_flags & FIF_OTHER_BSS)
    400		p54_setup_mac(priv);
    401
    402	if (changed_flags & FIF_ALLMULTI || multicast)
    403		p54_set_groupfilter(priv);
    404}
    405
    406static int p54_conf_tx(struct ieee80211_hw *dev,
    407		       struct ieee80211_vif *vif, u16 queue,
    408		       const struct ieee80211_tx_queue_params *params)
    409{
    410	struct p54_common *priv = dev->priv;
    411	int ret;
    412
    413	mutex_lock(&priv->conf_mutex);
    414	P54_SET_QUEUE(priv->qos_params[queue], params->aifs,
    415		      params->cw_min, params->cw_max, params->txop);
    416	ret = p54_set_edcf(priv);
    417	mutex_unlock(&priv->conf_mutex);
    418	return ret;
    419}
    420
    421static void p54_work(struct work_struct *work)
    422{
    423	struct p54_common *priv = container_of(work, struct p54_common,
    424					       work.work);
    425
    426	if (unlikely(priv->mode == NL80211_IFTYPE_UNSPECIFIED))
    427		return ;
    428
    429	/*
    430	 * TODO: walk through tx_queue and do the following tasks
    431	 * 	1. initiate bursts.
    432	 *      2. cancel stuck frames / reset the device if necessary.
    433	 */
    434
    435	mutex_lock(&priv->conf_mutex);
    436	WARN_ON_ONCE(p54_fetch_statistics(priv));
    437	mutex_unlock(&priv->conf_mutex);
    438}
    439
    440static int p54_get_stats(struct ieee80211_hw *dev,
    441			 struct ieee80211_low_level_stats *stats)
    442{
    443	struct p54_common *priv = dev->priv;
    444
    445	memcpy(stats, &priv->stats, sizeof(*stats));
    446	return 0;
    447}
    448
    449static void p54_bss_info_changed(struct ieee80211_hw *dev,
    450				 struct ieee80211_vif *vif,
    451				 struct ieee80211_bss_conf *info,
    452				 u32 changed)
    453{
    454	struct p54_common *priv = dev->priv;
    455
    456	mutex_lock(&priv->conf_mutex);
    457	if (changed & BSS_CHANGED_BSSID) {
    458		memcpy(priv->bssid, info->bssid, ETH_ALEN);
    459		p54_setup_mac(priv);
    460	}
    461
    462	if (changed & BSS_CHANGED_BEACON) {
    463		p54_scan(priv, P54_SCAN_EXIT, 0);
    464		p54_setup_mac(priv);
    465		p54_beacon_update(priv, vif);
    466		p54_set_edcf(priv);
    467	}
    468
    469	if (changed & (BSS_CHANGED_ERP_SLOT | BSS_CHANGED_BEACON)) {
    470		priv->use_short_slot = info->use_short_slot;
    471		p54_set_edcf(priv);
    472	}
    473	if (changed & BSS_CHANGED_BASIC_RATES) {
    474		if (dev->conf.chandef.chan->band == NL80211_BAND_5GHZ)
    475			priv->basic_rate_mask = (info->basic_rates << 4);
    476		else
    477			priv->basic_rate_mask = info->basic_rates;
    478		p54_setup_mac(priv);
    479		if (priv->fw_var >= 0x500)
    480			p54_scan(priv, P54_SCAN_EXIT, 0);
    481	}
    482	if (changed & BSS_CHANGED_ASSOC) {
    483		if (info->assoc) {
    484			priv->aid = info->aid;
    485			priv->wakeup_timer = info->beacon_int *
    486					     info->dtim_period * 5;
    487			p54_setup_mac(priv);
    488		} else {
    489			priv->wakeup_timer = 500;
    490			priv->aid = 0;
    491		}
    492	}
    493
    494	mutex_unlock(&priv->conf_mutex);
    495}
    496
    497static int p54_set_key(struct ieee80211_hw *dev, enum set_key_cmd cmd,
    498		       struct ieee80211_vif *vif, struct ieee80211_sta *sta,
    499		       struct ieee80211_key_conf *key)
    500{
    501	struct p54_common *priv = dev->priv;
    502	int slot, ret = 0;
    503	u8 algo = 0;
    504	u8 *addr = NULL;
    505
    506	if (modparam_nohwcrypt)
    507		return -EOPNOTSUPP;
    508
    509	if (key->flags & IEEE80211_KEY_FLAG_RX_MGMT) {
    510		/*
    511		 * Unfortunately most/all firmwares are trying to decrypt
    512		 * incoming management frames if a suitable key can be found.
    513		 * However, in doing so the data in these frames gets
    514		 * corrupted. So, we can't have firmware supported crypto
    515		 * offload in this case.
    516		 */
    517		return -EOPNOTSUPP;
    518	}
    519
    520	mutex_lock(&priv->conf_mutex);
    521	if (cmd == SET_KEY) {
    522		switch (key->cipher) {
    523		case WLAN_CIPHER_SUITE_TKIP:
    524			if (!(priv->privacy_caps & (BR_DESC_PRIV_CAP_MICHAEL |
    525			      BR_DESC_PRIV_CAP_TKIP))) {
    526				ret = -EOPNOTSUPP;
    527				goto out_unlock;
    528			}
    529			key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
    530			algo = P54_CRYPTO_TKIPMICHAEL;
    531			break;
    532		case WLAN_CIPHER_SUITE_WEP40:
    533		case WLAN_CIPHER_SUITE_WEP104:
    534			if (!(priv->privacy_caps & BR_DESC_PRIV_CAP_WEP)) {
    535				ret = -EOPNOTSUPP;
    536				goto out_unlock;
    537			}
    538			key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
    539			algo = P54_CRYPTO_WEP;
    540			break;
    541		case WLAN_CIPHER_SUITE_CCMP:
    542			if (!(priv->privacy_caps & BR_DESC_PRIV_CAP_AESCCMP)) {
    543				ret = -EOPNOTSUPP;
    544				goto out_unlock;
    545			}
    546			key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
    547			algo = P54_CRYPTO_AESCCMP;
    548			break;
    549		default:
    550			ret = -EOPNOTSUPP;
    551			goto out_unlock;
    552		}
    553		slot = bitmap_find_free_region(priv->used_rxkeys,
    554					       priv->rx_keycache_size, 0);
    555
    556		if (slot < 0) {
    557			/*
    558			 * The device supports the chosen algorithm, but the
    559			 * firmware does not provide enough key slots to store
    560			 * all of them.
    561			 * But encryption offload for outgoing frames is always
    562			 * possible, so we just pretend that the upload was
    563			 * successful and do the decryption in software.
    564			 */
    565
    566			/* mark the key as invalid. */
    567			key->hw_key_idx = 0xff;
    568			goto out_unlock;
    569		}
    570
    571		key->flags |= IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
    572	} else {
    573		slot = key->hw_key_idx;
    574
    575		if (slot == 0xff) {
    576			/* This key was not uploaded into the rx key cache. */
    577
    578			goto out_unlock;
    579		}
    580
    581		bitmap_release_region(priv->used_rxkeys, slot, 0);
    582		algo = 0;
    583	}
    584
    585	if (sta)
    586		addr = sta->addr;
    587
    588	ret = p54_upload_key(priv, algo, slot, key->keyidx,
    589			     key->keylen, addr, key->key);
    590	if (ret) {
    591		bitmap_release_region(priv->used_rxkeys, slot, 0);
    592		ret = -EOPNOTSUPP;
    593		goto out_unlock;
    594	}
    595
    596	key->hw_key_idx = slot;
    597
    598out_unlock:
    599	mutex_unlock(&priv->conf_mutex);
    600	return ret;
    601}
    602
    603static int p54_get_survey(struct ieee80211_hw *dev, int idx,
    604				struct survey_info *survey)
    605{
    606	struct p54_common *priv = dev->priv;
    607	struct ieee80211_channel *chan;
    608	int err, tries;
    609	bool in_use = false;
    610
    611	if (idx >= priv->chan_num)
    612		return -ENOENT;
    613
    614#define MAX_TRIES 1
    615	for (tries = 0; tries < MAX_TRIES; tries++) {
    616		chan = priv->curchan;
    617		if (chan && chan->hw_value == idx) {
    618			mutex_lock(&priv->conf_mutex);
    619			err = p54_wait_for_stats(dev);
    620			mutex_unlock(&priv->conf_mutex);
    621			if (err)
    622				return err;
    623
    624			in_use = true;
    625		}
    626
    627		memcpy(survey, &priv->survey[idx], sizeof(*survey));
    628
    629		if (in_use) {
    630			/* test if the reported statistics are valid. */
    631			if  (survey->time != 0) {
    632				survey->filled |= SURVEY_INFO_IN_USE;
    633			} else {
    634				/*
    635				 * hw/fw has not accumulated enough sample sets.
    636				 * Wait for 100ms, this ought to be enough to
    637				 * to get at least one non-null set of channel
    638				 * usage statistics.
    639				 */
    640				msleep(100);
    641				continue;
    642			}
    643		}
    644		return 0;
    645	}
    646	return -ETIMEDOUT;
    647#undef MAX_TRIES
    648}
    649
    650static unsigned int p54_flush_count(struct p54_common *priv)
    651{
    652	unsigned int total = 0, i;
    653
    654	BUILD_BUG_ON(P54_QUEUE_NUM > ARRAY_SIZE(priv->tx_stats));
    655
    656	/*
    657	 * Because the firmware has the sole control over any frames
    658	 * in the P54_QUEUE_BEACON or P54_QUEUE_SCAN queues, they
    659	 * don't really count as pending or active.
    660	 */
    661	for (i = P54_QUEUE_MGMT; i < P54_QUEUE_NUM; i++)
    662		total += priv->tx_stats[i].len;
    663	return total;
    664}
    665
    666static void p54_flush(struct ieee80211_hw *dev, struct ieee80211_vif *vif,
    667		      u32 queues, bool drop)
    668{
    669	struct p54_common *priv = dev->priv;
    670	unsigned int total, i;
    671
    672	/*
    673	 * Currently, it wouldn't really matter if we wait for one second
    674	 * or 15 minutes. But once someone gets around and completes the
    675	 * TODOs [ancel stuck frames / reset device] in p54_work, it will
    676	 * suddenly make sense to wait that long.
    677	 */
    678	i = P54_STATISTICS_UPDATE * 2 / 20;
    679
    680	/*
    681	 * In this case no locking is required because as we speak the
    682	 * queues have already been stopped and no new frames can sneak
    683	 * up from behind.
    684	 */
    685	while ((total = p54_flush_count(priv) && i--)) {
    686		/* waste time */
    687		msleep(20);
    688	}
    689
    690	WARN(total, "tx flush timeout, unresponsive firmware");
    691}
    692
    693static void p54_set_coverage_class(struct ieee80211_hw *dev,
    694				   s16 coverage_class)
    695{
    696	struct p54_common *priv = dev->priv;
    697
    698	mutex_lock(&priv->conf_mutex);
    699	/* support all coverage class values as in 802.11-2007 Table 7-27 */
    700	priv->coverage_class = clamp_t(u8, coverage_class, 0, 31);
    701	p54_set_edcf(priv);
    702	mutex_unlock(&priv->conf_mutex);
    703}
    704
    705static const struct ieee80211_ops p54_ops = {
    706	.tx			= p54_tx_80211,
    707	.start			= p54_start,
    708	.stop			= p54_stop,
    709	.add_interface		= p54_add_interface,
    710	.remove_interface	= p54_remove_interface,
    711	.set_tim		= p54_set_tim,
    712	.sta_notify		= p54_sta_notify,
    713	.sta_add		= p54_sta_add_remove,
    714	.sta_remove		= p54_sta_add_remove,
    715	.set_key		= p54_set_key,
    716	.config			= p54_config,
    717	.flush			= p54_flush,
    718	.bss_info_changed	= p54_bss_info_changed,
    719	.prepare_multicast	= p54_prepare_multicast,
    720	.configure_filter	= p54_configure_filter,
    721	.conf_tx		= p54_conf_tx,
    722	.get_stats		= p54_get_stats,
    723	.get_survey		= p54_get_survey,
    724	.set_coverage_class	= p54_set_coverage_class,
    725};
    726
    727struct ieee80211_hw *p54_init_common(size_t priv_data_len)
    728{
    729	struct ieee80211_hw *dev;
    730	struct p54_common *priv;
    731
    732	dev = ieee80211_alloc_hw(priv_data_len, &p54_ops);
    733	if (!dev)
    734		return NULL;
    735
    736	priv = dev->priv;
    737	priv->hw = dev;
    738	priv->mode = NL80211_IFTYPE_UNSPECIFIED;
    739	priv->basic_rate_mask = 0x15f;
    740	spin_lock_init(&priv->tx_stats_lock);
    741	skb_queue_head_init(&priv->tx_queue);
    742	skb_queue_head_init(&priv->tx_pending);
    743	ieee80211_hw_set(dev, REPORTS_TX_ACK_STATUS);
    744	ieee80211_hw_set(dev, MFP_CAPABLE);
    745	ieee80211_hw_set(dev, PS_NULLFUNC_STACK);
    746	ieee80211_hw_set(dev, SUPPORTS_PS);
    747	ieee80211_hw_set(dev, RX_INCLUDES_FCS);
    748	ieee80211_hw_set(dev, SIGNAL_DBM);
    749
    750	dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
    751				      BIT(NL80211_IFTYPE_ADHOC) |
    752				      BIT(NL80211_IFTYPE_AP) |
    753				      BIT(NL80211_IFTYPE_MESH_POINT);
    754
    755	priv->beacon_req_id = cpu_to_le32(0);
    756	priv->tx_stats[P54_QUEUE_BEACON].limit = 1;
    757	priv->tx_stats[P54_QUEUE_FWSCAN].limit = 1;
    758	priv->tx_stats[P54_QUEUE_MGMT].limit = 3;
    759	priv->tx_stats[P54_QUEUE_CAB].limit = 3;
    760	priv->tx_stats[P54_QUEUE_DATA].limit = 5;
    761	dev->queues = 1;
    762	priv->noise = -94;
    763	/*
    764	 * We support at most 8 tries no matter which rate they're at,
    765	 * we cannot support max_rates * max_rate_tries as we set it
    766	 * here, but setting it correctly to 4/2 or so would limit us
    767	 * artificially if the RC algorithm wants just two rates, so
    768	 * let's say 4/7, we'll redistribute it at TX time, see the
    769	 * comments there.
    770	 */
    771	dev->max_rates = 4;
    772	dev->max_rate_tries = 7;
    773	dev->extra_tx_headroom = sizeof(struct p54_hdr) + 4 +
    774				 sizeof(struct p54_tx_data);
    775
    776	/*
    777	 * For now, disable PS by default because it affects
    778	 * link stability significantly.
    779	 */
    780	dev->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
    781
    782	mutex_init(&priv->conf_mutex);
    783	mutex_init(&priv->eeprom_mutex);
    784	init_completion(&priv->stat_comp);
    785	init_completion(&priv->eeprom_comp);
    786	init_completion(&priv->beacon_comp);
    787	INIT_DELAYED_WORK(&priv->work, p54_work);
    788
    789	eth_broadcast_addr(priv->mc_maclist[0]);
    790	priv->curchan = NULL;
    791	p54_reset_stats(priv);
    792	return dev;
    793}
    794EXPORT_SYMBOL_GPL(p54_init_common);
    795
    796int p54_register_common(struct ieee80211_hw *dev, struct device *pdev)
    797{
    798	struct p54_common __maybe_unused *priv = dev->priv;
    799	int err;
    800
    801	err = ieee80211_register_hw(dev);
    802	if (err) {
    803		dev_err(pdev, "Cannot register device (%d).\n", err);
    804		return err;
    805	}
    806	priv->registered = true;
    807
    808#ifdef CONFIG_P54_LEDS
    809	err = p54_init_leds(priv);
    810	if (err) {
    811		p54_unregister_common(dev);
    812		return err;
    813	}
    814#endif /* CONFIG_P54_LEDS */
    815
    816	dev_info(pdev, "is registered as '%s'\n", wiphy_name(dev->wiphy));
    817	return 0;
    818}
    819EXPORT_SYMBOL_GPL(p54_register_common);
    820
    821void p54_free_common(struct ieee80211_hw *dev)
    822{
    823	struct p54_common *priv = dev->priv;
    824	unsigned int i;
    825
    826	for (i = 0; i < NUM_NL80211_BANDS; i++)
    827		kfree(priv->band_table[i]);
    828
    829	kfree(priv->iq_autocal);
    830	kfree(priv->output_limit);
    831	kfree(priv->curve_data);
    832	kfree(priv->rssi_db);
    833	kfree(priv->used_rxkeys);
    834	kfree(priv->survey);
    835	priv->iq_autocal = NULL;
    836	priv->output_limit = NULL;
    837	priv->curve_data = NULL;
    838	priv->rssi_db = NULL;
    839	priv->used_rxkeys = NULL;
    840	priv->survey = NULL;
    841	ieee80211_free_hw(dev);
    842}
    843EXPORT_SYMBOL_GPL(p54_free_common);
    844
    845void p54_unregister_common(struct ieee80211_hw *dev)
    846{
    847	struct p54_common *priv = dev->priv;
    848
    849	if (priv->registered) {
    850		priv->registered = false;
    851#ifdef CONFIG_P54_LEDS
    852		p54_unregister_leds(priv);
    853#endif /* CONFIG_P54_LEDS */
    854		ieee80211_unregister_hw(dev);
    855	}
    856
    857	mutex_destroy(&priv->conf_mutex);
    858	mutex_destroy(&priv->eeprom_mutex);
    859}
    860EXPORT_SYMBOL_GPL(p54_unregister_common);