xref: /linux/drivers/net/wireless/mediatek/mt76/mac80211.c (revision 160b8e75932fd51a49607d32dbfa1d417977b79c)
1 /*
2  * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 #include <linux/of.h>
17 #include "mt76.h"
18 
19 #define CHAN2G(_idx, _freq) {			\
20 	.band = NL80211_BAND_2GHZ,		\
21 	.center_freq = (_freq),			\
22 	.hw_value = (_idx),			\
23 	.max_power = 30,			\
24 }
25 
26 #define CHAN5G(_idx, _freq) {			\
27 	.band = NL80211_BAND_5GHZ,		\
28 	.center_freq = (_freq),			\
29 	.hw_value = (_idx),			\
30 	.max_power = 30,			\
31 }
32 
33 static const struct ieee80211_channel mt76_channels_2ghz[] = {
34 	CHAN2G(1, 2412),
35 	CHAN2G(2, 2417),
36 	CHAN2G(3, 2422),
37 	CHAN2G(4, 2427),
38 	CHAN2G(5, 2432),
39 	CHAN2G(6, 2437),
40 	CHAN2G(7, 2442),
41 	CHAN2G(8, 2447),
42 	CHAN2G(9, 2452),
43 	CHAN2G(10, 2457),
44 	CHAN2G(11, 2462),
45 	CHAN2G(12, 2467),
46 	CHAN2G(13, 2472),
47 	CHAN2G(14, 2484),
48 };
49 
50 static const struct ieee80211_channel mt76_channels_5ghz[] = {
51 	CHAN5G(36, 5180),
52 	CHAN5G(40, 5200),
53 	CHAN5G(44, 5220),
54 	CHAN5G(48, 5240),
55 
56 	CHAN5G(52, 5260),
57 	CHAN5G(56, 5280),
58 	CHAN5G(60, 5300),
59 	CHAN5G(64, 5320),
60 
61 	CHAN5G(100, 5500),
62 	CHAN5G(104, 5520),
63 	CHAN5G(108, 5540),
64 	CHAN5G(112, 5560),
65 	CHAN5G(116, 5580),
66 	CHAN5G(120, 5600),
67 	CHAN5G(124, 5620),
68 	CHAN5G(128, 5640),
69 	CHAN5G(132, 5660),
70 	CHAN5G(136, 5680),
71 	CHAN5G(140, 5700),
72 
73 	CHAN5G(149, 5745),
74 	CHAN5G(153, 5765),
75 	CHAN5G(157, 5785),
76 	CHAN5G(161, 5805),
77 	CHAN5G(165, 5825),
78 };
79 
80 static const struct ieee80211_tpt_blink mt76_tpt_blink[] = {
81 	{ .throughput =   0 * 1024, .blink_time = 334 },
82 	{ .throughput =   1 * 1024, .blink_time = 260 },
83 	{ .throughput =   5 * 1024, .blink_time = 220 },
84 	{ .throughput =  10 * 1024, .blink_time = 190 },
85 	{ .throughput =  20 * 1024, .blink_time = 170 },
86 	{ .throughput =  50 * 1024, .blink_time = 150 },
87 	{ .throughput =  70 * 1024, .blink_time = 130 },
88 	{ .throughput = 100 * 1024, .blink_time = 110 },
89 	{ .throughput = 200 * 1024, .blink_time =  80 },
90 	{ .throughput = 300 * 1024, .blink_time =  50 },
91 };
92 
93 static int mt76_led_init(struct mt76_dev *dev)
94 {
95 	struct device_node *np = dev->dev->of_node;
96 	struct ieee80211_hw *hw = dev->hw;
97 	int led_pin;
98 
99 	if (!dev->led_cdev.brightness_set && !dev->led_cdev.blink_set)
100 		return 0;
101 
102 	snprintf(dev->led_name, sizeof(dev->led_name),
103 		 "mt76-%s", wiphy_name(hw->wiphy));
104 
105 	dev->led_cdev.name = dev->led_name;
106 	dev->led_cdev.default_trigger =
107 		ieee80211_create_tpt_led_trigger(hw,
108 					IEEE80211_TPT_LEDTRIG_FL_RADIO,
109 					mt76_tpt_blink,
110 					ARRAY_SIZE(mt76_tpt_blink));
111 
112 	np = of_get_child_by_name(np, "led");
113 	if (np) {
114 		if (!of_property_read_u32(np, "led-sources", &led_pin))
115 			dev->led_pin = led_pin;
116 		dev->led_al = of_property_read_bool(np, "led-active-low");
117 	}
118 
119 	return devm_led_classdev_register(dev->dev, &dev->led_cdev);
120 }
121 
122 static int
123 mt76_init_sband(struct mt76_dev *dev, struct mt76_sband *msband,
124 		const struct ieee80211_channel *chan, int n_chan,
125 		struct ieee80211_rate *rates, int n_rates, bool vht)
126 {
127 	struct ieee80211_supported_band *sband = &msband->sband;
128 	struct ieee80211_sta_ht_cap *ht_cap;
129 	struct ieee80211_sta_vht_cap *vht_cap;
130 	void *chanlist;
131 	u16 mcs_map;
132 	int size;
133 
134 	size = n_chan * sizeof(*chan);
135 	chanlist = devm_kmemdup(dev->dev, chan, size, GFP_KERNEL);
136 	if (!chanlist)
137 		return -ENOMEM;
138 
139 	msband->chan = devm_kzalloc(dev->dev, n_chan * sizeof(*msband->chan),
140 				    GFP_KERNEL);
141 	if (!msband->chan)
142 		return -ENOMEM;
143 
144 	sband->channels = chanlist;
145 	sband->n_channels = n_chan;
146 	sband->bitrates = rates;
147 	sband->n_bitrates = n_rates;
148 	dev->chandef.chan = &sband->channels[0];
149 
150 	ht_cap = &sband->ht_cap;
151 	ht_cap->ht_supported = true;
152 	ht_cap->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
153 		       IEEE80211_HT_CAP_GRN_FLD |
154 		       IEEE80211_HT_CAP_SGI_20 |
155 		       IEEE80211_HT_CAP_SGI_40 |
156 		       IEEE80211_HT_CAP_TX_STBC |
157 		       (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
158 
159 	ht_cap->mcs.rx_mask[0] = 0xff;
160 	ht_cap->mcs.rx_mask[1] = 0xff;
161 	ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
162 	ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
163 	ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_4;
164 
165 	if (!vht)
166 		return 0;
167 
168 	vht_cap = &sband->vht_cap;
169 	vht_cap->vht_supported = true;
170 
171 	mcs_map = (IEEE80211_VHT_MCS_SUPPORT_0_9 << (0 * 2)) |
172 		  (IEEE80211_VHT_MCS_SUPPORT_0_9 << (1 * 2)) |
173 		  (IEEE80211_VHT_MCS_NOT_SUPPORTED << (2 * 2)) |
174 		  (IEEE80211_VHT_MCS_NOT_SUPPORTED << (3 * 2)) |
175 		  (IEEE80211_VHT_MCS_NOT_SUPPORTED << (4 * 2)) |
176 		  (IEEE80211_VHT_MCS_NOT_SUPPORTED << (5 * 2)) |
177 		  (IEEE80211_VHT_MCS_NOT_SUPPORTED << (6 * 2)) |
178 		  (IEEE80211_VHT_MCS_NOT_SUPPORTED << (7 * 2));
179 
180 	vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
181 	vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
182 	vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC |
183 			IEEE80211_VHT_CAP_TXSTBC |
184 			IEEE80211_VHT_CAP_RXSTBC_1 |
185 			IEEE80211_VHT_CAP_SHORT_GI_80;
186 
187 	return 0;
188 }
189 
190 static int
191 mt76_init_sband_2g(struct mt76_dev *dev, struct ieee80211_rate *rates,
192 		   int n_rates)
193 {
194 	dev->hw->wiphy->bands[NL80211_BAND_2GHZ] = &dev->sband_2g.sband;
195 
196 	return mt76_init_sband(dev, &dev->sband_2g,
197 			       mt76_channels_2ghz,
198 			       ARRAY_SIZE(mt76_channels_2ghz),
199 			       rates, n_rates, false);
200 }
201 
202 static int
203 mt76_init_sband_5g(struct mt76_dev *dev, struct ieee80211_rate *rates,
204 		   int n_rates, bool vht)
205 {
206 	dev->hw->wiphy->bands[NL80211_BAND_5GHZ] = &dev->sband_5g.sband;
207 
208 	return mt76_init_sband(dev, &dev->sband_5g,
209 			       mt76_channels_5ghz,
210 			       ARRAY_SIZE(mt76_channels_5ghz),
211 			       rates, n_rates, vht);
212 }
213 
214 static void
215 mt76_check_sband(struct mt76_dev *dev, int band)
216 {
217 	struct ieee80211_supported_band *sband = dev->hw->wiphy->bands[band];
218 	bool found = false;
219 	int i;
220 
221 	if (!sband)
222 		return;
223 
224 	for (i = 0; i < sband->n_channels; i++) {
225 		if (sband->channels[i].flags & IEEE80211_CHAN_DISABLED)
226 			continue;
227 
228 		found = true;
229 		break;
230 	}
231 
232 	if (found)
233 		return;
234 
235 	sband->n_channels = 0;
236 	dev->hw->wiphy->bands[band] = NULL;
237 }
238 
239 int mt76_register_device(struct mt76_dev *dev, bool vht,
240 			 struct ieee80211_rate *rates, int n_rates)
241 {
242 	struct ieee80211_hw *hw = dev->hw;
243 	struct wiphy *wiphy = hw->wiphy;
244 	int ret;
245 
246 	dev_set_drvdata(dev->dev, dev);
247 
248 	spin_lock_init(&dev->lock);
249 	spin_lock_init(&dev->cc_lock);
250 	INIT_LIST_HEAD(&dev->txwi_cache);
251 
252 	SET_IEEE80211_DEV(hw, dev->dev);
253 	SET_IEEE80211_PERM_ADDR(hw, dev->macaddr);
254 
255 	wiphy->interface_modes =
256 		BIT(NL80211_IFTYPE_STATION) |
257 		BIT(NL80211_IFTYPE_AP) |
258 #ifdef CONFIG_MAC80211_MESH
259 		BIT(NL80211_IFTYPE_MESH_POINT) |
260 #endif
261 		BIT(NL80211_IFTYPE_ADHOC);
262 
263 	wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR;
264 
265 	hw->txq_data_size = sizeof(struct mt76_txq);
266 	hw->max_tx_fragments = 16;
267 
268 	ieee80211_hw_set(hw, SIGNAL_DBM);
269 	ieee80211_hw_set(hw, PS_NULLFUNC_STACK);
270 	ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING);
271 	ieee80211_hw_set(hw, AMPDU_AGGREGATION);
272 	ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);
273 	ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
274 	ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
275 	ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
276 	ieee80211_hw_set(hw, TX_AMSDU);
277 	ieee80211_hw_set(hw, TX_FRAG_LIST);
278 	ieee80211_hw_set(hw, MFP_CAPABLE);
279 	ieee80211_hw_set(hw, AP_LINK_PS);
280 
281 	wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
282 
283 	if (dev->cap.has_2ghz) {
284 		ret = mt76_init_sband_2g(dev, rates, n_rates);
285 		if (ret)
286 			return ret;
287 	}
288 
289 	if (dev->cap.has_5ghz) {
290 		ret = mt76_init_sband_5g(dev, rates + 4, n_rates - 4, vht);
291 		if (ret)
292 			return ret;
293 	}
294 
295 	wiphy_read_of_freq_limits(dev->hw->wiphy);
296 	mt76_check_sband(dev, NL80211_BAND_2GHZ);
297 	mt76_check_sband(dev, NL80211_BAND_5GHZ);
298 
299 	ret = mt76_led_init(dev);
300 	if (ret)
301 		return ret;
302 
303 	return ieee80211_register_hw(hw);
304 }
305 EXPORT_SYMBOL_GPL(mt76_register_device);
306 
307 void mt76_unregister_device(struct mt76_dev *dev)
308 {
309 	struct ieee80211_hw *hw = dev->hw;
310 
311 	ieee80211_unregister_hw(hw);
312 	mt76_tx_free(dev);
313 }
314 EXPORT_SYMBOL_GPL(mt76_unregister_device);
315 
316 void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb)
317 {
318 	if (!test_bit(MT76_STATE_RUNNING, &dev->state)) {
319 		dev_kfree_skb(skb);
320 		return;
321 	}
322 
323 	__skb_queue_tail(&dev->rx_skb[q], skb);
324 }
325 EXPORT_SYMBOL_GPL(mt76_rx);
326 
327 void mt76_set_channel(struct mt76_dev *dev)
328 {
329 	struct ieee80211_hw *hw = dev->hw;
330 	struct cfg80211_chan_def *chandef = &hw->conf.chandef;
331 	struct mt76_channel_state *state;
332 	bool offchannel = hw->conf.flags & IEEE80211_CONF_OFFCHANNEL;
333 
334 	if (dev->drv->update_survey)
335 		dev->drv->update_survey(dev);
336 
337 	dev->chandef = *chandef;
338 
339 	if (!offchannel)
340 		dev->main_chan = chandef->chan;
341 
342 	if (chandef->chan != dev->main_chan) {
343 		state = mt76_channel_state(dev, chandef->chan);
344 		memset(state, 0, sizeof(*state));
345 	}
346 }
347 EXPORT_SYMBOL_GPL(mt76_set_channel);
348 
349 int mt76_get_survey(struct ieee80211_hw *hw, int idx,
350 		    struct survey_info *survey)
351 {
352 	struct mt76_dev *dev = hw->priv;
353 	struct mt76_sband *sband;
354 	struct ieee80211_channel *chan;
355 	struct mt76_channel_state *state;
356 	int ret = 0;
357 
358 	if (idx == 0 && dev->drv->update_survey)
359 		dev->drv->update_survey(dev);
360 
361 	sband = &dev->sband_2g;
362 	if (idx >= sband->sband.n_channels) {
363 		idx -= sband->sband.n_channels;
364 		sband = &dev->sband_5g;
365 	}
366 
367 	if (idx >= sband->sband.n_channels)
368 		return -ENOENT;
369 
370 	chan = &sband->sband.channels[idx];
371 	state = mt76_channel_state(dev, chan);
372 
373 	memset(survey, 0, sizeof(*survey));
374 	survey->channel = chan;
375 	survey->filled = SURVEY_INFO_TIME | SURVEY_INFO_TIME_BUSY;
376 	if (chan == dev->main_chan)
377 		survey->filled |= SURVEY_INFO_IN_USE;
378 
379 	spin_lock_bh(&dev->cc_lock);
380 	survey->time = div_u64(state->cc_active, 1000);
381 	survey->time_busy = div_u64(state->cc_busy, 1000);
382 	spin_unlock_bh(&dev->cc_lock);
383 
384 	return ret;
385 }
386 EXPORT_SYMBOL_GPL(mt76_get_survey);
387 
388 void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid,
389 			 struct ieee80211_key_conf *key)
390 {
391 	struct ieee80211_key_seq seq;
392 	int i;
393 
394 	wcid->rx_check_pn = false;
395 
396 	if (!key)
397 		return;
398 
399 	if (key->cipher == WLAN_CIPHER_SUITE_CCMP)
400 		wcid->rx_check_pn = true;
401 
402 	for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
403 		ieee80211_get_key_rx_seq(key, i, &seq);
404 		memcpy(wcid->rx_key_pn[i], seq.ccmp.pn, sizeof(seq.ccmp.pn));
405 	}
406 }
407 EXPORT_SYMBOL(mt76_wcid_key_setup);
408 
409 static struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb)
410 {
411 	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
412 	struct mt76_rx_status mstat;
413 
414 	mstat = *((struct mt76_rx_status *) skb->cb);
415 	memset(status, 0, sizeof(*status));
416 
417 	status->flag = mstat.flag;
418 	status->freq = mstat.freq;
419 	status->enc_flags = mstat.enc_flags;
420 	status->encoding = mstat.encoding;
421 	status->bw = mstat.bw;
422 	status->rate_idx = mstat.rate_idx;
423 	status->nss = mstat.nss;
424 	status->band = mstat.band;
425 	status->signal = mstat.signal;
426 	status->chains = mstat.chains;
427 
428 	BUILD_BUG_ON(sizeof(mstat) > sizeof(skb->cb));
429 	BUILD_BUG_ON(sizeof(status->chain_signal) != sizeof(mstat.chain_signal));
430 	memcpy(status->chain_signal, mstat.chain_signal, sizeof(mstat.chain_signal));
431 
432 	return wcid_to_sta(mstat.wcid);
433 }
434 
435 static int
436 mt76_check_ccmp_pn(struct sk_buff *skb)
437 {
438 	struct mt76_rx_status *status = (struct mt76_rx_status *) skb->cb;
439 	struct mt76_wcid *wcid = status->wcid;
440 	struct ieee80211_hdr *hdr;
441 	int ret;
442 
443 	if (!(status->flag & RX_FLAG_DECRYPTED))
444 		return 0;
445 
446 	if (!wcid || !wcid->rx_check_pn)
447 		return 0;
448 
449 	if (!(status->flag & RX_FLAG_IV_STRIPPED)) {
450 		/*
451 		 * Validate the first fragment both here and in mac80211
452 		 * All further fragments will be validated by mac80211 only.
453 		 */
454 		hdr = (struct ieee80211_hdr *) skb->data;
455 		if (ieee80211_is_frag(hdr) &&
456 		    !ieee80211_is_first_frag(hdr->frame_control))
457 			return 0;
458 	}
459 
460 	BUILD_BUG_ON(sizeof(status->iv) != sizeof(wcid->rx_key_pn[0]));
461 	ret = memcmp(status->iv, wcid->rx_key_pn[status->tid],
462 		     sizeof(status->iv));
463 	if (ret <= 0)
464 		return -EINVAL; /* replay */
465 
466 	memcpy(wcid->rx_key_pn[status->tid], status->iv, sizeof(status->iv));
467 
468 	if (status->flag & RX_FLAG_IV_STRIPPED)
469 		status->flag |= RX_FLAG_PN_VALIDATED;
470 
471 	return 0;
472 }
473 
474 static void
475 mt76_check_ps(struct mt76_dev *dev, struct sk_buff *skb)
476 {
477 	struct mt76_rx_status *status = (struct mt76_rx_status *) skb->cb;
478 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
479 	struct ieee80211_sta *sta;
480 	struct mt76_wcid *wcid = status->wcid;
481 	bool ps;
482 
483 	if (!wcid || !wcid->sta)
484 		return;
485 
486 	sta = container_of((void *) wcid, struct ieee80211_sta, drv_priv);
487 
488 	if (!test_bit(MT_WCID_FLAG_CHECK_PS, &wcid->flags))
489 		return;
490 
491 	if (ieee80211_is_pspoll(hdr->frame_control)) {
492 		ieee80211_sta_pspoll(sta);
493 		return;
494 	}
495 
496 	if (ieee80211_has_morefrags(hdr->frame_control) ||
497 		!(ieee80211_is_mgmt(hdr->frame_control) ||
498 		  ieee80211_is_data(hdr->frame_control)))
499 		return;
500 
501 	ps = ieee80211_has_pm(hdr->frame_control);
502 
503 	if (ps && (ieee80211_is_data_qos(hdr->frame_control) ||
504 		   ieee80211_is_qos_nullfunc(hdr->frame_control)))
505 		ieee80211_sta_uapsd_trigger(sta, status->tid);
506 
507 	if (!!test_bit(MT_WCID_FLAG_PS, &wcid->flags) == ps)
508 		return;
509 
510 	if (ps) {
511 		set_bit(MT_WCID_FLAG_PS, &wcid->flags);
512 		mt76_stop_tx_queues(dev, sta, true);
513 	} else {
514 		clear_bit(MT_WCID_FLAG_PS, &wcid->flags);
515 	}
516 
517 	ieee80211_sta_ps_transition(sta, ps);
518 	dev->drv->sta_ps(dev, sta, ps);
519 }
520 
521 void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
522 		      int queue)
523 {
524 	struct napi_struct *napi = NULL;
525 	struct ieee80211_sta *sta;
526 	struct sk_buff *skb;
527 
528 	if (queue >= 0)
529 	    napi = &dev->napi[queue];
530 
531 	while ((skb = __skb_dequeue(frames)) != NULL) {
532 		if (mt76_check_ccmp_pn(skb)) {
533 			dev_kfree_skb(skb);
534 			continue;
535 		}
536 
537 		sta = mt76_rx_convert(skb);
538 		ieee80211_rx_napi(dev->hw, sta, skb, napi);
539 	}
540 }
541 
542 void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q)
543 {
544 	struct sk_buff_head frames;
545 	struct sk_buff *skb;
546 
547 	__skb_queue_head_init(&frames);
548 
549 	while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) {
550 		mt76_check_ps(dev, skb);
551 		mt76_rx_aggr_reorder(skb, &frames);
552 	}
553 
554 	mt76_rx_complete(dev, &frames, q);
555 }
556