* [RFC PATCH 1/2] nl80211: implement NL80211_CMD_GET_BEACON command
From: Sergey Matyukevich @ 2017-11-09 9:40 UTC (permalink / raw)
To: linux-wireless, Johannes Berg
Cc: Igor Mitsyanko, Avinash Patil, Vasily Ulyanov, Sergey Matyukevich
From: Vasily Ulyanov <vulyanov@quantenna.com>
Implement nl80211_get_beacon callback which returns current beacon
configuration. The actual data is saved on .start_ap and .set_beacon calls.
Signed-off-by: Vasily Ulyanov <vulyanov@quantenna.com>
---
include/net/cfg80211.h | 3 +
include/uapi/linux/nl80211.h | 5 +-
net/wireless/nl80211.c | 220 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 227 insertions(+), 1 deletion(-)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 8b8118a7fadb..31d39e066274 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -4002,6 +4002,8 @@ struct cfg80211_cqm_config;
* the user-set channel definition.
* @preset_chandef: (private) Used by the internal configuration code to
* track the channel to be used for AP later
+ * @beacon: (private) Used by the internal configuration code to track
+ * the user-set effective beacon data.
* @bssid: (private) Used by the internal configuration code
* @ssid: (private) Used by the internal configuration code
* @ssid_len: (private) Used by the internal configuration code
@@ -4078,6 +4080,7 @@ struct wireless_dev {
struct cfg80211_internal_bss *current_bss; /* associated / joined */
struct cfg80211_chan_def preset_chandef;
struct cfg80211_chan_def chandef;
+ struct cfg80211_beacon_data beacon;
bool ibss_fixed;
bool ibss_dfs_possible;
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index f882fe1f9709..e9e163bbe11a 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -279,7 +279,10 @@
* @NL80211_CMD_DEL_KEY: delete a key identified by %NL80211_ATTR_KEY_IDX
* or %NL80211_ATTR_MAC.
*
- * @NL80211_CMD_GET_BEACON: (not used)
+ * @NL80211_CMD_GET_BEACON: Get beacon attributes on an access point interface.
+ * %NL80211_ATTR_BEACON_HEAD, %NL80211_ATTR_BEACON_TAIL, %NL80211_ATTR_IE,
+ * %NL80211_ATTR_IE_PROBE_RESP, NL80211_ATTR_IE_ASSOC_RESP,
+ * %NL80211_ATTR_PROBE_RESP will be returned if present.
* @NL80211_CMD_SET_BEACON: change the beacon on an access point interface
* using the %NL80211_ATTR_BEACON_HEAD and %NL80211_ATTR_BEACON_TAIL
* attributes. For drivers that generate the beacon and probe responses
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index fce2cbe6a193..f03f9989efbc 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -3784,6 +3784,172 @@ static int nl80211_parse_beacon(struct nlattr *attrs[],
return 0;
}
+static size_t nl80211_beacon_size(struct cfg80211_beacon_data *bcn)
+{
+ size_t size = bcn->head_len + bcn->tail_len +
+ bcn->beacon_ies_len +
+ bcn->proberesp_ies_len +
+ bcn->assocresp_ies_len +
+ bcn->probe_resp_len;
+
+ return size;
+}
+
+static void nl80211_free_beacon(struct cfg80211_beacon_data *bcn)
+{
+#define free_and_null(member) \
+ do { \
+ kfree(bcn->member); \
+ bcn->member = NULL; \
+ bcn->member ## _len = 0; \
+ } while (0)
+
+ free_and_null(head);
+ free_and_null(tail);
+ free_and_null(beacon_ies);
+ free_and_null(proberesp_ies);
+ free_and_null(assocresp_ies);
+ free_and_null(probe_resp);
+
+#undef free_and_null
+}
+
+static int nl80211_dup_beacon(struct cfg80211_beacon_data *dst,
+ struct cfg80211_beacon_data *src)
+{
+ memset(dst, 0, sizeof(*dst));
+
+#define check_and_dup(member) \
+ do { \
+ if (src->member && (src->member ## _len > 0)) { \
+ dst->member = kmemdup(src->member, \
+ src->member ## _len, \
+ GFP_KERNEL); \
+ if (!dst->member) \
+ goto dup_failure; \
+ dst->member ## _len = src->member ## _len; \
+ } \
+ } while (0)
+
+ check_and_dup(head);
+ check_and_dup(tail);
+ check_and_dup(beacon_ies);
+ check_and_dup(proberesp_ies);
+ check_and_dup(assocresp_ies);
+ check_and_dup(probe_resp);
+
+#undef dup_and_check
+
+ return 0;
+
+dup_failure:
+ nl80211_free_beacon(dst);
+ return -ENOMEM;
+}
+
+static int nl80211_merge_beacons(struct cfg80211_beacon_data *dst,
+ struct cfg80211_beacon_data *old,
+ struct cfg80211_beacon_data *new)
+{
+ memset(dst, 0, sizeof(*dst));
+
+#define check_and_merge(member) \
+ do { \
+ if (new->member && (new->member ## _len > 0)) { \
+ dst->member = kmemdup(new->member, \
+ new->member ## _len, \
+ GFP_KERNEL); \
+ if (!dst->member) \
+ goto dup_failure; \
+ dst->member ## _len = new->member ## _len; \
+ } else if (old->member && (old->member ## _len > 0)) { \
+ dst->member = kmemdup(old->member, \
+ old->member ## _len, \
+ GFP_KERNEL); \
+ if (!dst->member) \
+ goto dup_failure; \
+ dst->member ## _len = old->member ## _len; \
+ } \
+ } while (0)
+
+ check_and_merge(head);
+ check_and_merge(tail);
+ check_and_merge(beacon_ies);
+ check_and_merge(proberesp_ies);
+ check_and_merge(assocresp_ies);
+ check_and_merge(probe_resp);
+
+#undef check_and_merge
+
+ return 0;
+
+dup_failure:
+ nl80211_free_beacon(dst);
+ return -ENOMEM;
+}
+
+static void nl80211_assign_beacon(struct cfg80211_beacon_data *dst,
+ struct cfg80211_beacon_data *src)
+{
+ nl80211_free_beacon(dst);
+ *dst = *src;
+}
+
+static int nl80211_send_beacon(struct sk_buff *msg, u32 portid,
+ enum nl80211_commands cmd,
+ u32 seq, int flags,
+ struct cfg80211_beacon_data *bcn)
+{
+ void *hdr;
+
+ hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
+ if (!hdr)
+ return -EMSGSIZE;
+
+ if (bcn->head && (bcn->head_len > 0)) {
+ if (nla_put(msg, NL80211_ATTR_BEACON_HEAD,
+ bcn->head_len, bcn->head))
+ goto nla_put_failure;
+ }
+
+ if (bcn->tail && (bcn->tail_len > 0)) {
+ if (nla_put(msg, NL80211_ATTR_BEACON_TAIL,
+ bcn->tail_len, bcn->tail))
+ goto nla_put_failure;
+ }
+
+ if (bcn->beacon_ies && (bcn->beacon_ies_len > 0)) {
+ if (nla_put(msg, NL80211_ATTR_IE,
+ bcn->beacon_ies_len, bcn->beacon_ies))
+ goto nla_put_failure;
+ }
+
+ if (bcn->proberesp_ies && (bcn->proberesp_ies_len > 0)) {
+ if (nla_put(msg, NL80211_ATTR_IE_PROBE_RESP,
+ bcn->proberesp_ies_len, bcn->proberesp_ies))
+ goto nla_put_failure;
+ }
+
+ if (bcn->assocresp_ies && (bcn->assocresp_ies_len > 0)) {
+ if (nla_put(msg, NL80211_ATTR_IE_ASSOC_RESP,
+ bcn->assocresp_ies_len, bcn->assocresp_ies))
+ goto nla_put_failure;
+ }
+
+ if (bcn->probe_resp && (bcn->probe_resp_len > 0)) {
+ if (nla_put(msg, NL80211_ATTR_PROBE_RESP,
+ bcn->probe_resp_len, bcn->probe_resp))
+ goto nla_put_failure;
+ }
+
+ genlmsg_end(msg, hdr);
+ return 0;
+
+nla_put_failure:
+ genlmsg_cancel(msg, hdr);
+ return -EMSGSIZE;
+}
+
static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
const u8 *rates)
{
@@ -3903,6 +4069,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
struct net_device *dev = info->user_ptr[1];
struct wireless_dev *wdev = dev->ieee80211_ptr;
struct cfg80211_ap_settings params;
+ struct cfg80211_beacon_data new_bcn;
int err;
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
@@ -4070,6 +4237,10 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
nl80211_calculate_ap_params(¶ms);
+ err = nl80211_dup_beacon(&new_bcn, ¶ms.beacon);
+ if (err)
+ goto dup_failure;
+
wdev_lock(wdev);
err = rdev_start_ap(rdev, dev, ¶ms);
if (!err) {
@@ -4078,20 +4249,52 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
wdev->chandef = params.chandef;
wdev->ssid_len = params.ssid_len;
memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
+ nl80211_assign_beacon(&wdev->beacon, &new_bcn);
}
wdev_unlock(wdev);
+ if (err)
+ nl80211_free_beacon(&new_bcn);
+
+dup_failure:
kfree(params.acl);
return err;
}
+static int nl80211_get_beacon(struct sk_buff *skb, struct genl_info *info)
+{
+ struct net_device *dev = info->user_ptr[1];
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
+ struct sk_buff *msg;
+
+ if (wdev->iftype != NL80211_IFTYPE_AP &&
+ wdev->iftype != NL80211_IFTYPE_P2P_GO)
+ return -EOPNOTSUPP;
+
+ if (!wdev->beacon_interval)
+ return -EINVAL;
+
+ msg = nlmsg_new(nl80211_beacon_size(&wdev->beacon), GFP_KERNEL);
+ if (!msg)
+ return -ENOMEM;
+
+ if (nl80211_send_beacon(msg, NL80211_CMD_GET_BEACON, info->snd_portid,
+ info->snd_seq, 0, &wdev->beacon) < 0) {
+ nlmsg_free(msg);
+ return -ENOBUFS;
+ }
+
+ return genlmsg_reply(msg, info);
+}
+
static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
{
struct cfg80211_registered_device *rdev = info->user_ptr[0];
struct net_device *dev = info->user_ptr[1];
struct wireless_dev *wdev = dev->ieee80211_ptr;
struct cfg80211_beacon_data params;
+ struct cfg80211_beacon_data merged_bcn;
int err;
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
@@ -4108,10 +4311,19 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
if (err)
return err;
+ err = nl80211_merge_beacons(&merged_bcn, &wdev->beacon, ¶ms);
+ if (err)
+ return err;
+
wdev_lock(wdev);
err = rdev_change_beacon(rdev, dev, ¶ms);
+ if (!err)
+ nl80211_assign_beacon(&wdev->beacon, &merged_bcn);
wdev_unlock(wdev);
+ if (err)
+ nl80211_free_beacon(&merged_bcn);
+
return err;
}
@@ -12595,6 +12807,14 @@ static const struct genl_ops nl80211_ops[] = {
NL80211_FLAG_NEED_RTNL,
},
{
+ .cmd = NL80211_CMD_GET_BEACON,
+ .policy = nl80211_policy,
+ .flags = GENL_UNS_ADMIN_PERM,
+ .doit = nl80211_get_beacon,
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
+ NL80211_FLAG_NEED_RTNL,
+ },
+ {
.cmd = NL80211_CMD_SET_BEACON,
.policy = nl80211_policy,
.flags = GENL_UNS_ADMIN_PERM,
--
2.11.0
^ permalink raw reply related
* [RFC PATCH 2/2] nl80211: implement beacon change notifier
From: Sergey Matyukevich @ 2017-11-09 9:40 UTC (permalink / raw)
To: linux-wireless, Johannes Berg
Cc: Igor Mitsyanko, Avinash Patil, Vasily Ulyanov, Sergey Matyukevich
In-Reply-To: <20171109094024.9085-1-sergey.matyukevich.os@quantenna.com>
From: Vasily Ulyanov <vulyanov@quantenna.com>
Notify user-space listeners about beacon data change.
Signed-off-by: Vasily Ulyanov <vulyanov@quantenna.com>
---
net/wireless/nl80211.c | 27 ++++++++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index f03f9989efbc..98e52e5ffc13 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -3950,6 +3950,26 @@ static int nl80211_send_beacon(struct sk_buff *msg, u32 portid,
return -EMSGSIZE;
}
+static void nl80211_notify_beacon_change(struct net_device *dev,
+ enum nl80211_commands cmd,
+ struct cfg80211_beacon_data *bcn)
+{
+ struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
+ struct sk_buff *msg;
+
+ msg = nlmsg_new(nl80211_beacon_size(bcn), GFP_KERNEL);
+ if (!msg)
+ return;
+
+ if (nl80211_send_beacon(msg, cmd, 0, 0, 0, bcn) < 0) {
+ nlmsg_free(msg);
+ return;
+ }
+
+ genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
+ NL80211_MCGRP_MLME, GFP_KERNEL);
+}
+
static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
const u8 *rates)
{
@@ -4250,6 +4270,8 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
wdev->ssid_len = params.ssid_len;
memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
nl80211_assign_beacon(&wdev->beacon, &new_bcn);
+ nl80211_notify_beacon_change(dev, NL80211_CMD_START_AP,
+ &wdev->beacon);
}
wdev_unlock(wdev);
@@ -4317,8 +4339,11 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
wdev_lock(wdev);
err = rdev_change_beacon(rdev, dev, ¶ms);
- if (!err)
+ if (!err) {
nl80211_assign_beacon(&wdev->beacon, &merged_bcn);
+ nl80211_notify_beacon_change(dev, NL80211_CMD_SET_BEACON,
+ &wdev->beacon);
+ }
wdev_unlock(wdev);
if (err)
--
2.11.0
^ permalink raw reply related
* Re: Soft lockup in rt2x00usb_work_rxdone()
From: Stanislaw Gruszka @ 2017-11-09 10:54 UTC (permalink / raw)
To: Richard Genoud; +Cc: Helmut Schaa, linux-kernel@vger.kernel.org, linux-wireless
In-Reply-To: <1510139235.10467.1.camel@gmail.com>
On Wed, Nov 08, 2017 at 12:07:15PM +0100, Richard Genoud wrote:
> (maybe if there was more than one CPU on the board, I could do
> something, but that's not the case)
I reproduced the problem with nosmp option. I think we need
to check also for ENOENT error (not only for ENODEV).
Will post the fix in a second.
Thanks for reporting and debugging
Stanislaw
^ permalink raw reply
* [PATCH] rt2x00usb: mark device removed when get ENOENT usb error
From: Stanislaw Gruszka @ 2017-11-09 10:59 UTC (permalink / raw)
To: linux-wireless; +Cc: Richard Genoud
ENOENT usb error mean "specified interface or endpoint does not exist or
is not enabled". Mark device not present when we encounter this error
similar like we do with ENODEV error.
Otherwise we can have infinite loop in rt2x00usb_work_rxdone(), because
we remove and put again RX entries to the queue infinitely.
We can have similar situation when submit urb will fail all the time
with other error, so we need consider to limit number of entries
processed by rxdone work. But for now, since the patch fixes
reproducible soft lockup issue on single processor systems
and taken ENOENT error meaning, let apply this fix.
Patch adds additional ENOENT check not only in rx kick routine, but
also on other places where we check for ENODEV error.
Reported-by: Richard Genoud <richard.genoud@gmail.com>
Debugged-by: Richard Genoud <richard.genoud@gmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
---
drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
index e2f4f5778267..086aad22743d 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
@@ -57,7 +57,7 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,
if (status >= 0)
return 0;
- if (status == -ENODEV) {
+ if (status == -ENODEV || status == -ENOENT) {
/* Device has disappeared. */
clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
break;
@@ -321,7 +321,7 @@ static bool rt2x00usb_kick_tx_entry(struct queue_entry *entry, void *data)
status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
if (status) {
- if (status == -ENODEV)
+ if (status == -ENODEV || status == -ENOENT)
clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
rt2x00lib_dmadone(entry);
@@ -410,7 +410,7 @@ static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry, void *data)
status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
if (status) {
- if (status == -ENODEV)
+ if (status == -ENODEV || status == -ENOENT)
clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
rt2x00lib_dmadone(entry);
--
2.7.5
^ permalink raw reply related
* [PATCH] cfg80211: cleanup signal strength units notation
From: Sergey Matyukevich @ 2017-11-09 11:46 UTC (permalink / raw)
To: linux-wireless, Johannes Berg
Cc: Igor Mitsyanko, Avinash Patil, Vasily Ulyanov, Sergey Matyukevich
Both cfg80211_rx_mgmt and cfg80211_report_obss_beacon functions send
reports to userspace using NL80211_ATTR_RX_SIGNAL_DBM attribute w/o
any processing of their input signal values. Which means that in
order to match userspace tools expectations, input signal values
for those functions are supposed to be in dBm units.
This patch cleans up comments, variable names, and trace reports
for those functions, replacing confusing 'mBm' by 'dBm'.
Signed-off-by: Sergey Matyukevich <sergey.matyukevich.os@quantenna.com>
---
include/net/cfg80211.h | 4 ++--
net/wireless/mlme.c | 6 +++---
net/wireless/trace.h | 12 ++++++------
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 8b8118a7fadb..54321759aa44 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -5576,7 +5576,7 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
* cfg80211_rx_mgmt - notification of received, unprocessed management frame
* @wdev: wireless device receiving the frame
* @freq: Frequency on which the frame was received in MHz
- * @sig_dbm: signal strength in mBm, or 0 if unknown
+ * @sig_dbm: signal strength in dBm, or 0 if unknown
* @buf: Management frame (header + body)
* @len: length of the frame data
* @flags: flags, as defined in enum nl80211_rxmgmt_flags
@@ -5755,7 +5755,7 @@ void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
* @frame: the frame
* @len: length of the frame
* @freq: frequency the frame was received on
- * @sig_dbm: signal strength in mBm, or 0 if unknown
+ * @sig_dbm: signal strength in dBm, or 0 if unknown
*
* Use this function to report to userspace when a beacon was
* received. It is not useful to call this when there is no
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index e7c64a8dce54..bbb9907bfa86 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -692,7 +692,7 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
return rdev_mgmt_tx(rdev, wdev, params, cookie);
}
-bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
+bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm,
const u8 *buf, size_t len, u32 flags)
{
struct wiphy *wiphy = wdev->wiphy;
@@ -708,7 +708,7 @@ bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE);
u16 stype;
- trace_cfg80211_rx_mgmt(wdev, freq, sig_mbm);
+ trace_cfg80211_rx_mgmt(wdev, freq, sig_dbm);
stype = (le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE) >> 4;
if (!(stypes->rx & BIT(stype))) {
@@ -735,7 +735,7 @@ bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
/* Indicate the received Action frame to user space */
if (nl80211_send_mgmt(rdev, wdev, reg->nlportid,
- freq, sig_mbm,
+ freq, sig_dbm,
buf, len, flags, GFP_ATOMIC))
continue;
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index f3353fe5b35b..bcfedd39e7a3 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -2544,20 +2544,20 @@ DEFINE_EVENT(cfg80211_netdev_mac_evt, cfg80211_del_sta,
);
TRACE_EVENT(cfg80211_rx_mgmt,
- TP_PROTO(struct wireless_dev *wdev, int freq, int sig_mbm),
- TP_ARGS(wdev, freq, sig_mbm),
+ TP_PROTO(struct wireless_dev *wdev, int freq, int sig_dbm),
+ TP_ARGS(wdev, freq, sig_dbm),
TP_STRUCT__entry(
WDEV_ENTRY
__field(int, freq)
- __field(int, sig_mbm)
+ __field(int, sig_dbm)
),
TP_fast_assign(
WDEV_ASSIGN;
__entry->freq = freq;
- __entry->sig_mbm = sig_mbm;
+ __entry->sig_dbm = sig_dbm;
),
- TP_printk(WDEV_PR_FMT ", freq: %d, sig mbm: %d",
- WDEV_PR_ARG, __entry->freq, __entry->sig_mbm)
+ TP_printk(WDEV_PR_FMT ", freq: %d, sig dbm: %d",
+ WDEV_PR_ARG, __entry->freq, __entry->sig_dbm)
);
TRACE_EVENT(cfg80211_mgmt_tx_status,
--
2.11.0
^ permalink raw reply related
* Re: [PATCH] rt2x00usb: mark device removed when get ENOENT usb error
From: Richard Genoud @ 2017-11-09 11:58 UTC (permalink / raw)
To: Stanislaw Gruszka, linux-wireless
In-Reply-To: <20171109105917.GA3206@redhat.com>
On 09/11/2017 11:59, Stanislaw Gruszka wrote:
> ENOENT usb error mean "specified interface or endpoint does not exist or
> is not enabled". Mark device not present when we encounter this error
> similar like we do with ENODEV error.
>
> Otherwise we can have infinite loop in rt2x00usb_work_rxdone(), because
> we remove and put again RX entries to the queue infinitely.
>
> We can have similar situation when submit urb will fail all the time
> with other error, so we need consider to limit number of entries
> processed by rxdone work. But for now, since the patch fixes
> reproducible soft lockup issue on single processor systems
> and taken ENOENT error meaning, let apply this fix.
>
> Patch adds additional ENOENT check not only in rx kick routine, but
> also on other places where we check for ENODEV error.
>
> Reported-by: Richard Genoud <richard.genoud@gmail.com>
> Debugged-by: Richard Genoud <richard.genoud@gmail.com>
> Cc: stable@vger.kernel.org
> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Tested-by: Richard Genoud <richard.genoud@gmail.com>
(on 4.14-rc8)
This is working like a charm now !
Thanks !!
Richard.
> ---
> drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
> index e2f4f5778267..086aad22743d 100644
> --- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
> +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
> @@ -57,7 +57,7 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,
> if (status >= 0)
> return 0;
>
> - if (status == -ENODEV) {
> + if (status == -ENODEV || status == -ENOENT) {
> /* Device has disappeared. */
> clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
> break;
> @@ -321,7 +321,7 @@ static bool rt2x00usb_kick_tx_entry(struct queue_entry *entry, void *data)
>
> status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
> if (status) {
> - if (status == -ENODEV)
> + if (status == -ENODEV || status == -ENOENT)
> clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
> set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
> rt2x00lib_dmadone(entry);
> @@ -410,7 +410,7 @@ static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry, void *data)
>
> status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
> if (status) {
> - if (status == -ENODEV)
> + if (status == -ENODEV || status == -ENOENT)
> clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
> set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
> rt2x00lib_dmadone(entry);
>
^ permalink raw reply
* RE: [PATCH] ath10k: Re-enable TXQs for all devices
From: Rajkumar Manoharan @ 2017-11-09 16:13 UTC (permalink / raw)
To: Toke Høiland-Jørgensen,
make-wifi-fast@lists.bufferbloat.net,
linux-wireless@vger.kernel.org
In-Reply-To: <20171109071945.11033-1-toke@toke.dk>
PiBDb21taXQgNGNhMTgwNzgxNWFhNjgwMWFhY2VkN2ZkZWZhOWVkYWNjMjUyMTc2NyBkaXNhYmxl
cyB0aGUgdXNlIG9mIHRoZQ0KPiBtYWM4MDIxMSBUWFFzIGZvciBzb21lIGRldmljZXMgYmVjYXVz
ZSBvZiBhIHRoZW9yZXRpY2FsIHRocm91Z2hwdXQNCj4gcmVncmVzc2lvbi4gV2UgaGF2ZSBub3Qg
c2VlbiB0aGlzIHJlZ3Jlc3Npb24gZm9yIGEgd2hpbGUgbm93LCBzbyBpdCBzaG91bGQgYmUNCj4g
c2FmZSB0byByZS1lbmFibGUgVFhRcy4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IFRva2UgSMO4aWxh
bmQtSsO4cmdlbnNlbiA8dG9rZUB0b2tlLmRrPg0KPiAtLS0NCj4gVGhpcyBoYXMgYmVlbiBpbiBM
RURFIHRydW5rIGZvciBhIGNvdXBsZSBvZiBtb250aHMgbm93IHdpdGggZ29vZCByZXN1bHRzLg0K
Pg0KVG9rZSwNCiANCkdvb2QgdG8ga25vdyB0aGF0IHRoZSBwZXJmb3JtYW5jZSBkcm9wIGlzIG5v
dCBzZWVuIHdpdGggdGhlIGNoaXBzIHRoYXQgZG9lcyBub3QNCmhhdmUgcHVzaC1wdWxsIHN1cHBv
cnQuIFRoZSBpc3N1ZSB3YXMgb3JpZ2luYWxseSByZXBvcnRlZCB3aXRoIGFwMTUyICsgcWNhOTg4
eA0KYnkgY29tbXVuaXR5IFsxXS4gSG9wZSB0aGlzIGNvbWJpbmF0aW9uIGlzIGFsc28gY29uc2lk
ZXJlZCBpbiBMRURFLg0KDQotUmFqa3VtYXINCg0KWzFdIC0gaHR0cDovL2xpc3RzLmluZnJhZGVh
ZC5vcmcvcGlwZXJtYWlsL2F0aDEway8yMDE2LUFwcmlsLzAwNzI2Ni5odG1sDQoNCg==
^ permalink raw reply
* Re: [PATCH 0/2] NFC: Add deactivate target functionality
From: Samuel Ortiz @ 2017-11-09 23:05 UTC (permalink / raw)
To: Mark Greer; +Cc: linux-wireless, linux-nfc
In-Reply-To: <20170616033422.18484-1-mgreer@animalcreek.com>
Hi Mark,
On Thu, Jun 15, 2017 at 08:34:20PM -0700, Mark Greer wrote:
> There is currently no way for userspace to deactivate an active target.
> Since the target is active, the adapter cannot be powered down which
> wastes wastes power when the target has been read and isn't needed
> anymore (but remains within range). To solve this, add a way to
> deactivate a currently active target which will then allow the adapter
> to be powered down.
>
> To be fully operational, this requires companion patches for neard.
> Those patches will be submitted shortly.
>
> Mark Greer (2):
> NFC: digital: Abort cmd when deactivating target
> NFC: Add NFC_CMD_DEACTIVATE_TARGET support
Both patches applied to nfc-next, thanks.
Cheers,
Samuel.
^ permalink raw reply
* Re: [PATCH 00/23] neard: Support TI Std & Pro tags, fixups, etc.
From: Samuel Ortiz @ 2017-11-09 23:26 UTC (permalink / raw)
To: Mark Greer; +Cc: linux-wireless, linux-nfc
In-Reply-To: <20170615182516.4508-1-mgreer@animalcreek.com>
Hi Mark,
On Thu, Jun 15, 2017 at 11:24:53AM -0700, Mark Greer wrote:
> This is an assortment of commits that make some fixups, do some general
> tightening of NDEF data checking, add support for TI Standard and Pro
> Type 5 tags, and stop issuing the Read Multiple Blocks command when
> formatting a Type 5 tag. The reasoning for each change is in the
> individual commit descriptions.
>
> For convenience, a branch with these commits is available in the
> submit/updates-v1 branch here:
>
> https://github.com/animalcreek/neard.git
Applied, thanks.
Cheers,
Samuel.
^ permalink raw reply
* [PATCH v2 0/6] wl1251: Fix MAC address for Nokia N900
From: Pali Rohár @ 2017-11-09 23:38 UTC (permalink / raw)
To: Ming Lei, Luis R. Rodriguez, Greg Kroah-Hartman, Kalle Valo,
David Gnedt, Michal Kazior, Daniel Wagner, Tony Lindgren,
Sebastian Reichel, Pavel Machek, Ivaylo Dimitrov, Aaro Koskinen,
Grazvydas Ignotas
Cc: linux-kernel, linux-wireless, netdev, Pali Rohár
In-Reply-To: <1482598381-16513-1-git-send-email-pali.rohar@gmail.com>
This patch series fix processing MAC address for wl1251 chip found in Nokia N900.
Changes since v1:
* Added Acked-by for Pavel Machek
* Fixed grammar
* Magic numbers for NVS offsets are replaced by defines
* Check for validity of mac address NVS data is moved into function
* Changed order of patches as Pavel requested
Pali Rohár (6):
wl1251: Update wl->nvs_len after wl->nvs is valid
wl1251: Generate random MAC address only if driver does not have
valid
wl1251: Parse and use MAC address from supplied NVS data
wl1251: Set generated MAC address back to NVS data
firmware: Add request_firmware_prefer_user() function
wl1251: Use request_firmware_prefer_user() for loading NVS
calibration data
drivers/base/firmware_class.c | 45 +++++++++++++-
drivers/net/wireless/ti/wl1251/Kconfig | 1 +
drivers/net/wireless/ti/wl1251/main.c | 104 ++++++++++++++++++++++++++------
include/linux/firmware.h | 9 +++
4 files changed, 138 insertions(+), 21 deletions(-)
--
1.7.9.5
^ permalink raw reply
* [PATCH v2 1/6] wl1251: Update wl->nvs_len after wl->nvs is valid
From: Pali Rohár @ 2017-11-09 23:38 UTC (permalink / raw)
To: Ming Lei, Luis R. Rodriguez, Greg Kroah-Hartman, Kalle Valo,
David Gnedt, Michal Kazior, Daniel Wagner, Tony Lindgren,
Sebastian Reichel, Pavel Machek, Ivaylo Dimitrov, Aaro Koskinen,
Grazvydas Ignotas
Cc: linux-kernel, linux-wireless, netdev, Pali Rohár
In-Reply-To: <1510270708-14377-1-git-send-email-pali.rohar@gmail.com>
If kmemdup fails, then wl->nvs_len will contain invalid non-zero size.
Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
Acked-by: Pavel Machek <pavel@ucw.cz>
---
drivers/net/wireless/ti/wl1251/main.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
index 9915d83..8929bb3 100644
--- a/drivers/net/wireless/ti/wl1251/main.c
+++ b/drivers/net/wireless/ti/wl1251/main.c
@@ -122,8 +122,7 @@ static int wl1251_fetch_nvs(struct wl1251 *wl)
goto out;
}
- wl->nvs_len = fw->size;
- wl->nvs = kmemdup(fw->data, wl->nvs_len, GFP_KERNEL);
+ wl->nvs = kmemdup(fw->data, fw->size, GFP_KERNEL);
if (!wl->nvs) {
wl1251_error("could not allocate memory for the nvs file");
@@ -131,6 +130,8 @@ static int wl1251_fetch_nvs(struct wl1251 *wl)
goto out;
}
+ wl->nvs_len = fw->size;
+
ret = 0;
out:
--
1.7.9.5
^ permalink raw reply related
* [PATCH v2 2/6] wl1251: Generate random MAC address only if driver does not have valid
From: Pali Rohár @ 2017-11-09 23:38 UTC (permalink / raw)
To: Ming Lei, Luis R. Rodriguez, Greg Kroah-Hartman, Kalle Valo,
David Gnedt, Michal Kazior, Daniel Wagner, Tony Lindgren,
Sebastian Reichel, Pavel Machek, Ivaylo Dimitrov, Aaro Koskinen,
Grazvydas Ignotas
Cc: linux-kernel, linux-wireless, netdev, Pali Rohár
In-Reply-To: <1510270708-14377-1-git-send-email-pali.rohar@gmail.com>
Before this patch, driver generated random MAC address every time it was
initialized. After that random MAC address could be overwritten with fixed
one, if provided.
This patch changes order. First it tries to read fixed MAC address and if
it fails then driver generates random MAC address.
Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
Acked-by: Pavel Machek <pavel@ucw.cz>
---
drivers/net/wireless/ti/wl1251/main.c | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
index 8929bb3..9106c20 100644
--- a/drivers/net/wireless/ti/wl1251/main.c
+++ b/drivers/net/wireless/ti/wl1251/main.c
@@ -1492,7 +1492,24 @@ int wl1251_init_ieee80211(struct wl1251 *wl)
wl->hw->queues = 4;
if (wl->use_eeprom)
- wl1251_read_eeprom_mac(wl);
+ ret = wl1251_read_eeprom_mac(wl);
+ else
+ ret = -EINVAL;
+
+ if (ret == 0 && !is_valid_ether_addr(wl->mac_addr))
+ ret = -EINVAL;
+
+ if (ret < 0) {
+ /*
+ * In case our MAC address is not correctly set,
+ * we use a random but Nokia MAC.
+ */
+ static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
+ memcpy(wl->mac_addr, nokia_oui, 3);
+ get_random_bytes(wl->mac_addr + 3, 3);
+ wl1251_warning("MAC address in eeprom or nvs data is not valid");
+ wl1251_warning("Setting random MAC address: %pM", wl->mac_addr);
+ }
ret = wl1251_register_hw(wl);
if (ret)
@@ -1513,7 +1530,6 @@ struct ieee80211_hw *wl1251_alloc_hw(void)
struct ieee80211_hw *hw;
struct wl1251 *wl;
int i;
- static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
hw = ieee80211_alloc_hw(sizeof(*wl), &wl1251_ops);
if (!hw) {
@@ -1563,13 +1579,6 @@ struct ieee80211_hw *wl1251_alloc_hw(void)
INIT_WORK(&wl->irq_work, wl1251_irq_work);
INIT_WORK(&wl->tx_work, wl1251_tx_work);
- /*
- * In case our MAC address is not correctly set,
- * we use a random but Nokia MAC.
- */
- memcpy(wl->mac_addr, nokia_oui, 3);
- get_random_bytes(wl->mac_addr + 3, 3);
-
wl->state = WL1251_STATE_OFF;
mutex_init(&wl->mutex);
spin_lock_init(&wl->wl_lock);
--
1.7.9.5
^ permalink raw reply related
* [PATCH v2 3/6] wl1251: Parse and use MAC address from supplied NVS data
From: Pali Rohár @ 2017-11-09 23:38 UTC (permalink / raw)
To: Ming Lei, Luis R. Rodriguez, Greg Kroah-Hartman, Kalle Valo,
David Gnedt, Michal Kazior, Daniel Wagner, Tony Lindgren,
Sebastian Reichel, Pavel Machek, Ivaylo Dimitrov, Aaro Koskinen,
Grazvydas Ignotas
Cc: linux-kernel, linux-wireless, netdev, Pali Rohár
In-Reply-To: <1510270708-14377-1-git-send-email-pali.rohar@gmail.com>
This patch implements parsing MAC address from NVS data which are sent to
wl1251 chip. Calibration NVS data could contain valid MAC address and it
will be used instead of randomly generated one.
This patch also moves code for requesting NVS data from userspace to driver
initialization code to make sure that NVS data will be there at time when
permanent MAC address is needed.
Calibration NVS data for wl1251 are device specific. Every device with
wl1251 chip should have been calibrated in factory and needs to provide own
calibration data.
Default example file wl1251-nvs.bin, found in linux-firmware repository,
contains MAC address 00:00:20:07:03:09. So this MAC address is marked as
invalid as it is not real device specific address, just example one.
Format of calibration NVS data can be found at:
http://notaz.gp2x.de/misc/pnd/wl1251/nvs_map.txt
Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
---
drivers/net/wireless/ti/wl1251/main.c | 55 ++++++++++++++++++++++++++++-----
1 file changed, 47 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
index 9106c20..d497ba5 100644
--- a/drivers/net/wireless/ti/wl1251/main.c
+++ b/drivers/net/wireless/ti/wl1251/main.c
@@ -203,13 +203,6 @@ static int wl1251_chip_wakeup(struct wl1251 *wl)
goto out;
}
- if (wl->nvs == NULL && !wl->use_eeprom) {
- /* No NVS from netlink, try to get it from the filesystem */
- ret = wl1251_fetch_nvs(wl);
- if (ret < 0)
- goto out;
- }
-
out:
return ret;
}
@@ -1448,6 +1441,46 @@ static int wl1251_read_eeprom_mac(struct wl1251 *wl)
return 0;
}
+#define NVS_OFF_MAC_LEN 0x19
+#define NVS_OFF_MAC_ADDR_LO 0x1a
+#define NVS_OFF_MAC_ADDR_HI 0x1b
+#define NVS_OFF_MAC_DATA 0x1c
+
+static int wl1251_check_nvs_mac(struct wl1251 *wl)
+{
+ if (wl->nvs_len < 0x24)
+ return -ENODATA;
+
+ /* length is 2 and data address is 0x546c (ANDed with 0xfffe) */
+ if (wl->nvs[NVS_OFF_MAC_LEN] != 2 ||
+ wl->nvs[NVS_OFF_MAC_ADDR_LO] != 0x6d ||
+ wl->nvs[NVS_OFF_MAC_ADDR_HI] != 0x54)
+ return -EINVAL;
+
+ return 0;
+}
+
+static int wl1251_read_nvs_mac(struct wl1251 *wl)
+{
+ u8 mac[ETH_ALEN];
+ int i, ret;
+
+ ret = wl1251_check_nvs_mac(wl);
+ if (ret)
+ return ret;
+
+ /* MAC is stored in reverse order */
+ for (i = 0; i < ETH_ALEN; i++)
+ mac[i] = wl->nvs[NVS_OFF_MAC_DATA + ETH_ALEN - i - 1];
+
+ /* 00:00:20:07:03:09 is in example file wl1251-nvs.bin, so invalid */
+ if (ether_addr_equal_unaligned(mac, "\x00\x00\x20\x07\x03\x09"))
+ return -EINVAL;
+
+ memcpy(wl->mac_addr, mac, ETH_ALEN);
+ return 0;
+}
+
static int wl1251_register_hw(struct wl1251 *wl)
{
int ret;
@@ -1491,10 +1524,16 @@ int wl1251_init_ieee80211(struct wl1251 *wl)
wl->hw->queues = 4;
+ if (wl->nvs == NULL && !wl->use_eeprom) {
+ ret = wl1251_fetch_nvs(wl);
+ if (ret < 0)
+ goto out;
+ }
+
if (wl->use_eeprom)
ret = wl1251_read_eeprom_mac(wl);
else
- ret = -EINVAL;
+ ret = wl1251_read_nvs_mac(wl);
if (ret == 0 && !is_valid_ether_addr(wl->mac_addr))
ret = -EINVAL;
--
1.7.9.5
^ permalink raw reply related
* [PATCH v2 4/6] wl1251: Set generated MAC address back to NVS data
From: Pali Rohár @ 2017-11-09 23:38 UTC (permalink / raw)
To: Ming Lei, Luis R. Rodriguez, Greg Kroah-Hartman, Kalle Valo,
David Gnedt, Michal Kazior, Daniel Wagner, Tony Lindgren,
Sebastian Reichel, Pavel Machek, Ivaylo Dimitrov, Aaro Koskinen,
Grazvydas Ignotas
Cc: linux-kernel, linux-wireless, netdev, Pali Rohár
In-Reply-To: <1510270708-14377-1-git-send-email-pali.rohar@gmail.com>
In case there is no valid MAC address kernel generates random one. This
patch propagate this generated MAC address back to NVS data which will be
uploaded to wl1251 chip. So HW would have same MAC address as linux kernel
uses.
This should not change any functionality, but it is better to tell wl1251
correct mac address since beginning of chip usage.
Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
---
drivers/net/wireless/ti/wl1251/main.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
index d497ba5..1f423be 100644
--- a/drivers/net/wireless/ti/wl1251/main.c
+++ b/drivers/net/wireless/ti/wl1251/main.c
@@ -1481,6 +1481,21 @@ static int wl1251_read_nvs_mac(struct wl1251 *wl)
return 0;
}
+static int wl1251_write_nvs_mac(struct wl1251 *wl)
+{
+ int i, ret;
+
+ ret = wl1251_check_nvs_mac(wl);
+ if (ret)
+ return ret;
+
+ /* MAC is stored in reverse order */
+ for (i = 0; i < ETH_ALEN; i++)
+ wl->nvs[NVS_OFF_MAC_DATA + i] = wl->mac_addr[ETH_ALEN - i - 1];
+
+ return 0;
+}
+
static int wl1251_register_hw(struct wl1251 *wl)
{
int ret;
@@ -1546,6 +1561,8 @@ int wl1251_init_ieee80211(struct wl1251 *wl)
static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
memcpy(wl->mac_addr, nokia_oui, 3);
get_random_bytes(wl->mac_addr + 3, 3);
+ if (!wl->use_eeprom)
+ wl1251_write_nvs_mac(wl);
wl1251_warning("MAC address in eeprom or nvs data is not valid");
wl1251_warning("Setting random MAC address: %pM", wl->mac_addr);
}
--
1.7.9.5
^ permalink raw reply related
* [PATCH v2 5/6] firmware: Add request_firmware_prefer_user() function
From: Pali Rohár @ 2017-11-09 23:38 UTC (permalink / raw)
To: Ming Lei, Luis R. Rodriguez, Greg Kroah-Hartman, Kalle Valo,
David Gnedt, Michal Kazior, Daniel Wagner, Tony Lindgren,
Sebastian Reichel, Pavel Machek, Ivaylo Dimitrov, Aaro Koskinen,
Grazvydas Ignotas
Cc: linux-kernel, linux-wireless, netdev, Pali Rohár
In-Reply-To: <1510270708-14377-1-git-send-email-pali.rohar@gmail.com>
This function works pretty much like request_firmware(), but it prefer
usermode helper. If usermode helper fails then it fallback to direct
access. Useful for dynamic or model specific firmware data.
Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
---
drivers/base/firmware_class.c | 45 +++++++++++++++++++++++++++++++++++++++--
include/linux/firmware.h | 9 +++++++++
2 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index 4b57cf5..c3a9fe5 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -195,6 +195,11 @@ static int __fw_state_check(struct fw_state *fw_st, enum fw_status status)
#endif
#define FW_OPT_NO_WARN (1U << 3)
#define FW_OPT_NOCACHE (1U << 4)
+#ifdef CONFIG_FW_LOADER_USER_HELPER
+#define FW_OPT_PREFER_USER (1U << 5)
+#else
+#define FW_OPT_PREFER_USER 0
+#endif
struct firmware_cache {
/* firmware_buf instance will be added into the below list */
@@ -1214,13 +1219,26 @@ static void fw_abort_batch_reqs(struct firmware *fw)
if (ret <= 0) /* error or already assigned */
goto out;
- ret = fw_get_filesystem_firmware(device, fw->priv);
+ if (opt_flags & FW_OPT_PREFER_USER) {
+ ret = fw_load_from_user_helper(fw, name, device, opt_flags, timeout);
+ if (ret && !(opt_flags & FW_OPT_NO_WARN)) {
+ dev_warn(device,
+ "User helper firmware load for %s failed with error %d\n",
+ name, ret);
+ dev_warn(device, "Falling back to direct firmware load\n");
+ }
+ } else {
+ ret = -EINVAL;
+ }
+
+ if (ret)
+ ret = fw_get_filesystem_firmware(device, fw->priv);
if (ret) {
if (!(opt_flags & FW_OPT_NO_WARN))
dev_warn(device,
"Direct firmware load for %s failed with error %d\n",
name, ret);
- if (opt_flags & FW_OPT_USERHELPER) {
+ if ((opt_flags & FW_OPT_USERHELPER) && !(opt_flags & FW_OPT_PREFER_USER)) {
dev_warn(device, "Falling back to user helper\n");
ret = fw_load_from_user_helper(fw, name, device,
opt_flags);
@@ -1329,6 +1347,29 @@ int request_firmware_direct(const struct firmware **firmware_p,
EXPORT_SYMBOL(request_firmware_into_buf);
/**
+ * request_firmware_prefer_user: - prefer usermode helper for loading firmware
+ * @firmware_p: pointer to firmware image
+ * @name: name of firmware file
+ * @device: device for which firmware is being loaded
+ *
+ * This function works pretty much like request_firmware(), but it prefer
+ * usermode helper. If usermode helper fails then it fallback to direct access.
+ * Useful for dynamic or model specific firmware data.
+ **/
+int request_firmware_prefer_user(const struct firmware **firmware_p,
+ const char *name, struct device *device)
+{
+ int ret;
+
+ __module_get(THIS_MODULE);
+ ret = _request_firmware(firmware_p, name, device, NULL, 0,
+ FW_OPT_UEVENT | FW_OPT_PREFER_USER);
+ module_put(THIS_MODULE);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(request_firmware_prefer_user);
+
+/**
* release_firmware: - release the resource associated with a firmware image
* @fw: firmware resource to release
**/
diff --git a/include/linux/firmware.h b/include/linux/firmware.h
index d450808..8584528 100644
--- a/include/linux/firmware.h
+++ b/include/linux/firmware.h
@@ -48,6 +48,8 @@ int request_firmware_nowait(
void (*cont)(const struct firmware *fw, void *context));
int request_firmware_direct(const struct firmware **fw, const char *name,
struct device *device);
+int request_firmware_prefer_user(const struct firmware **fw, const char *name,
+ struct device *device);
int request_firmware_into_buf(const struct firmware **firmware_p,
const char *name, struct device *device, void *buf, size_t size);
@@ -78,6 +80,13 @@ static inline int request_firmware_direct(const struct firmware **fw,
return -EINVAL;
}
+static inline int request_firmware_prefer_user(const struct firmware **fw,
+ const char *name,
+ struct device *device)
+{
+ return -EINVAL;
+}
+
static inline int request_firmware_into_buf(const struct firmware **firmware_p,
const char *name, struct device *device, void *buf, size_t size)
{
--
1.7.9.5
^ permalink raw reply related
* Re: [PATCH 0/4] neard: Add support for deactivating tags
From: Samuel Ortiz @ 2017-11-09 23:38 UTC (permalink / raw)
To: Mark Greer; +Cc: linux-wireless, linux-nfc
In-Reply-To: <20170616035728.19415-1-mgreer@animalcreek.com>
On Thu, Jun 15, 2017 at 08:57:24PM -0700, Mark Greer wrote:
> This series adds the ability for client apps to deactivate a currently
> active tag. Once deactivated, the client can either poll again to
> reactivate the tag or power the adapter off to save power. These
> changes will not work until the Linux kernel commits submitted under
> the subject, "NFC: Add deactivate target functionality" are committed.
> Those commits can be viewed here:
>
> https://lists.01.org/pipermail/linux-nfc/2017-June/004415.html
>
> The commits are based on the commits submitted previously under the
> subject, "[PATCH 00/23] neard: Support TI Std & Pro tags, fixups, etc."
> which can be viewed here:
>
> https://lists.01.org/pipermail/linux-nfc/2017-June/004392.html
>
> For convenience, these commits are available in the 'submit/deactivate_tag-v1'
> branch of this repo on github:
>
> https://github.com/animalcreek/neard.git
>
> Mark Greer (4):
> adapter: Make adapter_start_poll() global
> adapter: Add call indicating whether constant poll is enabled
> tag: Add Tag deactivate support
> test: Add option to deactivate tag
All 4 patches applied, thanks.
Cheers,
Samuel.
^ permalink raw reply
* [PATCH v2 6/6] wl1251: Use request_firmware_prefer_user() for loading NVS calibration data
From: Pali Rohár @ 2017-11-09 23:38 UTC (permalink / raw)
To: Ming Lei, Luis R. Rodriguez, Greg Kroah-Hartman, Kalle Valo,
David Gnedt, Michal Kazior, Daniel Wagner, Tony Lindgren,
Sebastian Reichel, Pavel Machek, Ivaylo Dimitrov, Aaro Koskinen,
Grazvydas Ignotas
Cc: linux-kernel, linux-wireless, netdev, Pali Rohár
In-Reply-To: <1510270708-14377-1-git-send-email-pali.rohar@gmail.com>
NVS calibration data for wl1251 are model specific. Every one device with
wl1251 chip has different and calibrated in factory.
Not all wl1251 chips have own EEPROM where are calibration data stored. And
in that case there is no "standard" place. Every device has stored them on
different place (some in rootfs file, some in dedicated nand partition,
some in another proprietary structure).
Kernel wl1251 driver cannot support every one different storage decided by
device manufacture so it will use request_firmware_prefer_user() call for
loading NVS calibration data and userspace helper will be responsible to
prepare correct data.
In case userspace helper fails request_firmware_prefer_user() still try to
load data file directly from VFS as fallback mechanism.
On Nokia N900 device, which has wl1251 chip, NVS calibration data are
stored in CAL nand partition. CAL is proprietary Nokia key/value format for
nand devices.
With this patch it is finally possible to load correct model specific NVS
calibration data for Nokia N900.
Userspace tool for reading NVS calibration data on Nokia N900 is available
in git repository at: https://github.com/community-ssu/wl1251-cal
Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
---
drivers/net/wireless/ti/wl1251/Kconfig | 1 +
drivers/net/wireless/ti/wl1251/main.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ti/wl1251/Kconfig b/drivers/net/wireless/ti/wl1251/Kconfig
index 7142ccf..affe154 100644
--- a/drivers/net/wireless/ti/wl1251/Kconfig
+++ b/drivers/net/wireless/ti/wl1251/Kconfig
@@ -2,6 +2,7 @@ config WL1251
tristate "TI wl1251 driver support"
depends on MAC80211
select FW_LOADER
+ select FW_LOADER_USER_HELPER
select CRC7
---help---
This will enable TI wl1251 driver support. The drivers make
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
index 1f423be..e9d232c 100644
--- a/drivers/net/wireless/ti/wl1251/main.c
+++ b/drivers/net/wireless/ti/wl1251/main.c
@@ -108,7 +108,7 @@ static int wl1251_fetch_nvs(struct wl1251 *wl)
struct device *dev = wiphy_dev(wl->hw->wiphy);
int ret;
- ret = request_firmware(&fw, WL1251_NVS_NAME, dev);
+ ret = request_firmware_prefer_user(&fw, WL1251_NVS_NAME, dev);
if (ret < 0) {
wl1251_error("could not get nvs file: %d", ret);
--
1.7.9.5
^ permalink raw reply related
* RE: [PATCH] ath10k: Re-enable TXQs for all devices
From: Toke Høiland-Jørgensen @ 2017-11-10 0:10 UTC (permalink / raw)
To: Rajkumar Manoharan, make-wifi-fast@lists.bufferbloat.net,
linux-wireless@vger.kernel.org
In-Reply-To: <6112ae948ba2409da27709d01da567eb@NALASEXR01H.na.qualcomm.com>
Rajkumar Manoharan <rmanohar@qti.qualcomm.com> writes:
>> Commit 4ca1807815aa6801aaced7fdefa9edacc2521767 disables the use of the
>> mac80211 TXQs for some devices because of a theoretical throughput
>> regression. We have not seen this regression for a while now, so it shou=
ld be
>> safe to re-enable TXQs.
>>=20
>> Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen <toke@toke.dk>
>> ---
>> This has been in LEDE trunk for a couple of months now with good results.
>>
> Toke,
>=20=20
> Good to know that the performance drop is not seen with the chips that do=
es not
> have push-pull support. The issue was originally reported with ap152 + qc=
a988x
> by community [1]. Hope this combination is also considered in LEDE.
Ah, was that the original bug report? Thank you, I have not been able to
find that anywhere!
The issue that seems to point to has been fixed a while ago; I'll send
and updated patch with a better commit message (also forgot to cc the
ath10k list, I see).
-Toke
^ permalink raw reply
* Re: [Make-wifi-fast] [PATCH] ath10k: Re-enable TXQs for all devices
From: Dave Taht @ 2017-11-10 0:29 UTC (permalink / raw)
To: Toke Høiland-Jørgensen
Cc: Rajkumar Manoharan, make-wifi-fast@lists.bufferbloat.net,
linux-wireless@vger.kernel.org
In-Reply-To: <87k1yzq9i8.fsf@toke.dk>
On Thu, Nov 9, 2017 at 4:10 PM, Toke H=C3=B8iland-J=C3=B8rgensen <toke@toke=
.dk> wrote:
> Rajkumar Manoharan <rmanohar@qti.qualcomm.com> writes:
>
>>> Commit 4ca1807815aa6801aaced7fdefa9edacc2521767 disables the use of the
>>> mac80211 TXQs for some devices because of a theoretical throughput
>>> regression. We have not seen this regression for a while now, so it sho=
uld be
>>> safe to re-enable TXQs.
>>>
>>> Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen <toke@toke.dk>
>>> ---
>>> This has been in LEDE trunk for a couple of months now with good result=
s.
>>>
>> Toke,
>>
>> Good to know that the performance drop is not seen with the chips that d=
oes not
>> have push-pull support. The issue was originally reported with ap152 + q=
ca988x
>> by community [1]. Hope this combination is also considered in LEDE.
>
> Ah, was that the original bug report? Thank you, I have not been able to
> find that anywhere!
>
> The issue that seems to point to has been fixed a while ago; I'll send
> and updated patch with a better commit message (also forgot to cc the
> ath10k list, I see).
>
> -Toke
Hmm. I remember that thread. I thought we'd basically resolved that
issue (45% of the time spent in fq_codel_drop under udp flood),
back then, with eric adding the batch drop fix to fq_codel itself:
See commit: https://osdn.net/projects/android-x86/scm/git/kernel/commits/9d=
18562a227874289fda8ca5d117d8f503f1dcca
which fixed up the problem beautifully:
https://lists.bufferbloat.net/pipermail/make-wifi-fast/2016-May/000590.html
So if we've been carrying this darn patch for the ath10k vs something
that we'd actually fixed elsewhere in the stack, for over a year,
sigh.
--=20
Dave T=C3=A4ht
CEO, TekLibre, LLC
http://www.teklibre.com
Tel: 1-669-226-2619
^ permalink raw reply
* ath10k targaddrs issue
From: Ben Greear @ 2017-11-10 0:32 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org, erik.stromdahl, ath10k
While poking around in the firmware, I noticed what appears to be
an ath10k driver issue, which came in with this commit below.
commit 01d6fd6965eaf8d4b3aab681d30e77c53a834162
Author: Erik Stromdahl <erik.stromdahl@gmail.com>
Date: Wed Apr 26 12:17:55 2017 +0300
ath10k: various sdio related definitions
Debug masks for SDIO HIF layer.
Address definitions for SDIO/mbox based chipsets.
Augmented struct host_interest with more members.
Signed-off-by: Erik Stromdahl <erik.stromdahl@gmail.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
...
diff --git a/drivers/net/wireless/ath/ath10k/targaddrs.h b/drivers/net/wireless/ath/ath10k/targaddrs.h
index cbac9e42..8bded5d 100644
--- a/drivers/net/wireless/ath/ath10k/targaddrs.h
+++ b/drivers/net/wireless/ath/ath10k/targaddrs.h
@@ -205,6 +205,24 @@ struct host_interest {
*/
/* Bit 1 - unused */
u32 hi_fw_swap; /* 0x104 */
+
+ /* global arenas pointer address, used by host driver debug */
+ u32 hi_dynamic_mem_arenas_addr; /* 0x108 */
+
+ /* allocated bytes of DRAM use by allocated */
+ u32 hi_dynamic_mem_allocated; /* 0x10C */
+
+ /* remaining bytes of DRAM */
+ u32 hi_dynamic_mem_remaining; /* 0x110 */
+
+ /* memory track count, configured by host */
+ u32 hi_dynamic_mem_track_max; /* 0x114 */
+
+ /* minidump buffer */
+ u32 hi_minidump; /* 0x118 */
+
+ /* bdata's sig and key addr */
+ u32 hi_bd_sig_key; /* 0x11c */
} __packed;
Those variables above may be correct for some firmware, but they are not
correct for at least some versions of 10.4, which have this instead:
...
A_UINT32 hi_fw_swap; /* 0x104 */
/* host side need to support tx/rx data packet swap */
A_UINT32 hi_txrx_dataswap; /* 0x108 */
/* enable allocram statistics gathering (set to an integer, which
* is the number of tracking records that allocram will allocate).
*/
A_UINT32 hi_allocram_track_max; /* 0x108 */
}
I guess this may not be an issue as long as zero'd values are sent to the
10.4 nics, but it is confusing at best.
Eric, where did you get these values from?
Thanks,
Ben
--
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc http://www.candelatech.com
^ permalink raw reply related
* [PATCH v2] ath10k: Re-enable TXQs for all devices
From: Toke Høiland-Jørgensen @ 2017-11-10 0:48 UTC (permalink / raw)
To: make-wifi-fast, linux-wireless, ath10k; +Cc: Toke Høiland-Jørgensen
Commit 4ca1807815aa6801aaced7fdefa9edacc2521767 disables the use of the
mac80211 TXQs for some devices because of a theoretical throughput
regression. The original regression report[1] was related to fq_codel
qdisc drop performance, which was fixed in
9d18562a227874289fda8ca5d117d8f503f1dcca. Since then, we have not seen
the TXQ-related regression, so it should be safe to re-enable TXQs.
[1] http://lists.infradead.org/pipermail/ath10k/2016-April/007266.html
Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
---
This has been in LEDE trunk for a couple of months now with good
results.
Changes since v1:
- Update commit message to refer to original report and the fix for it.
- Add ath10k list to cc
drivers/net/wireless/ath/ath10k/mac.c | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 0a947eef348d..ca596ecd2d64 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -8329,15 +8329,6 @@ int ath10k_mac_register(struct ath10k *ar)
ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
}
- /* Current wake_tx_queue implementation imposes a significant
- * performance penalty in some setups. The tx scheduling code needs
- * more work anyway so disable the wake_tx_queue unless firmware
- * supports the pull-push mechanism.
- */
- if (!test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
- ar->running_fw->fw_file.fw_features))
- ar->ops->wake_tx_queue = NULL;
-
ret = ath10k_mac_init_rd(ar);
if (ret) {
ath10k_err(ar, "failed to derive regdom: %d\n", ret);
--
2.15.0
^ permalink raw reply related
* Re: [Make-wifi-fast] [PATCH] ath10k: Re-enable TXQs for all devices
From: Kalle Valo @ 2017-11-10 1:06 UTC (permalink / raw)
To: Dave Taht
Cc: Toke Høiland-Jørgensen, Rajkumar Manoharan,
make-wifi-fast@lists.bufferbloat.net,
linux-wireless@vger.kernel.org, ath10k
In-Reply-To: <CAA93jw6yw5=ALMdRaRrGU9uySmov9HwM-mr2npRbzsSxHgSAGw@mail.gmail.com>
Adding ath10k list to get this discussion to the list archive.
Dave Taht <dave.taht@gmail.com> writes:
> On Thu, Nov 9, 2017 at 4:10 PM, Toke H=C3=B8iland-J=C3=B8rgensen <toke@to=
ke.dk> wrote:
>> Rajkumar Manoharan <rmanohar@qti.qualcomm.com> writes:
>>
>>>> Commit 4ca1807815aa6801aaced7fdefa9edacc2521767 disables the use of the
>>>> mac80211 TXQs for some devices because of a theoretical throughput
>>>> regression. We have not seen this regression for a while now, so it sh=
ould be
>>>> safe to re-enable TXQs.
>>>>
>>>> Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen <toke@toke.dk>
>>>> ---
>>>> This has been in LEDE trunk for a couple of months now with good resul=
ts.
>>>>
>>> Toke,
>>>
>>> Good to know that the performance drop is not seen with the chips that =
does not
>>> have push-pull support. The issue was originally reported with ap152 + =
qca988x
>>> by community [1]. Hope this combination is also considered in LEDE.
>>
>> Ah, was that the original bug report? Thank you, I have not been able to
>> find that anywhere!
>>
>> The issue that seems to point to has been fixed a while ago; I'll send
>> and updated patch with a better commit message (also forgot to cc the
>> ath10k list, I see).
>>
>> -Toke
>
> Hmm. I remember that thread. I thought we'd basically resolved that
> issue (45% of the time spent in fq_codel_drop under udp flood),
> back then, with eric adding the batch drop fix to fq_codel itself:
>
> See commit: https://osdn.net/projects/android-x86/scm/git/kernel/commits/=
9d18562a227874289fda8ca5d117d8f503f1dcca
>
> which fixed up the problem beautifully:
>
> https://lists.bufferbloat.net/pipermail/make-wifi-fast/2016-May/000590.ht=
ml
>
> So if we've been carrying this darn patch for the ath10k vs something
> that we'd actually fixed elsewhere in the stack, for over a year,
> sigh.
--=20
Kalle Valo
^ permalink raw reply
* Re: [PATCH V2 1/9] qtnfmac: use per-band HT/VHT info from wireless device
From: Kalle Valo @ 2017-11-10 1:26 UTC (permalink / raw)
To: igor.mitsyanko.os
Cc: linux-wireless, sergey.matyukevich.os, vulyanov, johannes
In-Reply-To: <20171031010455.27772-2-igor.mitsyanko.os@quantenna.com>
igor.mitsyanko.os@quantenna.com writes:
> From: Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>
>
> HT/VHT capabilities must be reported per each band supported by a radio,
> not for all bands on a radio. Furthermore, driver better not assume
> any capabilities and just use whetever is reported by device itself.
>
> To support this, convert "get channels" command into "get band info"
> command. Difference is that it may also carry HT/VHT capabilities along
> with channels information.
>
> While at it, also add "num_bitrates" field to "get band info" command,
> for future use.
>
> Signed-off-by: Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>
[...]
> @@ -1241,13 +1273,32 @@ qtnf_cmd_resp_fill_channels_info(struct ieee80211_supported_band *band,
> chan->hw_value, chan->flags, chan->max_power,
> chan->max_reg_power);
> break;
> + case WLAN_EID_HT_CAPABILITY:
> + if (unlikely(tlv_dlen !=
> + sizeof(struct ieee80211_ht_cap))) {
> + pr_err("bad HTCAP TLV len %zu\n", tlv_dlen);
> + goto error_ret;
> + }
> +
> + qtnf_cmd_resp_band_fill_htcap(tlv->val, &band->ht_cap);
> + break;
> + case WLAN_EID_VHT_CAPABILITY:
> + if (unlikely(tlv_dlen !=
> + sizeof(struct ieee80211_vht_cap))) {
> + pr_err("bad VHTCAP TLV len %zu\n", tlv_dlen);
> + goto error_ret;
> + }
> +
> + qtnf_cmd_resp_band_fill_vhtcap(tlv->val,
> + &band->vht_cap);
> + break;
I'm having a hard time to believe that this in hotpath so the use of
unlikely() is not really making any sense to me. No need to resend
because of this, just looks strange and makes the code harder to read.
--
Kalle Valo
^ permalink raw reply
* Re: ath9k disconnects in 4.13 with reason=4 locally_generated=1
From: Daniel Drake @ 2017-11-10 1:30 UTC (permalink / raw)
To: Jouni Malinen
Cc: linux-wireless@vger.kernel.org, ath9k-devel,
Linux Upstreaming Team
In-Reply-To: <20171103095112.GA14915@jouni.qca.qualcomm.com>
On Fri, Nov 3, 2017 at 5:51 PM, Jouni Malinen <jouni@qca.qualcomm.com> wrote:
> On Fri, Nov 03, 2017 at 10:57:11AM +0800, Daniel Drake wrote:
>> Endless OS recently upgraded from Linux 4.11 to Linux 4.13, and we now
>> have a few reports of issues with ath9k wireless becoming unusable.
>>
>> In the logs we can see that it authenticates, associates and completes
>> the WPA 4 way handshake, before then being disconnected with:
>>
>> wlp2s0: CTRL-EVENT-DISCONNECTED bssid=74:26:ac:68:2f:c0 reason=4
>> locally_generated=1
>
> reason=4 is WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY. I'd expect the most
> likely source of this to be one of the mac80211 code paths in mlme.c
> where disconnection is triggered if the current AP become unreachable.
> Getting a debug log from mac80211 might help in figuring out what is
> causing this (there seem to be number of mlme_dbg() calls before most,
> but not necessarily all, places where
> WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY is used).
We got the log, it is coming from ieee80211_sta_work()
else if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
sdata_info(sdata,t
"Failed to send nullfunc to AP %pM after %dms,
disconnecting\n",
bssid, probe_wait_ms);
ieee80211_sta_connection_lost(sdata, bssid,
WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY, false);
I looked again at changes between 4.12 and 4.13 and still no idea how
4.13 causes this problem :(
Daniel
^ permalink raw reply
* RE: [Make-wifi-fast] [PATCH] ath10k: Re-enable TXQs for all devices
From: Rajkumar Manoharan @ 2017-11-10 1:49 UTC (permalink / raw)
To: Dave Taht, Toke Høiland-Jørgensen, Kalle Valo
Cc: make-wifi-fast@lists.bufferbloat.net,
linux-wireless@vger.kernel.org, ath10k@lists.infradead.org
In-Reply-To: <CAA93jw6yw5=ALMdRaRrGU9uySmov9HwM-mr2npRbzsSxHgSAGw@mail.gmail.com>
PiA+DQo+ID4gVGhlIGlzc3VlIHRoYXQgc2VlbXMgdG8gcG9pbnQgdG8gaGFzIGJlZW4gZml4ZWQg
YSB3aGlsZSBhZ287IEknbGwgc2VuZA0KPiA+IGFuZCB1cGRhdGVkIHBhdGNoIHdpdGggYSBiZXR0
ZXIgY29tbWl0IG1lc3NhZ2UgKGFsc28gZm9yZ290IHRvIGNjIHRoZQ0KPiA+IGF0aDEwayBsaXN0
LCBJIHNlZSkuDQo+ID4NCj4gPiAtVG9rZQ0KPiANCj4gSG1tLiBJIHJlbWVtYmVyIHRoYXQgdGhy
ZWFkLiBJIHRob3VnaHQgd2UnZCBiYXNpY2FsbHkgcmVzb2x2ZWQgdGhhdCBpc3N1ZSAoNDUlDQo+
IG9mIHRoZSB0aW1lIHNwZW50IGluIGZxX2NvZGVsX2Ryb3AgdW5kZXIgdWRwIGZsb29kKSwgYmFj
ayB0aGVuLCB3aXRoIGVyaWMgYWRkaW5nDQo+IHRoZSBiYXRjaCBkcm9wIGZpeCB0byBmcV9jb2Rl
bCBpdHNlbGY6DQo+IA0KPiBTZWUgY29tbWl0OiBodHRwczovL29zZG4ubmV0L3Byb2plY3RzL2Fu
ZHJvaWQtDQo+IHg4Ni9zY20vZ2l0L2tlcm5lbC9jb21taXRzLzlkMTg1NjJhMjI3ODc0Mjg5ZmRh
OGNhNWQxMTdkOGY1MDNmMWRjY2ENCj4gDQo+IHdoaWNoIGZpeGVkIHVwIHRoZSBwcm9ibGVtIGJl
YXV0aWZ1bGx5Og0KPiANCj4gaHR0cHM6Ly9saXN0cy5idWZmZXJibG9hdC5uZXQvcGlwZXJtYWls
L21ha2Utd2lmaS1mYXN0LzIwMTYtTWF5LzAwMDU5MC5odG1sDQo+IA0KPiBTbyBpZiB3ZSd2ZSBi
ZWVuIGNhcnJ5aW5nIHRoaXMgZGFybiBwYXRjaCBmb3IgdGhlIGF0aDEwayB2cyBzb21ldGhpbmcg
dGhhdCB3ZSdkDQo+IGFjdHVhbGx5IGZpeGVkIGVsc2V3aGVyZSBpbiB0aGUgc3RhY2ssIGZvciBv
dmVyIGEgeWVhciwgc2lnaC4NCj4NCkRhdmUsDQoNCkFncmVlLi4gRXZlbiBJIGFtIG5vdCBmYW4g
b2YgdGhhdCBwYXRjaCBpbiBhdGgxMGsuIElJUkMgTWljaGFsIHB1c2hlZCB0aGlzDQpjaGFuZ2Ug
YXMgdGVtcCBvbmUgYW5kIHBsYW5uZWQgdG8gcmV2ZXJ0IGl0IG9uY2UgaXQgaXMgZml4ZWQgaW4g
c3RhY2sgb3IgaW4gZHJpdmVyLg0KDQpJIHRob3VnaHQgRXJpYyBjaGFuZ2UgaW4gZnFfY29kZWwg
aXMgbWVhbnQgb25seSBmb3IgZmF0dHkgdWRwIGZsb3dzLiBGb3JnaXZlIG15IGlnbm9yYW5jZS4N
Cg0KLVJhamt1bWFyDQoNCg==
^ permalink raw reply
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