* bad values in output of 'iw event'
From: Bastian Bittorf @ 2017-02-14 15:05 UTC (permalink / raw)
To: linux-wireless
the former patch about rate-report/unfilled values
reminded me, that i can see with recent 'wireless-testing'
strange values when watching the output of 'iw event'.
maybe something similar...:
Mon Feb 13 11:18:52 CET 2017 DEBUG: wlan1-1 (phy #1): unknown event 60
Mon Feb 13 11:18:52 CET 2017 DEBUG: wlan0: del station 64:09:80:7f:48:86
Mon Feb 13 11:18:52 CET 2017 DEBUG: wlan1: del station b0:48:7a:a5:96:2e
Mon Feb 13 11:18:52 CET 2017 DEBUG: wlan1: del station f4:ec:38:fd:74:b4
Mon Feb 13 11:18:52 CET 2017 DEBUG: wlan1: del station f4:ec:38:9d:86:36
Mon Feb 13 11:18:52 CET 2017 DEBUG: ���T (phy #0): unknown event 8
Mon Feb 13 11:18:52 CET 2017 DEBUG: ���T (phy #1): unknown event 8
Mon Feb 13 11:18:52 CET 2017 DEBUG: ���T (phy #1): unknown event 8
Mon Feb 13 11:18:53 CET 2017 DEBUG: wlan0 (phy #0): unknown event 7
Mon Feb 13 11:18:53 CET 2017 DEBUG: wlan0 (phy #0): unknown event 43
Mon Feb 13 11:18:53 CET 2017 DEBUG: wlan0: new station 64:09:80:7f:48:86
Mon Feb 13 11:18:53 CET 2017 DEBUG: wlan1 (phy #1): unknown event 7
Mon Feb 13 11:18:53 CET 2017 DEBUG: wlan1-1 (phy #1): unknown event 7
Mon Feb 13 11:18:53 CET 2017 DEBUG: wlan1 (phy #1): unknown event 43
Mon Feb 13 11:18:53 CET 2017 DEBUG: wlan1: new station f4:ec:38:fd:74:b4
Mon Feb 13 11:18:53 CET 2017 DEBUG: wlan1: new station f4:ec:38:9d:86:36
Mon Feb 13 11:18:53 CET 2017 DEBUG: wlan1: new station b0:48:7a:a5:96:2e
Mon Feb 13 11:18:54 CET 2017 DEBUG: wlan1-1 (phy #1): unknown event 60
thanks & bye, bastian
^ permalink raw reply
* Re: [PATCH v3] ath10k: add support for controlling tx power to a station
From: Valo, Kalle @ 2017-02-14 15:05 UTC (permalink / raw)
To: kbuild test robot
Cc: Nagarajan, Ashok Raj, arnagara@codeaurora.org,
linux-wireless@vger.kernel.org, kbuild-all@01.org,
ath10k@lists.infradead.org
In-Reply-To: <201702120825.pCIZZp0b%fengguang.wu@intel.com>
kbuild test robot <lkp@intel.com> writes:
> Hi Ashok,
>
> [auto build test ERROR on v4.9-rc8]
> [cannot apply to ath6kl/ath-next next-20170210]
> [if your patch is applied to the wrong git tree, please drop us a note to=
help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Ashok-Raj-Nagarajan/ath1=
0k-add-support-for-controlling-tx-power-to-a-station/20170208-203305
> config: x86_64-randconfig-in0-02120025 (attached as .config)
> compiler: gcc-4.6 (Debian 4.6.4-7) 4.6.4
> reproduce:
> # save the attached .config to linux build tree
> make ARCH=3Dx86_64=20
>
> All errors (new ones prefixed by >>):
>
> drivers/net/wireless/ath/ath10k/mac.c: In function 'ath10k_sta_set_txp=
wr':
>>> drivers/net/wireless/ath/ath10k/mac.c:5900:10: error: 'struct
>>> ieee80211_sta' has no member named 'txpwr'
> drivers/net/wireless/ath/ath10k/mac.c: At top level:
>>> drivers/net/wireless/ath/ath10k/mac.c:7469:2: error: unknown field
>>> 'sta_set_txpwr' specified in initializer
> drivers/net/wireless/ath/ath10k/mac.c:7469:2: warning:
> initialization from incompatible pointer type [enabled by default]
> drivers/net/wireless/ath/ath10k/mac.c:7469:2: warning: (near
> initialization for 'ath10k_ops.sta_pre_rcu_remove') [enabled by
> default]
> drivers/net/wireless/ath/ath10k/mac.c: In function 'ath10k_mac_registe=
r':
>>> drivers/net/wireless/ath/ath10k/mac.c:8008:11: error:
>>> 'NL80211_EXT_FEATURE_STA_TX_PWR' undeclared (first use in this
>>> function)
These are expected as this depends on cfg80211 patch not yet applied.
--=20
Kalle Valo=
^ permalink raw reply
* Re: [PATCH 06/10] rt2x00: fixup fill_tx_status for nomatch case
From: Felix Fietkau @ 2017-02-14 13:51 UTC (permalink / raw)
To: Stanislaw Gruszka, linux-wireless; +Cc: Helmut Schaa
In-Reply-To: <1487076368-7020-7-git-send-email-sgruszka@redhat.com>
On 2017-02-14 13:46, Stanislaw Gruszka wrote:
> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
> ---
> drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 6 +++++-
> drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 1 +
> 2 files changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
> index 90fc259..258d94d 100644
> --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
> +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
> @@ -357,6 +357,9 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev,
> if (i < (IEEE80211_TX_MAX_RATES - 1))
> tx_info->status.rates[i].idx = -1; /* terminate */
>
> + if (!test_bit(TXDONE_ACK_REQ, &txdesc->flags))
> + tx_info->flags |= IEEE80211_TX_CTL_NO_ACK;
> +
Since nothing sets TXDONE_ACK_REQ, this will probably create a regression.
- Felix
^ permalink raw reply
* Re: [PATCH 02/10] rt2800: identify station based on status WCID
From: Felix Fietkau @ 2017-02-14 13:46 UTC (permalink / raw)
To: Stanislaw Gruszka; +Cc: linux-wireless, Helmut Schaa
In-Reply-To: <20170214133244.GA6437@redhat.com>
On 2017-02-14 14:32, Stanislaw Gruszka wrote:
> On Tue, Feb 14, 2017 at 02:10:01PM +0100, Felix Fietkau wrote:
>> On 2017-02-14 13:46, Stanislaw Gruszka wrote:
>> > Add station field to skb_frame_desc and assign it according to status
>> > WCID. This field will be used in the future.
>> >
>> > Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
>> I see some potential for race conditions in this approach. You store the
>> sta pointer in struct skb_frame_desc, but I don't see anything that
>> guarantees that the sta will be around for as long as the tx frame is held.
>> I think a better approach would be to not store the sta pointer in
>> skb_frame_desc at all.
>> Instead, add a driver callback to look up the sta by wcid, and use rcu
>> properly there. Make sure you only hold the sta pointer obtained from
>> that call within a RCU read locked section.
>
> On patch 7, where ->sta start to be used, I added RCU protection.
Maybe you should get rid of the skbdesc->sta assignment in patch 2,
because this is somewhat confusing.
- Felix
^ permalink raw reply
* Re: [PATCH 02/10] rt2800: identify station based on status WCID
From: Stanislaw Gruszka @ 2017-02-14 13:32 UTC (permalink / raw)
To: Felix Fietkau; +Cc: linux-wireless, Helmut Schaa
In-Reply-To: <bf62370e-fe78-470b-4902-92fbb1d093f8@nbd.name>
On Tue, Feb 14, 2017 at 02:10:01PM +0100, Felix Fietkau wrote:
> On 2017-02-14 13:46, Stanislaw Gruszka wrote:
> > Add station field to skb_frame_desc and assign it according to status
> > WCID. This field will be used in the future.
> >
> > Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
> I see some potential for race conditions in this approach. You store the
> sta pointer in struct skb_frame_desc, but I don't see anything that
> guarantees that the sta will be around for as long as the tx frame is held.
> I think a better approach would be to not store the sta pointer in
> skb_frame_desc at all.
> Instead, add a driver callback to look up the sta by wcid, and use rcu
> properly there. Make sure you only hold the sta pointer obtained from
> that call within a RCU read locked section.
On patch 7, where ->sta start to be used, I added RCU protection.
Stanislaw
^ permalink raw reply
* Re: [RFC V2 1/5] nl80211: allow multiple active scheduled scan requests
From: Johannes Berg @ 2017-02-14 13:34 UTC (permalink / raw)
To: Arend Van Spriel; +Cc: linux-wireless
In-Reply-To: <fbaa960e-b14a-e50c-c49e-913e823b1e74@broadcom.com>
On Tue, 2017-02-14 at 14:33 +0100, Arend Van Spriel wrote:
> On 24-1-2017 10:40, Johannes Berg wrote:
> > > + /* leave request id zero for legacy request
> > > + * or if driver does not support multi-scheduled scan
> > > + */
> > > + if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) {
> >
> > Why do the >1 check here? It probably doesn't really make a
> > difference
> > since only one can be running at a time, but it might be nicer - at
> > least for debug in userspace - to have a real value for all multi
> > scans?
>
> I added the check, because drivers not supporting multi-scheduled
> scan might not bother using the request id in event reporting.
Ok, that's a good point.
johannes
^ permalink raw reply
* Re: [RFC V2 1/5] nl80211: allow multiple active scheduled scan requests
From: Arend Van Spriel @ 2017-02-14 13:33 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless
In-Reply-To: <1485250815.7244.8.camel@sipsolutions.net>
On 24-1-2017 10:40, Johannes Berg wrote:
>> + /* leave request id zero for legacy request
>> + * or if driver does not support multi-scheduled scan
>> + */
>> + if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) {
>
> Why do the >1 check here? It probably doesn't really make a difference
> since only one can be running at a time, but it might be nicer - at
> least for debug in userspace - to have a real value for all multi
> scans?
I added the check, because drivers not supporting multi-scheduled scan
might not bother using the request id in event reporting.
Regards,
Arend
^ permalink raw reply
* [RFC v2 7/7] mac80211: copy VHT EXT NSS BW Support/Capable data to station
From: Johannes Berg @ 2017-02-14 13:22 UTC (permalink / raw)
To: linux-wireless; +Cc: j, greearb, Johannes Berg
In-Reply-To: <20170214132208.8715-1-johannes@sipsolutions.net>
From: Johannes Berg <johannes.berg@intel.com>
When taking VHT capabilities for a station, copy the new
fields if we support them as a transmitted.
Also, since it was missing, copy tx_highest and rx_highest.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
net/mac80211/vht.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/net/mac80211/vht.c b/net/mac80211/vht.c
index 19ec2189d3ac..c75d37f9bff0 100644
--- a/net/mac80211/vht.c
+++ b/net/mac80211/vht.c
@@ -197,6 +197,20 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
break;
}
+ /* keep these, no need to limit to our own */
+ vht_cap->vht_mcs.tx_highest = vht_cap_ie->supp_mcs.tx_highest;
+ vht_cap->vht_mcs.rx_highest = vht_cap_ie->supp_mcs.rx_highest;
+
+ /*
+ * copy these only if rate control supports it, since otherwise some
+ * helper functions might return data that's not valid
+ */
+ if (ieee80211_hw_check(&sdata->local->hw, SUPPORTS_VHT_EXT_NSS_BW))
+ vht_cap->cap |= (cap_info & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK);
+ else
+ vht_cap->vht_mcs.tx_highest &=
+ ~cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
+
/* symmetric capabilities */
vht_cap->cap |= cap_info & own_cap.cap &
(IEEE80211_VHT_CAP_SHORT_GI_80 |
--
2.9.3
^ permalink raw reply related
* [RFC v2 6/7] mac80211: add ability to parse CCFS2
From: Johannes Berg @ 2017-02-14 13:22 UTC (permalink / raw)
To: linux-wireless; +Cc: j, greearb, Johannes Berg
In-Reply-To: <20170214132208.8715-1-johannes@sipsolutions.net>
From: Johannes Berg <johannes.berg@intel.com>
With newer VHT implementations, it's necessary to look at the
HT operation's CCFS2 field to identify the actual bandwidth
used.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
net/mac80211/ibss.c | 4 +++-
net/mac80211/ieee80211_i.h | 4 +++-
net/mac80211/mesh.c | 4 +++-
net/mac80211/mlme.c | 3 ++-
net/mac80211/spectmgmt.c | 5 ++++-
net/mac80211/util.c | 48 ++++++++++++++++++++++++++++++----------------
6 files changed, 47 insertions(+), 21 deletions(-)
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index 98999d3d5262..a5c0c5818da5 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -1065,7 +1065,9 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
struct ieee80211_vht_cap cap_ie;
struct ieee80211_sta_vht_cap cap = sta->sta.vht_cap;
- ieee80211_chandef_vht_oper(elems->vht_operation,
+ ieee80211_chandef_vht_oper(&local->hw,
+ elems->vht_operation,
+ elems->ht_operation,
&chandef);
memcpy(&cap_ie, elems->vht_cap_elem, sizeof(cap_ie));
ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 159a1a733725..b5f8bd9dfd8e 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -2071,7 +2071,9 @@ u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo);
/* channel management */
bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper,
struct cfg80211_chan_def *chandef);
-bool ieee80211_chandef_vht_oper(const struct ieee80211_vht_operation *oper,
+bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw,
+ const struct ieee80211_vht_operation *oper,
+ const struct ieee80211_ht_operation *htop,
struct cfg80211_chan_def *chandef);
u32 ieee80211_chandef_downgrade(struct cfg80211_chan_def *c);
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
index c28b0af9c1f2..1b60b4350517 100644
--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -92,7 +92,9 @@ bool mesh_matches_local(struct ieee80211_sub_if_data *sdata,
cfg80211_chandef_create(&sta_chan_def, sdata->vif.bss_conf.chandef.chan,
NL80211_CHAN_NO_HT);
ieee80211_chandef_ht_oper(ie->ht_operation, &sta_chan_def);
- ieee80211_chandef_vht_oper(ie->vht_operation, &sta_chan_def);
+ ieee80211_chandef_vht_oper(&sdata->local->hw,
+ ie->vht_operation, ie->ht_operation,
+ &sta_chan_def);
if (!cfg80211_chandef_compatible(&sdata->vif.bss_conf.chandef,
&sta_chan_def))
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 6e90301154d5..4d20e574a906 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -213,7 +213,8 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
}
vht_chandef = *chandef;
- if (!ieee80211_chandef_vht_oper(vht_oper, &vht_chandef)) {
+ if (!ieee80211_chandef_vht_oper(&sdata->local->hw,
+ vht_oper, ht_oper, &vht_chandef)) {
if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT))
sdata_info(sdata,
"AP VHT information is invalid, disable VHT\n");
diff --git a/net/mac80211/spectmgmt.c b/net/mac80211/spectmgmt.c
index 0782e486fe89..5a013b53b4f0 100644
--- a/net/mac80211/spectmgmt.c
+++ b/net/mac80211/spectmgmt.c
@@ -138,6 +138,7 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
wide_bw_chansw_ie->new_center_freq_seg1,
/* .basic_mcs_set doesn't matter */
};
+ struct ieee80211_ht_operation ht_oper = {};
/* default, for the case of IEEE80211_VHT_CHANWIDTH_USE_HT,
* to the previously parsed chandef
@@ -145,7 +146,9 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
new_vht_chandef = csa_ie->chandef;
/* ignore if parsing fails */
- if (!ieee80211_chandef_vht_oper(&vht_oper, &new_vht_chandef))
+ if (!ieee80211_chandef_vht_oper(&sdata->local->hw,
+ &vht_oper, &ht_oper,
+ &new_vht_chandef))
new_vht_chandef.chan = NULL;
if (sta_flags & IEEE80211_STA_DISABLE_80P80MHZ &&
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 7a37ce78bb38..152aae54b67f 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2482,49 +2482,65 @@ bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper,
return true;
}
-bool ieee80211_chandef_vht_oper(const struct ieee80211_vht_operation *oper,
+bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw,
+ const struct ieee80211_vht_operation *oper,
+ const struct ieee80211_ht_operation *htop,
struct cfg80211_chan_def *chandef)
{
struct cfg80211_chan_def new = *chandef;
- int cf1, cf2;
+ int cf0, cf1;
+ int ccfs0, ccfs1, ccfs2;
+ int ccf0, ccf1;
- if (!oper)
+ if (!oper || !htop)
return false;
- cf1 = ieee80211_channel_to_frequency(oper->center_freq_seg0_idx,
- chandef->chan->band);
- cf2 = ieee80211_channel_to_frequency(oper->center_freq_seg1_idx,
- chandef->chan->band);
+ ccfs0 = oper->center_freq_seg0_idx;
+ ccfs1 = oper->center_freq_seg1_idx;
+ ccfs2 = (le16_to_cpu(htop->operation_mode) &
+ IEEE80211_HT_OP_MODE_CCFS2_MASK)
+ >> IEEE80211_HT_OP_MODE_CCFS2_SHIFT;
+
+ /* when parsing (and we know how to) CCFS1 and CCFS2 are equivalent */
+ ccf0 = ccfs0;
+ ccf1 = ccfs1;
+ if (!ccfs1 && ieee80211_hw_check(hw, SUPPORTS_VHT_EXT_NSS_BW))
+ ccf1 = ccfs2;
+
+ cf0 = ieee80211_channel_to_frequency(ccf0, chandef->chan->band);
+ cf1 = ieee80211_channel_to_frequency(ccf1, chandef->chan->band);
switch (oper->chan_width) {
case IEEE80211_VHT_CHANWIDTH_USE_HT:
+ /* just use HT information directly */
break;
case IEEE80211_VHT_CHANWIDTH_80MHZ:
new.width = NL80211_CHAN_WIDTH_80;
- new.center_freq1 = cf1;
+ new.center_freq1 = cf0;
/* If needed, adjust based on the newer interop workaround. */
- if (oper->center_freq_seg1_idx) {
+ if (ccf1) {
unsigned int diff;
- diff = abs(oper->center_freq_seg1_idx -
- oper->center_freq_seg0_idx);
+ diff = abs(ccf1 - ccf0);
if (diff == 8) {
new.width = NL80211_CHAN_WIDTH_160;
- new.center_freq1 = cf2;
+ new.center_freq1 = cf1;
} else if (diff > 8) {
new.width = NL80211_CHAN_WIDTH_80P80;
- new.center_freq2 = cf2;
+ new.center_freq2 = cf1;
}
}
break;
case IEEE80211_VHT_CHANWIDTH_160MHZ:
+ /* deprecated encoding */
new.width = NL80211_CHAN_WIDTH_160;
- new.center_freq1 = cf1;
+ new.center_freq1 = cf0;
break;
case IEEE80211_VHT_CHANWIDTH_80P80MHZ:
+ /* deprecated encoding */
new.width = NL80211_CHAN_WIDTH_80P80;
- new.center_freq1 = cf1;
- new.center_freq2 = cf2;
+ new.center_freq1 = cf0;
+ new.center_freq2 = cf1;
break;
default:
return false;
--
2.9.3
^ permalink raw reply related
* [RFC v2 5/7] mac80211: introduce capability flags for VHT EXT NSS support
From: Johannes Berg @ 2017-02-14 13:22 UTC (permalink / raw)
To: linux-wireless; +Cc: j, greearb, Johannes Berg
In-Reply-To: <20170214132208.8715-1-johannes@sipsolutions.net>
From: Johannes Berg <johannes.berg@intel.com>
Depending on whether or not rate control supports selecting
rates depending on the bandwidth, we can use VHT extended
NSS support. In essence, this is dot11VHTExtendedNSSBWCapable
from the spec, since depending on that we'll need to parse
the bandwidth.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
include/net/mac80211.h | 18 ++++++++++++++++++
net/mac80211/debugfs.c | 1 +
net/mac80211/main.c | 6 ++++++
3 files changed, 25 insertions(+)
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index b9a08cd1d97d..68f90180a470 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2043,6 +2043,11 @@ struct ieee80211_txq {
* The stack will not do fragmentation.
* The callback for @set_frag_threshold should be set as well.
*
+ * @IEEE80211_HW_SUPPORTS_VHT_EXT_NSS_BW: (Hardware) rate control supports VHT
+ * extended NSS BW (dot11VHTExtendedNSSBWCapable). This flag will be set if
+ * the selected rate control algorithm sets %RATE_CTRL_CAPA_VHT_EXT_NSS_BW
+ * but if the rate control is built-in then it must be set by the driver.
+ *
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
*/
enum ieee80211_hw_flags {
@@ -2085,6 +2090,7 @@ enum ieee80211_hw_flags {
IEEE80211_HW_TX_FRAG_LIST,
IEEE80211_HW_REPORTS_LOW_ACK,
IEEE80211_HW_SUPPORTS_TX_FRAG,
+ IEEE80211_HW_SUPPORTS_VHT_EXT_NSS_BW,
/* keep last, obviously */
NUM_IEEE80211_HW_FLAGS
@@ -5458,7 +5464,19 @@ struct ieee80211_tx_rate_control {
bool bss;
};
+/**
+ * enum rate_control_capabilities - rate control capabilities
+ */
+enum rate_control_capabilities {
+ /**
+ * @RATE_CTRL_CAPA_VHT_EXT_NSS_BW:
+ * support for extended NSS BW support (dot11VHTExtendedNSSCapable)
+ */
+ RATE_CTRL_CAPA_VHT_EXT_NSS_BW = BIT(0),
+};
+
struct rate_control_ops {
+ unsigned long capa;
const char *name;
void *(*alloc)(struct ieee80211_hw *hw, struct dentry *debugfsdir);
void (*free)(void *priv);
diff --git a/net/mac80211/debugfs.c b/net/mac80211/debugfs.c
index 5fae001f286c..a431514ea01c 100644
--- a/net/mac80211/debugfs.c
+++ b/net/mac80211/debugfs.c
@@ -211,6 +211,7 @@ static const char *hw_flag_names[] = {
FLAG(TX_FRAG_LIST),
FLAG(REPORTS_LOW_ACK),
FLAG(SUPPORTS_TX_FRAG),
+ FLAG(SUPPORTS_VHT_EXT_NSS_BW),
#undef FLAG
};
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index 56fb47953b72..91e2faf174dd 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -1095,6 +1095,12 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
goto fail_rate;
}
+ if (local->rate_ctrl) {
+ clear_bit(IEEE80211_HW_SUPPORTS_VHT_EXT_NSS_BW, hw->flags);
+ if (local->rate_ctrl->ops->capa & RATE_CTRL_CAPA_VHT_EXT_NSS_BW)
+ ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
+ }
+
/* add one default STA interface if supported */
if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION) &&
!ieee80211_hw_check(hw, NO_AUTO_VIF)) {
--
2.9.3
^ permalink raw reply related
* [RFC v2 4/7] mac80211: remove local pointer from rate_ctrl_ref
From: Johannes Berg @ 2017-02-14 13:22 UTC (permalink / raw)
To: linux-wireless; +Cc: j, greearb, Johannes Berg
In-Reply-To: <20170214132208.8715-1-johannes@sipsolutions.net>
From: Johannes Berg <johannes.berg@intel.com>
This pointer really isn't needed, so remove it.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
net/mac80211/rate.c | 10 +++++-----
net/mac80211/rate.h | 1 -
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c
index 206698bc93f4..094c15645228 100644
--- a/net/mac80211/rate.c
+++ b/net/mac80211/rate.c
@@ -208,7 +208,6 @@ static struct rate_control_ref *rate_control_alloc(const char *name,
ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL);
if (!ref)
return NULL;
- ref->local = local;
ref->ops = ieee80211_rate_control_ops_get(name);
if (!ref->ops)
goto free;
@@ -229,13 +228,14 @@ static struct rate_control_ref *rate_control_alloc(const char *name,
return NULL;
}
-static void rate_control_free(struct rate_control_ref *ctrl_ref)
+static void rate_control_free(struct ieee80211_local *local,
+ struct rate_control_ref *ctrl_ref)
{
ctrl_ref->ops->free(ctrl_ref->priv);
#ifdef CONFIG_MAC80211_DEBUGFS
- debugfs_remove_recursive(ctrl_ref->local->debugfs.rcdir);
- ctrl_ref->local->debugfs.rcdir = NULL;
+ debugfs_remove_recursive(local->debugfs.rcdir);
+ local->debugfs.rcdir = NULL;
#endif
kfree(ctrl_ref);
@@ -936,6 +936,6 @@ void rate_control_deinitialize(struct ieee80211_local *local)
return;
local->rate_ctrl = NULL;
- rate_control_free(ref);
+ rate_control_free(local, ref);
}
diff --git a/net/mac80211/rate.h b/net/mac80211/rate.h
index 8d3260785b94..d51a1cce4d4a 100644
--- a/net/mac80211/rate.h
+++ b/net/mac80211/rate.h
@@ -20,7 +20,6 @@
#include "driver-ops.h"
struct rate_control_ref {
- struct ieee80211_local *local;
const struct rate_control_ops *ops;
void *priv;
};
--
2.9.3
^ permalink raw reply related
* [RFC v2 1/7] ieee80211: rename CCFS1/CCFS2 to CCFS0/CCFS1
From: Johannes Berg @ 2017-02-14 13:22 UTC (permalink / raw)
To: linux-wireless; +Cc: j, greearb, Johannes Berg
In-Reply-To: <20170214132208.8715-1-johannes@sipsolutions.net>
From: Johannes Berg <johannes.berg@intel.com>
This matches the spec, and otherwise things are really
confusing with the next patch adding CCFS2.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
drivers/net/wireless/marvell/mwifiex/tdls.c | 2 +-
include/linux/ieee80211.h | 4 ++--
net/mac80211/spectmgmt.c | 4 ++--
net/mac80211/util.c | 22 +++++++++++-----------
4 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/drivers/net/wireless/marvell/mwifiex/tdls.c b/drivers/net/wireless/marvell/mwifiex/tdls.c
index df9704de0715..5fc8319ed302 100644
--- a/drivers/net/wireless/marvell/mwifiex/tdls.c
+++ b/drivers/net/wireless/marvell/mwifiex/tdls.c
@@ -349,7 +349,7 @@ static int mwifiex_tdls_add_vht_oper(struct mwifiex_private *priv,
chan_bw = IEEE80211_VHT_CHANWIDTH_USE_HT;
break;
}
- vht_oper->center_freq_seg1_idx =
+ vht_oper->center_freq_seg0_idx =
mwifiex_get_center_freq_index(priv, BAND_AAC,
bss_desc->channel,
chan_bw);
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index 0dd9498c694f..4a15e77d9d66 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -1525,14 +1525,14 @@ enum ieee80211_vht_chanwidth {
* This structure is the "VHT operation element" as
* described in 802.11ac D3.0 8.4.2.161
* @chan_width: Operating channel width
+ * @center_freq_seg0_idx: center freq segment 0 index
* @center_freq_seg1_idx: center freq segment 1 index
- * @center_freq_seg2_idx: center freq segment 2 index
* @basic_mcs_set: VHT Basic MCS rate set
*/
struct ieee80211_vht_operation {
u8 chan_width;
+ u8 center_freq_seg0_idx;
u8 center_freq_seg1_idx;
- u8 center_freq_seg2_idx;
__le16 basic_mcs_set;
} __packed;
diff --git a/net/mac80211/spectmgmt.c b/net/mac80211/spectmgmt.c
index 97f4c9d6b54c..0782e486fe89 100644
--- a/net/mac80211/spectmgmt.c
+++ b/net/mac80211/spectmgmt.c
@@ -132,9 +132,9 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
struct ieee80211_vht_operation vht_oper = {
.chan_width =
wide_bw_chansw_ie->new_channel_width,
- .center_freq_seg1_idx =
+ .center_freq_seg0_idx =
wide_bw_chansw_ie->new_center_freq_seg0,
- .center_freq_seg2_idx =
+ .center_freq_seg1_idx =
wide_bw_chansw_ie->new_center_freq_seg1,
/* .basic_mcs_set doesn't matter */
};
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index ac59fbd280df..7a37ce78bb38 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2413,13 +2413,13 @@ u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
*pos++ = WLAN_EID_VHT_OPERATION;
*pos++ = sizeof(struct ieee80211_vht_operation);
vht_oper = (struct ieee80211_vht_operation *)pos;
- vht_oper->center_freq_seg1_idx = ieee80211_frequency_to_channel(
+ vht_oper->center_freq_seg0_idx = ieee80211_frequency_to_channel(
chandef->center_freq1);
if (chandef->center_freq2)
- vht_oper->center_freq_seg2_idx =
+ vht_oper->center_freq_seg1_idx =
ieee80211_frequency_to_channel(chandef->center_freq2);
else
- vht_oper->center_freq_seg2_idx = 0x00;
+ vht_oper->center_freq_seg1_idx = 0x00;
switch (chandef->width) {
case NL80211_CHAN_WIDTH_160:
@@ -2428,11 +2428,11 @@ u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
* workaround.
*/
vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
- vht_oper->center_freq_seg2_idx = vht_oper->center_freq_seg1_idx;
+ vht_oper->center_freq_seg1_idx = vht_oper->center_freq_seg0_idx;
if (chandef->chan->center_freq < chandef->center_freq1)
- vht_oper->center_freq_seg1_idx -= 8;
+ vht_oper->center_freq_seg0_idx -= 8;
else
- vht_oper->center_freq_seg1_idx += 8;
+ vht_oper->center_freq_seg0_idx += 8;
break;
case NL80211_CHAN_WIDTH_80P80:
/*
@@ -2491,9 +2491,9 @@ bool ieee80211_chandef_vht_oper(const struct ieee80211_vht_operation *oper,
if (!oper)
return false;
- cf1 = ieee80211_channel_to_frequency(oper->center_freq_seg1_idx,
+ cf1 = ieee80211_channel_to_frequency(oper->center_freq_seg0_idx,
chandef->chan->band);
- cf2 = ieee80211_channel_to_frequency(oper->center_freq_seg2_idx,
+ cf2 = ieee80211_channel_to_frequency(oper->center_freq_seg1_idx,
chandef->chan->band);
switch (oper->chan_width) {
@@ -2503,11 +2503,11 @@ bool ieee80211_chandef_vht_oper(const struct ieee80211_vht_operation *oper,
new.width = NL80211_CHAN_WIDTH_80;
new.center_freq1 = cf1;
/* If needed, adjust based on the newer interop workaround. */
- if (oper->center_freq_seg2_idx) {
+ if (oper->center_freq_seg1_idx) {
unsigned int diff;
- diff = abs(oper->center_freq_seg2_idx -
- oper->center_freq_seg1_idx);
+ diff = abs(oper->center_freq_seg1_idx -
+ oper->center_freq_seg0_idx);
if (diff == 8) {
new.width = NL80211_CHAN_WIDTH_160;
new.center_freq1 = cf2;
--
2.9.3
^ permalink raw reply related
* [RFC v2 2/7] ieee80211: define HT operation CCFS2 field
From: Johannes Berg @ 2017-02-14 13:22 UTC (permalink / raw)
To: linux-wireless; +Cc: j, greearb, Johannes Berg
In-Reply-To: <20170214132208.8715-1-johannes@sipsolutions.net>
From: Johannes Berg <johannes.berg@intel.com>
The Channel Center Frequency Segment 2 field is used in
802.11-2016 for encoding the actual channel position of
the 80+80/160 MHz channel, if the max NSS is restricted.
This is used for backwards compatibility.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
include/linux/ieee80211.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index 4a15e77d9d66..4a7200c6c9ea 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -1411,6 +1411,8 @@ struct ieee80211_ht_operation {
#define IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED 3
#define IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT 0x0004
#define IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT 0x0010
+#define IEEE80211_HT_OP_MODE_CCFS2_SHIFT 5
+#define IEEE80211_HT_OP_MODE_CCFS2_MASK 0x1fe0
/* for stbc_param */
#define IEEE80211_HT_STBC_PARAM_DUAL_BEACON 0x0040
--
2.9.3
^ permalink raw reply related
* [RFC v2 3/7] ieee80211: add new VHT capability fields/parsing
From: Johannes Berg @ 2017-02-14 13:22 UTC (permalink / raw)
To: linux-wireless; +Cc: j, greearb, Johannes Berg
In-Reply-To: <20170214132208.8715-1-johannes@sipsolutions.net>
From: Johannes Berg <johannes.berg@intel.com>
IEEE 802.11-2016 extended the VHT capability fields to allow
indicating the number of spatial streams depending on the
actually used bandwidth, add support for decoding this.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
include/linux/ieee80211.h | 105 +++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 103 insertions(+), 2 deletions(-)
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index 4a7200c6c9ea..c51d309a45e7 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -1457,13 +1457,16 @@ struct ieee80211_ht_operation {
* STA can receive. Rate expressed in units of 1 Mbps.
* If this field is 0 this value should not be used to
* consider the highest RX data rate supported.
- * The top 3 bits of this field are reserved.
+ * The top 3 bits of this field indicate the Maximum NSTS,total
+ * (a beamformee capability.)
* @tx_mcs_map: TX MCS map 2 bits for each stream, total 8 streams
* @tx_highest: Indicates highest long GI VHT PPDU data rate
* STA can transmit. Rate expressed in units of 1 Mbps.
* If this field is 0 this value should not be used to
* consider the highest TX data rate supported.
- * The top 3 bits of this field are reserved.
+ * The top 2 bits of this field are reserved, the
+ * 3rd bit from the top indiciates VHT Extended NSS BW
+ * Capability.
*/
struct ieee80211_vht_mcs_info {
__le16 rx_mcs_map;
@@ -1472,6 +1475,13 @@ struct ieee80211_vht_mcs_info {
__le16 tx_highest;
} __packed;
+/* for rx_highest */
+#define IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT 13
+#define IEEE80211_VHT_MAX_NSTS_TOTAL_MASK (7 << IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT)
+
+/* for tx_highest */
+#define IEEE80211_VHT_EXT_NSS_BW_CAPABLE (1 << 13)
+
/**
* enum ieee80211_vht_mcs_support - VHT MCS support definitions
* @IEEE80211_VHT_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the
@@ -1547,6 +1557,7 @@ struct ieee80211_vht_operation {
#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ 0x00000004
#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ 0x00000008
#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK 0x0000000C
+#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT 2
#define IEEE80211_VHT_CAP_RXLDPC 0x00000010
#define IEEE80211_VHT_CAP_SHORT_GI_80 0x00000020
#define IEEE80211_VHT_CAP_SHORT_GI_160 0x00000040
@@ -1575,6 +1586,96 @@ struct ieee80211_vht_operation {
#define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB 0x0c000000
#define IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN 0x10000000
#define IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN 0x20000000
+#define IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT 30
+#define IEEE80211_VHT_CAP_EXT_NSS_BW_MASK 0xc0000000
+
+static int __maybe_unused
+ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
+ enum ieee80211_vht_chanwidth bw,
+ int mcs)
+{
+ u16 map = le16_to_cpu(cap->supp_mcs.rx_mcs_map);
+ int max_vht_nss;
+ int ext_nss_bw;
+ int supp_width;
+ int i, mcs_encoding;
+
+ if (map == 0xffff)
+ return 0;
+
+ if (WARN_ON(mcs > 9))
+ return 0;
+ if (mcs <= 7)
+ mcs_encoding = 0;
+ else if (mcs == 8)
+ mcs_encoding = 1;
+ else
+ mcs_encoding = 2;
+
+ /* find max_vht_nss for the given MCS */
+ for (i = 7; i >= 0; i--) {
+ int supp = (map >> (2*i)) & 3;
+
+ if (supp == 3)
+ continue;
+
+ if (supp >= mcs_encoding) {
+ max_vht_nss = i;
+ break;
+ }
+ }
+
+ if (!(cap->supp_mcs.tx_mcs_map & cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE)))
+ return max_vht_nss;
+
+ ext_nss_bw = (le32_to_cpu(cap->vht_cap_info) &
+ IEEE80211_VHT_CAP_EXT_NSS_BW_MASK)
+ >> IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT;
+ supp_width = (le32_to_cpu(cap->vht_cap_info) &
+ IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK)
+ >> IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT;
+
+ /*
+ * Cover all the special cases according to IEEE 802.11-2016 Table 9-250.
+ * All other cases are either factor of 1 or not valid/supported.
+ */
+ switch (bw) {
+ case IEEE80211_VHT_CHANWIDTH_USE_HT:
+ case IEEE80211_VHT_CHANWIDTH_80MHZ:
+ if ((supp_width == 1 || supp_width == 2) &&
+ ext_nss_bw == 3)
+ return 2 * max_vht_nss;
+ break;
+ case IEEE80211_VHT_CHANWIDTH_160MHZ:
+ if (supp_width == 0 &&
+ (ext_nss_bw == 1 || ext_nss_bw == 2))
+ return DIV_ROUND_UP(max_vht_nss, 2);
+ if (supp_width == 0 &&
+ ext_nss_bw == 3)
+ return DIV_ROUND_UP(3 * max_vht_nss, 4);
+ if (supp_width == 1 &&
+ ext_nss_bw == 3)
+ return 2 * max_vht_nss;
+ break;
+ case IEEE80211_VHT_CHANWIDTH_80P80MHZ:
+ if (supp_width == 0 &&
+ ext_nss_bw == 2)
+ return DIV_ROUND_UP(max_vht_nss, 2);
+ if (supp_width == 0 &&
+ ext_nss_bw == 3)
+ return DIV_ROUND_UP(3 * max_vht_nss, 4);
+ if (supp_width == 1 &&
+ ext_nss_bw == 1)
+ return DIV_ROUND_UP(max_vht_nss, 2);
+ if (supp_width == 1 &&
+ ext_nss_bw == 2)
+ return DIV_ROUND_UP(3 * max_vht_nss, 4);
+ break;
+ }
+
+ /* not covered or invalid combination received */
+ return max_vht_nss;
+}
/* Authentication algorithms */
#define WLAN_AUTH_OPEN 0
--
2.9.3
^ permalink raw reply related
* VHT extended NSS BW support framework
From: Johannes Berg @ 2017-02-14 13:22 UTC (permalink / raw)
To: linux-wireless; +Cc: j, greearb
Hi,
New version - now with more parsing, and a new function to get
the NSS value for a given bandwidth/MCS combination.
It'd be good if somebody were to review this carefully, this is
a rather complex thing...
johannes
^ permalink raw reply
* Re: ANNOUNCE: Netdev 2.1 update Feb 14
From: Jamal Hadi Salim @ 2017-02-14 13:21 UTC (permalink / raw)
To: netdev@vger.kernel.org
Cc: netfilter-devel, netfilter, info, linux-wireless, tech-committee,
David Miller, Stephen Jaworski, Rob Echlin, lwn, people
In-Reply-To: <42736b6d-b23b-bcae-e53d-a943516ce100@mojatatu.com>
On 17-02-14 08:16 AM, Jamal Hadi Salim wrote:
>
> A few announcements:
> -Registration is open. Register early so we can plan better.
> https://onlineregistrations.ca/netdev21/
>
> hotel (If you can get the hotel cheaper online than conference
> rates please send us email, dont book ):
> http://www.netdevconf.org/2.1/hotel.html
>
> News:
> - We are pleased to announce our first silver sponsor! We thank
> ZEVENET for their commitment to the netdev community!
>
Apologies - small correction. ZEVENET is the _first_ bronze
sponsor.
https://www.netdevconf.org/2.1/news.html?sponsor-ZEVENET
cheers,
jamal
^ permalink raw reply
* ANNOUNCE: Netdev 2.1 update Feb 14
From: Jamal Hadi Salim @ 2017-02-14 13:16 UTC (permalink / raw)
To: netdev@vger.kernel.org
Cc: netfilter-devel, netfilter, info, linux-wireless, tech-committee,
David Miller, Stephen Jaworski, Rob Echlin, lwn, people
A few announcements:
-Registration is open. Register early so we can plan better.
https://onlineregistrations.ca/netdev21/
hotel (If you can get the hotel cheaper online than conference
rates please send us email, dont book ):
http://www.netdevconf.org/2.1/hotel.html
News:
- We are pleased to announce our first silver sponsor! We thank
ZEVENET for their commitment to the netdev community!
- The tech committee has accepted another proposal! This time
it is on the topic of DSA from our prolific DSA contributors
Andrew Lunn, Vivien Didelot and Florian Fainelli. This is how
they describe their talk:
----
The Distributed Switch Architecture was first introduced to Linux
nearly 10 years ago and after being mostly quiet for 6 years, it
recently got actively worked on again by a group of tenacious contributors.
In this presentation, we will cover its design goals and paradigms and
why they make it a good fit for supporting small home/office routers and
switches. We will also cover the work that was done over the past 4
years, the relationship with switchdev and the networking stack, and
finally give a heads-up on the upcoming developments to be expected.
-----
Please note that The Call for Proposals is still open, submit early
to avoid the hazards of last minute traffic. Refer to:
http://netdevconf.org/2.1/submit-proposal.html
cheers,
jamal
^ permalink raw reply
* Re: [RFC V2 1/5] nl80211: allow multiple active scheduled scan requests
From: Johannes Berg @ 2017-02-14 13:12 UTC (permalink / raw)
To: Arend Van Spriel; +Cc: linux-wireless
In-Reply-To: <deef3e83-b6d8-f99d-516d-dc6e99013560@broadcom.com>
On Tue, 2017-02-14 at 14:07 +0100, Arend Van Spriel wrote:
> > No. But there was a size limit on how much older userspace could
> > process before we did the splitting.
>
> I see. So basically adding stuff to (split_start == 0) is not wanted.
Correct.
> Just trying to get a clear requirement/rule here. Do we (still) know
> the exact size limit?
No, I don't remember. It's pretty ancient versions of iw/wpa_s that
weren't able to deal with it. There was also interaction with the
allocations in the dump function in nl80211 code itself, but we made
those pretty big already and userspace limits came into play iirc.
johannes
^ permalink raw reply
* Re: [PATCH 02/10] rt2800: identify station based on status WCID
From: Felix Fietkau @ 2017-02-14 13:10 UTC (permalink / raw)
To: Stanislaw Gruszka, linux-wireless; +Cc: Helmut Schaa
In-Reply-To: <1487076368-7020-3-git-send-email-sgruszka@redhat.com>
On 2017-02-14 13:46, Stanislaw Gruszka wrote:
> Add station field to skb_frame_desc and assign it according to status
> WCID. This field will be used in the future.
>
> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
I see some potential for race conditions in this approach. You store the
sta pointer in struct skb_frame_desc, but I don't see anything that
guarantees that the sta will be around for as long as the tx frame is held.
I think a better approach would be to not store the sta pointer in
skb_frame_desc at all.
Instead, add a driver callback to look up the sta by wcid, and use rcu
properly there. Make sure you only hold the sta pointer obtained from
that call within a RCU read locked section.
- Felix
^ permalink raw reply
* Re: [RFC V2 1/5] nl80211: allow multiple active scheduled scan requests
From: Arend Van Spriel @ 2017-02-14 13:07 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless
In-Reply-To: <1487076714.4705.11.camel@sipsolutions.net>
On 14-2-2017 13:51, Johannes Berg wrote:
> On Tue, 2017-02-14 at 13:35 +0100, Arend Van Spriel wrote:
>> On 24-1-2017 10:40, Johannes Berg wrote:
>>>
>>>> + * @max_sched_scan_reqs: maximum number of scheduled scan
>>>> requests
>>>> that
>>>> + * the device can run concurrently.
>>>
>>> Perhaps we should get rid of WIPHY_FLAG_SUPPORTS_SCHED_SCAN and
>>> just
>>> set this to 1 for such devices? Otherwise we have two different
>>> requirements, and we need to track that 0 is an invalid value here
>>> if
>>> WIPHY_FLAG_SUPPORTS_SCHED_SCAN is set, or something like that?
>>
>> Ok. Doesn't that cause issues in user-space. Or do you only want to
>> get rid of it in cfg80211 api and report the flag to user-space when
>> max_sched_scan_reqs equals 1?
>
> WIPHY_FLAG_* aren't directly reported to userspace at all.
I noticed diving in the code. Indirectly it is used for reporting
support of sched_scan_start command. Anyway, I got rid of it.
>>> This might break older userspace - you'll have to put it in a later
>>> portion of the code.
>>>
>>> I'm also a bit surprised the attributes aren't actually optional
>>> for when sched scan isn't supported, I'd make the new one optional
>>> and I guess we can fix the others later too, if desired.
>>
>> Why would it break user-space. Is the order in which attributes are
>> added into the stream something user-space relies on.
>
> No. But there was a size limit on how much older userspace could
> process before we did the splitting.
I see. So basically adding stuff to (split_start == 0) is not wanted.
Just trying to get a clear requirement/rule here. Do we (still) know the
exact size limit?
>>>> +static struct cfg80211_sched_scan_request *
>>>> +cfg80211_find_sched_scan_req(struct cfg80211_registered_device
>>>> *rdev, u64 reqid)
>>>> +{
>>>> + struct cfg80211_sched_scan_request *pos;
>>>> +
>>>> + list_for_each_entry(pos, &rdev->sched_scan_req_list,
>>>> list) {
>>>> + if (pos->reqid == reqid)
>>>> + return pos;
>>>> + }
>>>> + return ERR_PTR(-ENOENT);
>>>> +}
>>>
>>> Here too, I guess, since you don't actually use RCU.
>>
>> So should I use RCU here? Not sure what is the better choice here.
>
> No no, I just meant to add locking assertions :)
Sure. Did that already pending your reply ;-)
Regards,
Arend
^ permalink raw reply
* Re: [RFC 3/4] ieee80211: add new VHT capability fields/parsing
From: Johannes Berg @ 2017-02-14 13:06 UTC (permalink / raw)
To: linux-wireless; +Cc: j, greearb
In-Reply-To: <20170214112827.28216-3-johannes@sipsolutions.net>
> +static inline int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap
> *cap,
> + enum
> ieee80211_vht_chanwidth bw)
> +{
> + unsigned long w;
> + int max_vht_nss;
> + int ext_nss_bw;
> + int supp_width;
> +
> + if (cap->supp_mcs.rx_mcs_map == 0xffff)
> + return 0;
Apart from the various endian issues, this function is completely wrong
because the max_vht_nss is per MCS (at least 0-7, 8 and 9 separately),
which this can't take into account.
Also, the only code that would use this right now, in mac80211,
probably won't use the same types as the parameters were to this
function.
I want to preserve the strange table somewhere in a single place, but
not sure yet how to do that best.
johannes
^ permalink raw reply
* Re: [RFC V2 1/5] nl80211: allow multiple active scheduled scan requests
From: Johannes Berg @ 2017-02-14 12:51 UTC (permalink / raw)
To: Arend Van Spriel; +Cc: linux-wireless
In-Reply-To: <fd4c2573-caea-1cdc-ee33-f010bb0aad58@broadcom.com>
On Tue, 2017-02-14 at 13:35 +0100, Arend Van Spriel wrote:
> On 24-1-2017 10:40, Johannes Berg wrote:
> >
> > > + * @max_sched_scan_reqs: maximum number of scheduled scan
> > > requests
> > > that
> > > + * the device can run concurrently.
> >
> > Perhaps we should get rid of WIPHY_FLAG_SUPPORTS_SCHED_SCAN and
> > just
> > set this to 1 for such devices? Otherwise we have two different
> > requirements, and we need to track that 0 is an invalid value here
> > if
> > WIPHY_FLAG_SUPPORTS_SCHED_SCAN is set, or something like that?
>
> Ok. Doesn't that cause issues in user-space. Or do you only want to
> get rid of it in cfg80211 api and report the flag to user-space when
> max_sched_scan_reqs equals 1?
WIPHY_FLAG_* aren't directly reported to userspace at all.
> > This might break older userspace - you'll have to put it in a later
> > portion of the code.
> >
> > I'm also a bit surprised the attributes aren't actually optional
> > for when sched scan isn't supported, I'd make the new one optional
> > and I guess we can fix the others later too, if desired.
>
> Why would it break user-space. Is the order in which attributes are
> added into the stream something user-space relies on.
No. But there was a size limit on how much older userspace could
process before we did the splitting.
> > > +static struct cfg80211_sched_scan_request *
> > > +cfg80211_find_sched_scan_req(struct cfg80211_registered_device
> > > *rdev, u64 reqid)
> > > +{
> > > + struct cfg80211_sched_scan_request *pos;
> > > +
> > > + list_for_each_entry(pos, &rdev->sched_scan_req_list,
> > > list) {
> > > + if (pos->reqid == reqid)
> > > + return pos;
> > > + }
> > > + return ERR_PTR(-ENOENT);
> > > +}
> >
> > Here too, I guess, since you don't actually use RCU.
>
> So should I use RCU here? Not sure what is the better choice here.
No no, I just meant to add locking assertions :)
johannes
^ permalink raw reply
* [PATCH 10/10] rt2x00: fix rt2x00debug_dump_frame comment
From: Stanislaw Gruszka @ 2017-02-14 12:46 UTC (permalink / raw)
To: linux-wireless; +Cc: Helmut Schaa, Felix Fietkau
In-Reply-To: <1487076368-7020-1-git-send-email-sgruszka@redhat.com>
Reported-by: Jeroen Roovers <jer@airfi.aero>
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
---
drivers/net/wireless/ralink/rt2x00/rt2x00.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
index efd6914..233ee8b 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
@@ -1396,7 +1396,7 @@ struct queue_entry *rt2x00queue_get_entry(struct data_queue *queue,
* rt2x00debug_dump_frame - Dump a frame to userspace through debugfs.
* @rt2x00dev: Pointer to &struct rt2x00_dev.
* @type: The type of frame that is being dumped.
- * @skb: The skb containing the frame to be dumped.
+ * @entry: The queue entry containing the frame to be dumped.
*/
#ifdef CONFIG_RT2X00_LIB_DEBUGFS
void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
--
1.8.3.1
^ permalink raw reply related
* [PATCH 09/10] rt2800: use TXOP_BACKOFF for probe frames
From: Stanislaw Gruszka @ 2017-02-14 12:46 UTC (permalink / raw)
To: linux-wireless; +Cc: Helmut Schaa, Felix Fietkau
In-Reply-To: <1487076368-7020-1-git-send-email-sgruszka@redhat.com>
Even if we do not set AMPDU bit in TXWI, device still can aggregate
frame and send it with rate not corresponding to requested. That mean
we can do not sent probe frames with requested rate. To prevent that
use TXOP_BACKOFF for probe frames.
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
---
drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
index e1660b9..a2c1ca5 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
@@ -372,15 +372,16 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev,
/*
* Determine IFS values
- * - Use TXOP_BACKOFF for management frames except beacons
+ * - Use TXOP_BACKOFF for probe and management frames except beacons
* - Use TXOP_SIFS for fragment bursts
* - Use TXOP_HTTXOP for everything else
*
* Note: rt2800 devices won't use CTS protection (if used)
* for frames not transmitted with TXOP_HTTXOP
*/
- if (ieee80211_is_mgmt(hdr->frame_control) &&
- !ieee80211_is_beacon(hdr->frame_control))
+ if ((ieee80211_is_mgmt(hdr->frame_control) &&
+ !ieee80211_is_beacon(hdr->frame_control)) ||
+ (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE))
txdesc->u.ht.txop = TXOP_BACKOFF;
else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT))
txdesc->u.ht.txop = TXOP_SIFS;
--
1.8.3.1
^ permalink raw reply related
* [PATCH 08/10] rt2800: status based rate flags for nomatch case
From: Stanislaw Gruszka @ 2017-02-14 12:46 UTC (permalink / raw)
To: linux-wireless; +Cc: Helmut Schaa, Felix Fietkau
In-Reply-To: <1487076368-7020-1-git-send-email-sgruszka@redhat.com>
We use skb_desc->tx_rate_flags from entry as rate[].flags even if
skb does not match status. Patch corrects flags and also fixes
mcs for legacy rates.
rt2800_rate_from_status() is based on Felix's mt76
mt76x2_mac_process_tx_rate() function.
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
---
drivers/net/wireless/ralink/rt2x00/rt2800.h | 2 ++
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 35 +++++++++++++++++++++++++-
2 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h
index 0e7051d..480b086 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
@@ -1760,6 +1760,8 @@
#define TX_STA_FIFO_WCID FIELD32(0x0000ff00)
#define TX_STA_FIFO_SUCCESS_RATE FIELD32(0xffff0000)
#define TX_STA_FIFO_MCS FIELD32(0x007f0000)
+#define TX_STA_FIFO_BW FIELD32(0x00800000)
+#define TX_STA_FIFO_SGI FIELD32(0x01000000)
#define TX_STA_FIFO_PHYMODE FIELD32(0xc0000000)
/*
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index 8a76b27..b806ff1 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -852,6 +852,39 @@ void rt2800_process_rxwi(struct queue_entry *entry,
}
EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
+static void rt2800_rate_from_status(struct skb_frame_desc *skbdesc,
+ u32 status, enum nl80211_band band)
+{
+ u8 flags = 0;
+ u8 idx = rt2x00_get_field32(status, TX_STA_FIFO_MCS);
+
+ switch (rt2x00_get_field32(status, TX_STA_FIFO_PHYMODE)) {
+ case RATE_MODE_HT_GREENFIELD:
+ flags |= IEEE80211_TX_RC_GREEN_FIELD;
+ /* fall through */
+ case RATE_MODE_HT_MIX:
+ flags |= IEEE80211_TX_RC_MCS;
+ break;
+ case RATE_MODE_OFDM:
+ if (band == NL80211_BAND_2GHZ)
+ idx += 4;
+ break;
+ case RATE_MODE_CCK:
+ if (idx >= 8)
+ idx -= 8;
+ break;
+ }
+
+ if (rt2x00_get_field32(status, TX_STA_FIFO_BW))
+ flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
+
+ if (rt2x00_get_field32(status, TX_STA_FIFO_SGI))
+ flags |= IEEE80211_TX_RC_SHORT_GI;
+
+ skbdesc->tx_rate_idx = idx;
+ skbdesc->tx_rate_flags = flags;
+}
+
void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
bool match)
{
@@ -898,7 +931,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
* and provide retry count.
*/
if (unlikely((aggr == 1 && ampdu == 0 && real_mcs != mcs)) || !match) {
- skbdesc->tx_rate_idx = real_mcs;
+ rt2800_rate_from_status(skbdesc, status, rt2x00dev->curr_band);
mcs = real_mcs;
}
--
1.8.3.1
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox